在计算两个纬度/经度点之间的距离时,哪一个更好,是Haversine公式还是Vincenty公式?为什么?
这个距离显然是在地球上计算出来的。WGS84和GCJ02坐标是否会影响计算或距离(文森西的公式将WGS84轴考虑在内)?
例如,在安卓系统中,Google Map Utils使用哈维正弦公式,但android.Location
对象(Location.distanceBetween()
)使用文森西公式。
发布于 2016-07-07 22:51:45
发布于 2016-07-30 00:01:10
Haversine和Vincenty是解决不同问题的两种算法。Haversine计算球体上的大圆距离,而Vincenty计算旋转椭球曲面上的最短(测地线)距离。所以你的问题的答案可以分为两个部分:
对于陆地应用,旋转椭球是“平均海平面”的合理近似值;误差为±100米。这个椭球体的扁平度很小,约为1/300,因此可以近似为一个球体(例如,等体积的球体)。
大圆距离与测地线距离相差高达0.5%。在某些应用中,例如从好望角到开罗的距离是多少?,这个误差可以忽略不计。在其他应用中,例如,确定海洋边界,它太大了(在1公里的距离上是5米)。通常,使用测地线距离更安全。
如果您感兴趣的是行驶的距离(汽车、船或飞机),那么所采用的路径有许多约束,无论是大圆还是测地距离,都不适合测量理想曲面上最短路径的长度。
关于算法是否准确的问题:
哈弗正弦是精确的四舍五入,除非这些点几乎是相反的。Wikipedia article on great-circle distances中给出了更好的公式。
Vincenty通常精确到0.1毫米。然而,如果这些点几乎是对极的,则算法不能收敛,并且误差要大得多。针对Algorithms for geodesics中的测地问题,给出了一种较好的求解算法。另请参阅Wikipedia article on geodesics on an ellipsoid。
解决测地线问题比解决大圆问题要慢。但是它仍然非常快(每次计算大约1μ),所以这不应该成为选择大圆距离的理由。
ADENDUM
Here是一个Java包,它实现了我的测地距离算法。与Vincenty的方法不同,这是精确的舍入,并且在任何地方都收敛。
https://stackoverflow.com/questions/38248046
复制相似问题