计算方式

使用开源项目geodesy发行的jar包进行距离计算,十分便捷;
笔者将计算结果与某地图上两点测距结果进行比较,误差很小,所以计算结果也很准确。

开源项目:https://github.com/mgavaghan/geodesy

发行maven pom依赖:

1
2
3
4
5
<dependency>
<groupId>org.gavaghan</groupId>
<artifactId>geodesy</artifactId>
<version>1.1.3</version>
</dependency>

代码

加载maven依赖后,新建以下Utils方法简单封装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
* ClassName: GpsDistanceUtils
* CreateUser: vayne
* CreateTime: 2021/7/29
*/
public class GpsDistanceUtils {

/**
* 根据Wgs84坐标/经纬度计算两目标位置的直线距离
*
* @param lonA 目标A经度
* @param latA 目标A纬度
* @param lonB 目标B经度
* @param latB 目标B纬度
* @param newScale 结果保留小数位
* @return 距离 (m)
*/
public static double getDistance(Double lonA, Double latA, Double lonB, Double latB,int newScale) {
GlobalCoordinates source = new GlobalCoordinates(latA, lonA);
GlobalCoordinates target = new GlobalCoordinates(latB, lonB);
GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target);
double distance = geoCurve.getEllipsoidalDistance();
BigDecimal distanceBig = new BigDecimal(distance).setScale(newScale, RoundingMode.UP);
return distanceBig.doubleValue();
}

}

使用Utils方法计算距离:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void test() {

// 计算距离
// 目标1 和平饭店(121.495787,31.244966)
// 目标2 东方明珠塔(121.506379,31.245414)
double distance = GpsDistanceUtils.getDistance(121.495787,
31.244966,
121.506379,
31.245414,2);
System.out.println("目标直线距离(m):" + distance);

}

输出:

1
目标直线距离(m):1008.18

结语

此开源项目工具包使用十分便捷且结果可靠;
读者如有更好的方法,欢迎分享。