我使用算法(请参见: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是错误的。
如何解决此问题? 还有其他用于计算两个坐标点之间距离的高精度算法吗?
答案 0 :(得分:2)
好吧,结果是近似值-如果您想要更高的精度,则需要对球体进行计算,而不是对公式使用的球体进行计算。
但我认为这根本不重要。您获得的结果正确且精度很高,我认为问题不在于结果的精度,而是您对这些距离的期望。
这些是测地距离-球体上的最短距离,因此关于平面地图上的距离的直觉并不总是在这里起作用。您可以在例如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的情况下-所有测地线的长度都相同。因此,在这种特殊情况下,您对距离关系的期望是正确的。