语言不可知论者 - 哈弗斯公式或文森蒂公式更适合计算距离?



哪个更适合计算两个纬度/经度点之间的距离,哈弗辛公式和文森蒂公式?为什么?

距离显然是在地球上计算的。WGS84 与 GCJ02 坐标是否会影响计算或距离(文森特公式考虑了 WGS84 轴)?

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

Haversine和Vincenty是两种用于解决不同问题的算法问题。 哈弗森计算球体上的大圆距离而文森蒂计算革命的椭球体。 所以你的问题的答案可能会被打破分为两部分:

  1. 是否要计算椭球体上球体上的距离?
  2. Haversine或Vincenty在计算给定问题时有多准确?

对于地面应用,旋转椭球体是合理的近似于"平均海平面";误差± 100 m。 这这个椭球体的扁平化很小,大约是1/300,所以可以近似于一个球体(例如,体积相等)。

大圆距离与测地线距离相差多达 0.5%。 在一些应用,例如,从开普敦到开罗的距离是多少?这个错误可以忽略不计。 在其他应用中,例如,确定海洋边界,它太大了(在 1 的距离内是 5 m公里)。 通常,使用测地线距离更安全。

如果您对旅行距离感兴趣(乘汽车、轮船或飞机),所走的道路有很多限制,也不是伟大的圆或测地线距离,用于测量最短路径的长度在理想的表面上,将是合适的。

关于算法是否准确的问题:

哈弗辛精确到四舍五入,除非点接近对跖。 更好的公式在维基百科关于大圆距离的文章。

文森蒂通常精确到0.1毫米左右。 但是,如果点是几乎对足,算法无法收敛,误差为大得多。 我给出了更好的算法来解决测地线问题在测地线算法中。 另请参阅维基百科关于椭球体测地线的文章。

求解测地线

问题比求解测地线问题慢大圆。 但它仍然非常快(每次计算约 1 μs),所以这不应该成为喜欢大圆距离的理由。

附录

这是实现我的算法的Java包用于查找测地线距离。 与文森蒂的方法不同,这是准确的到处四舍五入和收敛。

Haversine是一种更简单的计算,但它没有提供Vincenty提供的高精度。

Vincenty 更准确,但也计算量更大,因此执行速度会更慢并增加电池使用量。

与任何"更好"一样,取决于您的特定应用程序。 对于您的应用程序,Vincenty 可能是比 Haversine "更好"的选择,但对于不同的应用程序,Haversine 可能是更好的选择。 您必须查看用例的详细信息,并根据您在那里找到的内容做出决定。

最新更新