哈弗辛公式和文森蒂公式哪个更适合用于计算距离?

35

计算两个经纬度点之间的距离,使用哈弗赛因公式(Haversine Formula)还是文森蒂公式(Vincenty's Formula)更好?为什么?

显然,这个距离是在地球上计算的。WGS84和GCJ02坐标系是否会影响计算或距离(Vincenty公式考虑了WGS84轴)?

例如,在Android中,Google Map Utils使用Haversine公式,但android.Location对象(Location.distanceBetween())使用Vincenty公式。

2个回答

66
Haversine和Vincenty是解决不同问题的两种算法。 Haversine计算球体上的大圆距离,而Vincenty计算旋转椭球面上的最短(测地线)距离。 因此,您的问题的答案可以分为两部分:
1.您想在球体上还是在椭球面上计算距离?
2.Haversine或Vincenty在计算给定问题时有多准确?
对于地球应用,旋转椭球体是“平均海平面”的合理近似值;误差为±100 m。该椭球的扁率很小,约为1/300,因此可以通过一个球体(例如等体积的球体)进行近似。
大圆距离与测地距离最多相差0.5%。 在某些应用中,例如从开普敦到开罗的距离是多少?这个误差可以被忽略。 在其他应用中,例如确定海上边界,它太大了(在1 km的距离内为5 m)。 一般来说,使用测地距离更安全。
如果您对行驶距离(汽车、船或飞机)感兴趣,路径上有很多限制,既不是大圆弧距离也不是测量理想表面上最短路径长度的测地线距离是合适的。
关于算法是否准确的问题:
Haversine精度高,除非两点几乎是反极点。更好的公式在维基百科上的大圆距离文章中给出。
Vincenty通常精度约为0.1毫米。但是,如果两点几乎是反极点,则算法无法收敛,误差会更大。我提供了一种更好的解决测地线问题的算法测地线算法。另请参见椭球上测地线的维基百科文章
解决测地问题比解决大圆问题慢。但它仍然非常快(每次计算约1微秒),因此这不应该成为首选大圆距离的原因。 补充 这里是实现我的测地距离算法的Java包。与Vincenty的方法不同,这个方法精确到舍入并且在任何地方都收敛。

难道不更准确地说,Vincenty公式有时在近对踵点上无法收敛,否则只需要为这样的点对进行大量迭代即可吗?为了展示Haversine公式中的计算不准确性,我编写了维基百科页面上改进的大圆计算(基于Vincenty算法的简化版本!)和单精度的Haversine公式。通过100M个测试用例,最坏情况下的误差是4.44148 km @ (-64.492126, -157.413849) (64.452232, 22.589592) [Hav] 和 0.00392 km @ (-5.779476, 166.661758) (0.646194, -44.298119) [Impr]。 - njuffa
1
Vincenty方法在近对地点的问题不在于收敛速度慢,而是在这种情况下迭代解法不稳定(如果您从接近解的结果开始,则每次迭代都会使您离解更远)。请注意,您的“改进”方法给出的最大误差为0.00393公里,接近单精度算术的舍入限制;实际上需要双精度。 - cffk
我完全意识到改进的方法可以提供精确到单精度的大圆距离,但是由于评论长度限制,没有足够的空间明确指出这一点。我主要想强调维基百科改进公式有多么好(感谢指引),而且几乎与经典的Haversine公式计算成本相当:似乎应该始终使用改进的公式,而不是Haversine公式。任何类型的距离计算是否需要双精度似乎取决于每个用例的精度要求。 - njuffa
@cffk:你的回答看起来非常出色,值得出现在https://dev59.com/enRC5IYBdhLWcg3wP-dh中,可能包括实现你推荐的距离算法的代码。 - Peter O.
1
值得注意的是,在http://geographiclib.sourceforge.net/index.html下还有C#、JavaScript和Python的库/包装器。 - Stonetip

25

Haversine 是一种计算方法,但它并不像 Vincenty 提供高精度。

Vincenty 更加精确,但计算量较大,因此运行速度较慢且会增加电池的使用量。

对于任何事物来说,“更好”的选择都取决于您的特定应用。对于您的应用而言,Vincenty 可能比 Haversine 更为“优越”,但对于另一个应用而言,Haversine 可能更为合适。您需要考虑您的应用情况,然后根据您发现的情况做出决策。


2
我的理解是,在大多数应用程序中,哈弗辛公式(假设地球是球形)对于距离在几百英里以内的点提供足够的精度,而文森蒂公式(基于椭球地球)则对于任何一对点提供足够的精度,特别是对于近似相对的点。 - njuffa
1
@njuffa Haversine公式即使对于附近的点也可能返回不准确的结果,相对误差高达0.5%。例如,对于点(48.857461,2.291029)和(48.857461,2.304698),Haversine公式返回1000.0米,而Vincenty公式返回1003.036米。 - fdermishin
2
Vincenty公式不应该使用于近似对踵点,因为它无法收敛。 - fdermishin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接