GIS - 在计算两点之间的距离时得到奇怪的结果
GIS - Get weird result when calculating distance between two points
我使用算法(参见:calculating distance between two points)来计算两点之间的距离。但它得到了错误的结果,参见 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是错的
如何解决这个问题? 有没有其他更高精度的算法来计算两个坐标点之间的距离
好吧,结果是近似值 - 如果您想要更高的精度,则需要对椭球体进行计算,而不是对公式使用的球体进行计算。
但我认为这根本不重要。你得到的结果是正确的,精度很高,我认为问题不在于结果的精度,而是你对这些距离的期望。
这些是测地线距离 - 球体上的最短距离,因此关于平面地图上距离的直觉在这里并不总是适用。您可以在例如处可视化测地线。 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 的情况下 - 所有测地线都具有相同的长度。所以你对距离关系的预期在这种特殊情况下是正确的。
我使用算法(参见:calculating distance between two points)来计算两点之间的距离。但它得到了错误的结果,参见 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是错的
如何解决这个问题? 有没有其他更高精度的算法来计算两个坐标点之间的距离
好吧,结果是近似值 - 如果您想要更高的精度,则需要对椭球体进行计算,而不是对公式使用的球体进行计算。
但我认为这根本不重要。你得到的结果是正确的,精度很高,我认为问题不在于结果的精度,而是你对这些距离的期望。
这些是测地线距离 - 球体上的最短距离,因此关于平面地图上距离的直觉在这里并不总是适用。您可以在例如处可视化测地线。 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 的情况下 - 所有测地线都具有相同的长度。所以你对距离关系的预期在这种特殊情况下是正确的。