对此我感到困惑,不知道如何处理。非常感谢您的帮助。
我解决这个问题最简单的方法是将坐标转换为(X,Y,Z),然后找到球体上的距离。
假设地球是一个半径为R的球体(完全不准确)...
X = R * cos(long) * cos(lat)
Y = R * sin(long) * cos(lat)
Z = R * sin(lat)
此时,您可以使用三维勾股定理的扩展来近似计算两点之间的距离:
dist = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)
但是要找到沿表面的实际距离,您需要知道两点从原点(地球中心)所成的角度。
将您的位置表示为向量V1 =(X1,Y1,Z1)和V2 =(X2,Y2,Z2),则角度为:
angle = arcsin((V1 x V2) / (|V1||V2|)),其中x是叉积。
然后距离为:
dist =(地球周长)*角度/(2 * pi)
当然,这并没有考虑到高程的变化或地球在赤道处更宽的事实。一旦确定您的点是半球形的,请转到Gupta和Saluja的论文第4节。该部分展示了如何实际获取点的“最小包围圆”。
要执行所需的二次规划,请参阅N.D. Botkin的论文“解决二次规划的随机算法”。此教程很有帮助,但是论文使用(1/2)x ^ T G x-g ^ T x,而Web教程使用(1/2)x ^ T H x + c ^ T x。一个添加术语,另一个减去术语,导致与符号相关的问题。还请参见此2D QP问题示例。提示:如果您正在使用C ++,则Eigen库非常好。
这种方法比上面一些2D方法略微复杂,但它应该比完全忽略地球曲率更准确地给出结果。此方法的时间复杂度也为O(n),可能是渐近最优的。
注意:上述方法可能无法很好地处理重复数据,因此在查找最小包围圆之前,您可能需要检查重复的纬度/经度点。