java - 计算两个地理位置之间的距离

标签 java geolocation distance

我正在尝试计算两个地理位置之间的距离。我遇到的问题如下:我尝试使用如下库: Geocalc 和半正矢公式,如下所示:

public static final double RKilometers = 6371;

public static double calculationByDistance(double lat1, double lon1, double lat2, double lon2) {
    double dLat = Math.toRadians(lat2 - lat1);
    double dLon = Math.toRadians(lon2 - lon1);
    lat1 = Math.toRadians(lat1);
    lat2 = Math.toRadians(lat2);

    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.asin(Math.sqrt(a));
    return RKilometers * c;
}

但是我对所有这些选项都得到相同的错误值。对于短距离,它可以完美工作,但对于长距离,则不然。

这是我所做的测试:

//distance between Barrow Island(Australia) and Tavatave(Madagascar)
assertEquals(calculationByDistance(20.82, 115.4, 18.15, 49.4), 6885, 20);
//get 6875.965169284442

//here is the problem
//distance between Rio Grande and Glasgow
assertEquals(calculationByDistance(32.05, 52.11, 55.83, 4.25), 10744, 20);
//get 4522.502442756569

有人知道我的错误在哪里吗?谢谢!

最佳答案

我很久以前就有这段代码,我什至不记得是我自己写的还是从别人那里得到的。据我记得它给出了一个相当不错的估计,你可以尝试一下,看看它是否适合你。 (欢迎修改)

public static double distFrom(double lat1, double lng1, double lat2, double lng2) {
        double earthRadius = 3958.75;  //this is in miles I believe
        double dLat = Math.toRadians(lat2-lat1);
        double dLng = Math.toRadians(lng2-lng1);
        double sindLat = Math.sin(dLat / 2);
        double sindLng = Math.sin(dLng / 2);
        double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
                * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        double dist = earthRadius * c;

        return dist;
}

关于java - 计算两个地理位置之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30842011/

相关文章:

java - 无法在基本类型 double 上调用 set Double(Double)

windows-phone-8 - 使用 Windows Phone 8 每 5 分钟间隔在后台跟踪一次地理位置

r - 在 LatLong 中工作时,gridDistance 是否计算大地距离? (R 中的栅格包)

php - MySQL PHP邮政编码比较具体距离

python - 如何计算一组线和一个点之间的(最小)距离?

java - 如何在 Java 中创建一个没有重复项的简单随机数生成器,并将结果存储在数组中以打印给最终用户?

Java-是否有类似于字符串的 hasNextInt() 或 hasNextDouble() 的方法?我想检查用户输入是否只是文本而不是数字

javascript - 如何在 javascript 中将千米转换为经度纬度

javascript - Titanium Mobile 在 iOS 上没有获得正确的准确性

java - 使用 maven 配置 swagger-ui