JAVA相邻经纬度计算距离

本文介绍了一个实用的方法,用于根据两点的经纬度坐标计算它们之间的地理距离。该方法使用地球平均半径并应用三角函数来计算弧度,最终得出两地点间的大致直线距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  /**   
     * Created by yuliang on 2015/3/20.   
     */    
    public class LocationUtils {    
        private static double EARTH_RADIUS = 6378.137;    
        
        private static double rad(double d) {    
            return d * Math.PI / 180.0;    
        }    
        
        /**   
         * 通过经纬度获取距离(单位:米)   
         * @param lat1   
         * @param lng1   
         * @param lat2   
         * @param lng2   
         * @return   
         */    
        public static double getDistance(double lat1, double lng1, double lat2,    
                                         double lng2) {    
            double radLat1 = rad(lat1);    
            double radLat2 = rad(lat2);    
            double a = radLat1 - radLat2;    
            double b = rad(lng1) - rad(lng2);    
            double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)    
                    + Math.cos(radLat1) * Math.cos(radLat2)    
                    * Math.pow(Math.sin(b / 2), 2)));    
            s = s * EARTH_RADIUS;    
            s = Math.round(s * 10000d) / 10000d;    
            s = s*1000;    
            return s;    
        }    
    }    
 

对连续经纬度轨迹进行降噪处理一般需要进行以下步骤: 1. 选择合适的数据结构:连续经纬度轨迹可以通过经纬度坐标点的集合来表示,可以使用数组或链表等数据结构来存储。 2. 计算相邻坐标点之间的距离:可以使用Haversine公式等算法来计算两个经纬度坐标点之间的距离。 3. 选择合适的降噪算法:常见的降噪算法包括Douglas-Peucker算法、Ramer-Douglas-Peucker算法、Visvalingam-Whyatt算法等。这些算法可以根据距离阈值或点数阈值等参数来实现降噪。 4. 实现降噪算法:降噪算法可以通过递归或迭代等方式实现,具体实现方式需要根据选择的算法来确定。 下面是一个简单的Java实现示例,使用Douglas-Peucker算法对连续经纬度轨迹进行降噪: ```java public class TrajectoryDenoise { // Douglas-Peucker算法实现降噪 public static List<Point> douglasPeucker(List<Point> points, double threshold) { if (points == null || points.size() < 3) { return points; } int index = 0; double maxDistance = 0; for (int i = 1; i < points.size() - 1; i++) { double distance = distance(points.get(i), points.get(0), points.get(points.size() - 1)); if (distance > maxDistance) { index = i; maxDistance = distance; } } List<Point> result = new ArrayList<>(); if (maxDistance > threshold) { List<Point> leftPoints = points.subList(0, index + 1); List<Point> rightPoints = points.subList(index, points.size()); List<Point> leftResult = douglasPeucker(leftPoints, threshold); List<Point> rightResult = douglasPeucker(rightPoints, threshold); result.addAll(leftResult.subList(0, leftResult.size() - 1)); result.addAll(rightResult); } else { result.add(points.get(0)); result.add(points.get(points.size() - 1)); } return result; } // 计算点到线段的距离 private static double distance(Point point, Point start, Point end) { double x = point.longitude; double y = point.latitude; double x1 = start.longitude; double y1 = start.latitude; double x2 = end.longitude; double y2 = end.latitude; double distance = 0; double k = (y2 - y1) / (x2 - x1); double b = y1 - k * x1; if (k == Double.POSITIVE_INFINITY || k == Double.NEGATIVE_INFINITY) { distance = Math.abs(x - x1); } else { distance = Math.abs(k * x - y + b) / Math.sqrt(k * k + 1); } return distance; } static class Point { public double longitude; public double latitude; public Point(double longitude, double latitude) { this.longitude = longitude; this.latitude = latitude; } } } ``` 这个示例实现了Douglas-Peucker算法的降噪功能,其中Point类表示一个经纬度坐标点,distance方法用于计算点到线段的距离,douglasPeucker方法用于实现Douglas-Peucker算法的递归过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值