经纬度计算距离

 /**
     * 精确计算
     * 基于椭球体形状的大地线段计算,由于涉及更复杂的数学计算和椭球体参数,它的计算速度可能相对较慢
     * 原理:下面补充
     */
    private static long getDistanceMBase(double longitudeFrom, double latitudeFrom, double longitudeTo, double latitudeTo) {
        GlobalCoordinates source = new GlobalCoordinates(latitudeFrom, longitudeFrom);
        GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo);
        try {
            return (long) new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target).getEllipsoidalDistance();
        } catch (Exception e) {
            return -1;
        }
    }

    /**
     * 近似计算: 如果只需要大致的距离估计而不是精确值,可以考虑使用一些近似算法,如快速距离估计法,以减少计算复杂度
     *
     * @return 两者相距的距离,计算的值 不是精确的值,这样计算的值 相同的几率很大
     */
    public static long approximateDistance(double lat1, double lon1, double lat2, double lon2) {
        double latDistance = Math.abs(lat1 - lat2);
        double lonDistance = Math.abs(lon1 - lon2);

        // 使用勾股定理近似计算距离
        return (long) Math.sqrt(latDistance * latDistance + lonDistance * lonDistance);
    }

    private static final double EARTH_RADIUS = 6371.0; // 地球半径,单位为公里

    /**
     * 使用 Haversine 公式计算距离
     *  Haversine 公式是一个基于球体近似的计算方法,适用于小范围的距离计算。它的计算速度较快,适用于需要快速计算距离的情况,但它并不考虑地球的椭球体形状,可能在极端情况下精度较低
     */
    public static long haversineDistance(double lat1, double lon1, double lat2, double lon2) {
        double latRad1 = Math.toRadians(lat1);
        double lonRad1 = Math.toRadians(lon1);
        double latRad2 = Math.toRadians(lat2);
        double lonRad2 = Math.toRadians(lon2);

        double dLat = latRad2 - latRad1;
        double dLon = lonRad2 - lonRad1;

        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                Math.cos(latRad1) * Math.cos(latRad2) *
                        Math.sin(dLon / 2) * Math.sin(dLon / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        return (long)(EARTH_RADIUS * c);
    }

GeodeticCalculator 原理

这是一种计算两个地理坐标之间的大地线段的方法。它通常用于测量两个点之间的距离、方向和切线(azimuth、bearing)等信息,可以在地球表面上考虑椭球体的形状,提供更精确的结果。

这个方法的原理涉及到大地测量学和大地线段计算,以下是一个简要的解释:

  1. 大地测量学: 大地测量学是研究地球上的大地线段(大地弧)和测地线段(测地弧)的分支,涉及地球的曲率和椭球体的形状。大地线段是连接地球表面上的两点的弯曲路径,而测地线段是通过大地线段测量的实际线段。

  2. 大地线段计算: GeodeticCalculator().calculateGeodeticCurve 方法通过考虑地球的椭球体形状,使用大地线段计算公式,计算两个地理坐标之间的大地线段的信息。这包括大地线段的长度、方向(azimuth)、切线(bearing)等。

  3. 椭球体模型: 地球并不是完全的球体,而是一个近似于椭球体的形状。在计算大地线段时,通常会使用一定的椭球体模型,例如 WGS84 椭球体模型,以便更准确地考虑地球的形状。

  4. 计算方法: 具体的计算方法会涉及椭球体的参数、地理坐标的经纬度、大地线段的起始点和终点等信息。计算中会使用椭球体参数计算大地线段的长度、方向和切线等信息,从而得出所需的测量结果。

总之,GeodeticCalculator().calculateGeodeticCurve 方法是基于大地测量学和大地线段计算原理,通过考虑地球的椭球体形状,计算地理坐标之间的距离、方向和切线等信息。这种方法可以在地球表面上提供更准确的测量结果。具体实现可能涉及复杂的数学计算和地理坐标系统的转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值