计算两个坐标经纬度之间的距离(5种方式)

时间:2025-03-10 07:04:04

目录

概述

方式一

方式二

方式三

方式四

引入第三方依赖:

2.代码:

3.执行操作:

4.执行结果:

建议


概述

计算两个坐标之间的距离,话不多说,搞起来!!!!   拿去用吧,不谢....

方式一

反余弦计算方式

/**
     * 地球半径,单位m
     */
    private static final double EARTH_RADIUS = 6378137;

    /**
     * 根据经纬度,计算两点间的距离
     *
     * @param longitude1 第一个点的经度
     * @param latitude1  第一个点的纬度
     * @param longitude2 第二个点的经度
     * @param latitude2  第二个点的纬度
     * @return 返回距离,单位m
     */
    public static double getDistance1(double longitude1, double latitude1, double longitude2, double latitude2) {
        // 纬度
        double lat1 = (latitude1);
        double lat2 = (latitude2);
        // 经度
        double lng1 = (longitude1);
        double lng2 = (longitude2);
        // 纬度之差
        double a = lat1 - lat2;
        // 经度之差
        double b = lng1 - lng2;
        // 计算两点距离的公式
        double s = 2 * ((((a / 2), 2) +
                (lat1) * (lat2) * ((b / 2), 2)));
        // 弧长乘地球半径, 返回单位: 米
        s =  s * EARTH_RADIUS;
        return s;
    }

方式二

基于googleMap中的算法得到两经纬度之间的距离,计算精度与谷歌地图的距离精度差不多。

/**
     * 默认地球半径,赤道半径(单位m)
     */
    private static double EARTH_RADIUS1 = 6371000;

    /**
     * 转化为弧度(rad)
     */
    private static double rad(double d)
    {
        return d *  / 180.0;
    }
    /**
     * @param lon1 第一点的精度
     * @param lat1 第一点的纬度
     * @param lon2 第二点的精度
     * @param lat2 第二点的纬度
     * @return 返回的距离,单位m
     * */
    public static double getDistance2(double lon1,double lat1,double lon2, double lat2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lon1) - rad(lon2);
        double s = 2 * ((((a / 2), 2) + (radLat1) * (radLat2) * ((b / 2), 2)));
        s = s * EARTH_RADIUS1;
        s = (s * 10000) / 10000;
        return s;
    }

方式三

反余弦计算方式

private static final double EARTH_RADIUS11 = 6371000; // 平均半径,单位:m;不是赤道半径。赤道为6378左右
    public static double getDistance3(Double lat1,Double lng1,Double lat2,Double lng2) {
        // 经纬度(角度)转弧度。弧度用作参数,以调用和
        double radiansAX = (lng1); // A经弧度
        double radiansAY = (lat1); // A纬弧度
        double radiansBX = (lng2); // B经弧度
        double radiansBY = (lat2); // B纬弧度

        // 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值
        double cos = (radiansAY) * (radiansBY) * (radiansAX - radiansBX)
                + (radiansAY) * (radiansBY);
//        ("cos = " + cos); // 值域[-1,1]
        double acos = (cos); // 反余弦值
//        ("acos = " + acos); // 值域[0,π]
//        ("∠AOB = " + (acos)); // 球心角 值域[0,180]
        return EARTH_RADIUS11 * acos; // 最终结果
    }

方式四

利用第三方jar包计算

引入第三方依赖:

<!--用于计算两点之间的距离-->
        <dependency>
            <groupId></groupId>
            <artifactId>geodesy</artifactId>
            <version>1.1.3</version>
        </dependency>

2.代码:

/**
     * 计算两个经纬度之间的距离
     * @param gpsFrom 第一个经纬度
     * @param gpsTo 第二个经纬度
     * @param ellipsoid 计算方式
     * @return 返回的距离,单位m
     */
    public static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid)
    {
        //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);

        return ();
    }

3.执行操作:

public static void main(String[] args) {
        double lon1 = 39.111111;
        double lat1 = 116.111111;
        double lon2 = 39.222222;
        double lat2 = 116.222222;

        GlobalCoordinates source = new GlobalCoordinates(lon1, lat1);
        GlobalCoordinates target = new GlobalCoordinates(lon2, lat2);

        double meter1 = getDistanceMeter(source, target, );
        double meter2 = getDistanceMeter(source, target, Ellipsoid.WGS84);

        ("Sphere坐标系计算结果:"+meter1 + "米");
        ("WGS84坐标系计算结果:"+meter2 + "米");
    }

4.执行结果:

Sphere坐标系计算结果:15633.361234640292米
WGS84坐标系计算结果:15632.349374386973米

建议

我通过这几个方式测试,根据结果反馈,感觉方式四中Sphere坐标系计算结果相对来说偏差小一点.

期待大家的三连击,你们的支持是我的动力。加油,猿友们!!