计算两个坐标之间的距离,话不多说,搞起来!!!! 拿去用吧,不谢....
反余弦计算方式
- /**
- * 地球半径,单位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 = Math.toRadians(latitude1);
- double lat2 = Math.toRadians(latitude2);
- // 经度
- double lng1 = Math.toRadians(longitude1);
- double lng2 = Math.toRadians(longitude2);
- // 纬度之差
- double a = lat1 - lat2;
- // 经度之差
- double b = lng1 - lng2;
- // 计算两点距离的公式
- double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
- Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(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 * Math.PI / 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 * 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_RADIUS1;
- s = Math.round(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) {
- // 经纬度(角度)转弧度。弧度用作参数,以调用Math.cos和Math.sin
- double radiansAX = Math.toRadians(lng1); // A经弧度
- double radiansAY = Math.toRadians(lat1); // A纬弧度
- double radiansBX = Math.toRadians(lng2); // B经弧度
- double radiansBY = Math.toRadians(lat2); // B纬弧度
-
- // 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值
- double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX)
- + Math.sin(radiansAY) * Math.sin(radiansBY);
- // System.out.println("cos = " + cos); // 值域[-1,1]
- double acos = Math.acos(cos); // 反余弦值
- // System.out.println("acos = " + acos); // 值域[0,π]
- // System.out.println("∠AOB = " + Math.toDegrees(acos)); // 球心角 值域[0,180]
- return EARTH_RADIUS11 * acos; // 最终结果
- }
利用第三方jar包计算
- <!--用于计算两点之间的距离-->
- <dependency>
- <groupId>org.gavaghan</groupId>
- <artifactId>geodesy</artifactId>
- <version>1.1.3</version>
- </dependency>
- /**
- * 计算两个经纬度之间的距离
- * @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 geoCurve.getEllipsoidalDistance();
- }
- 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, Ellipsoid.Sphere);
- double meter2 = getDistanceMeter(source, target, Ellipsoid.WGS84);
-
- System.out.println("Sphere坐标系计算结果:"+meter1 + "米");
- System.out.println("WGS84坐标系计算结果:"+meter2 + "米");
- }
Sphere坐标系计算结果:15633.361234640292米
WGS84坐标系计算结果:15632.349374386973米
我通过这几个方式测试,根据结果反馈,感觉方式四中Sphere坐标系计算结果相对来说偏差小一点.