当您知道 java 中的经度和纬度时,以米为单位计算距离

2022-08-31 12:48:46

可能的重复:
在Java中使用纬度/经度值

重复:

我需要计算两个坐标给出的两点之间的距离。我正在做的项目是一个Java项目,所以Java代码会很棒,但伪代码也可以给出,然后我可以自己实现它:)

您可能知道,有三种方法可以表示坐标:

  • 度:分:秒 (49°30'00“N, 123°30'00”W)
  • 度数:十进制分钟 (49°30.0', -123°30.0'), (49d30.0m,-123d30.0')
  • 十进制度(49.5000°,-123.5000°),通常有4-6个十进制数。

这是我坐标的第三种方式,因此此值的代码将优先:)


答案 1

基于另一个关于堆栈溢出的问题,我得到了这个代码。这以米为单位计算结果,而不是以英里:)

 public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
    double earthRadius = 6371000; //meters
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
               Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
               Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    float dist = (float) (earthRadius * c);

    return dist;
    }

答案 2

您可以使用Java大地测量库进行GPS,它使用Vincenty公式,该公式考虑了地球表面曲率。

实现过程如下:

import org.gavaghan.geodesy.*;

...

GeodeticCalculator geoCalc = new GeodeticCalculator();

Ellipsoid reference = Ellipsoid.WGS84;  

GlobalPosition pointA = new GlobalPosition(latitude, longitude, 0.0); // Point A

GlobalPosition userPos = new GlobalPosition(userLat, userLon, 0.0); // Point B

double distance = geoCalc.calculateGeodeticCurve(reference, userPos, pointA).getEllipsoidalDistance(); // Distance between Point A and Point B

生成的距离以米为单位。


推荐