2025年3月21日 星期五 甲辰(龙)年 月廿 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Java

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

时间:05-24来源:作者:点击数:34

概述

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

方式一

反余弦计算方式

  • /**
  • * 地球半径,单位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(α12)+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包计算

1.POM引入第三方依赖:

  • <!--用于计算两点之间的距离-->
  • <dependency>
  • <groupId>org.gavaghan</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 geoCurve.getEllipsoidalDistance();
  • }

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, Ellipsoid.Sphere);
  • double meter2 = getDistanceMeter(source, target, Ellipsoid.WGS84);
  • System.out.println("Sphere坐标系计算结果:"+meter1 + "米");
  • System.out.println("WGS84坐标系计算结果:"+meter2 + "米");
  • }

4.执行结果:

Sphere坐标系计算结果:15633.361234640292米

WGS84坐标系计算结果:15632.349374386973米

建议

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门