Haversine 公式还是 Vincenty 公式更适合计算距离?

Is the Haversine Formula or the Vincenty's Formula better for calculating distance?

对于计算两个 latitude/longitude 点之间的距离,Haversine 公式或 Vincenty 公式哪个更好?为什么?

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

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

Haversine 是一个更简单的计算,但它不提供 Vincenty 提供的高精度。

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

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

Haversine和Vincenty是解决不同问题的两种算法 问题。 Haversine 计算球体上的大圆距离 而 Vincenty 计算一个物体表面的最短(测地线)距离 旋转椭圆体。所以你的问题的答案可以被打破 分成两部分:

  1. 你想计算椭圆体上球体的距离吗?
  2. Haversine 或 Vincenty 在计算给定问题时的准确性如何?

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

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

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

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

Haversine 是精确的四舍五入除非点接近 反足。更好的公式在 Wikipedia article on great-circle distances.

Vincenty 通常精确到 0.1 毫米左右。但是,如果这些点是 几乎是对映的,算法无法收敛,误差为 更大。我给出了一个更好的算法来解决测地线问题 在 Algorithms for geodesics。另见 Wikipedia article on geodesics on an ellipsoid.

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

附录

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