0

我有在印度运行良好的代码。此代码计算两个位置之间的大致距离。我使用了下面提到的代码。但是如果我在美国运行同样的代码。然后为每个位置更新计算不同的距离。我将源和目的地的纬度和经度传递给了这个函数。该应用程序在印度运行良好。但不适用于美国。在同一个地方它显示不同的计算。在此先感谢。任何帮助将不胜感激。

public static double distanceKm(double lat1, double lon1, double lat2, double lon2) {
        double lat1Rad = Math.toRadians(lat1);
        double lat2Rad = Math.toRadians(lat2);
        double deltaLonRad = Math.toRadians(lon2 - lon1);
        return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad)
                * Math.cos(deltaLonRad))
                * 6371;
    }  
4

2 回答 2

0

该公式为大圆公式。
众所周知,它不适用于小距离。
原因是这部分:

Math.cos(deltaRad).  

这是一个非常小的值的余弦,它在数字上是“病态的”:它们在计算机上不能很好地工作。(现在双精度的效果不太明显)因此对于小距离,haversine 公式更适合。

如果您仍然对半正弦距离公式有疑问,那么显然您的输入数据就是问题所在。(例如,如果从 GPS 读取而没有适当的预过滤)

尽管使用更大的圆形变体,但您的实现提供正确结果的机会很高。您声称的“正确距离”错误的可能性很高。

于 2013-11-13T18:17:12.273 回答
-1

我正在使用一个非常相似的公式,并且从未有任何抱怨。我的公式的主要区别是 deltaLonRad,我计算如下:

double deltaLonRad = Math.toRadians(lon2) - Math.toRadians(lon1);
于 2013-11-13T14:08:33.777 回答