首页 > 解决方案 > GIS - 计算两点之间的距离时得到奇怪的结果

问题描述

我使用算法(参见:计算两点之间的距离)来计算两点之间的距离。但它得到错误的结果,请参阅 Java 代码:

/**
 * group1:set latitude to 89
 */
// set longitude1 = 0, longitude2 = 1
System.out.println(distance(89, 89, 0, 1, 0 , 0)); // 1941.0            result1

// set longitude1 = 0, longitude2 = 2
System.out.println(distance(89, 89, 0, 2, 0 , 0)); // 3881.0            result2

// set longitude1 = 0, longitude2 = 179
System.out.println(distance(89, 89, 0, 179, 0 , 0)); // 222381.0        result3

// set longitude1 = 0, longitude2 = 180
System.out.println(distance(89, 89, 0, 180, 0 , 0)); // 222390.0        result4

/**
 * group2:set latitude to 0
 */
// set longitude1 = 0, longitude2 = 1
System.out.println(distance(0, 0, 0, 1, 0 , 0)); // 111195.0            result5

// set longitude1 = 0, longitude2 = 2
System.out.println(distance(0, 0, 0, 2, 0 , 0)); // 222390.0            result6

// set longitude1 = 0, longitude2 = 179
System.out.println(distance(0, 0, 0, 179, 0 , 0)); // 19903892          result7

// set longitude1 = 0, longitude2 = 180
System.out.println(distance(0, 0, 0, 180, 0 , 0)); // 20015087          result8

在组 1 中:

a = 结果2 - 结果1 = 1940

b = 结果4 - 结果3 = 9

在组 2 中:

c = 结果6 - 结果5 = 111195

d = 结果8 - 结果7 = 111195

这很奇怪。c = d, group2 是对的,但是a ≠ b, group1 是错误的。

我该如何解决这个问题?是否有其他更高精度的算法来计算两个坐标点之间的距离

标签: javagisdistancelatitude-longitude

解决方案


好吧,结果是近似值 - 如果您想要更高的精度,您需要使用球体计算,而不是公式使用的球体计算。

但我认为这根本不重要。你得到的结果是正确的,精度很高,我认为问题不在于结果的精度,而是你对这些距离的期望。

这些是测地线距离 - 球体上的最短距离,因此关于平面地图上的距离的直觉在这里并不总是有效。您可以在例如https://academo.org/demos/geodesics/上可视化测地线以获得更好的直觉。

首先,result2 和 result1 与 result6 和 result5。您可能已经注意到,result6 恰好是 result5 的两倍,但 result2 略小于 result1。为什么是这样?因为从 (89, 0) 到 (89, 2) 的测地线不经过 (89, 1),而是稍微向北一点。

从 (89, 0) 到 (89, 180) 的测地线经过北极 - 所以它与从 (89, 0) 到 (89, 1) 的 180 次测地线有很大不同。

另一方面,在纬度 0 处,测地线始终遵循赤道。或者在对映端 0, 0 和 0, 180 的情况下 - 所有测地线都具有相同的长度。因此,在这种特殊情况下,您对距离关系的期望是正确的。


推荐阅读