使用地球的球形模型可能会提供足够的精度,并导致简单的快速计算。
将所有坐标转换为以地球为中心的(3D)直角坐标。例如,公式
(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))
会做。(它使用距离测量,其中地球半径为一个单位,这很方便。)
写X0 =(x0,y0,z0)作为起点,X1 =(x1,y1,z1)作为终点,定义了大圆(假设X0与X1不同,并且两者并不完全相反),令U为X0和X1的标准化叉积。分两个步骤进行计算:
V = (xv, yv, zv) = (y0*z1 - z0*y1, z0*x1 - x0*z1, x0*y1 - y0*x1)
V的长度是
|V| = sqrt(xv^2 + yv^2 + zv^2)
归一化将V拉伸到单位长度:
U = (xu, yu, zu) = V / |V| = (xv/|V|, yv/|V|, zv/|V|).
任何点X =(x,y,z)与该大圆的平面之间的定向3D距离只是X与Z的点积,由下式给出
d = X * U = x*xu + y*yu + z*zu
就地球表面上的距离而言,最接近的点是最接近平面的点;因此,它的绝对值最小d。
该图显示了一个大圆(黑色),该圆由球上的两个白点和2000个随机点确定,该点根据它们与该大圆的平面的绝对3D距离进行着色和着色。即| d |。
找到最接近的点后,首先将其投影到大圆的平面(在3D中),然后将其径向向外扩展到地球表面,然后将其投影到大圆上。投影仅减去d * U:
X' = (x', y', z') = X - d*U = (x - d*xu, y - d*yu, z - d*zu).
径向投影只是简单地将X'重新归一化,就像将V重新归一化为U一样:
X'' = X' / |X'|.
(如果| X'| = 0,这将是有问题的,当最接近的点是大圆的极点之一时会发生。如果可能发生,请在代码中包含此条件的测试,然后单独进行处理,使用d的符号来标识哪个极点。)
如果需要,可以使用常用公式将X''的坐标转换回(lat,lon)。