地球の球体モデルを使用すると、適切な精度が得られ、単純で高速な計算が可能になります。
すべての座標を地球中心(3D)デカルト座標に変換します。たとえば、式
(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))
しましょう。(これは、地球の半径が1単位である距離メジャーを使用するため、便利です。)
始点にX0 =(x0、y0、z0)、終点にX1 =(x1、y1、z1)と書くと、大円が定義されます(X0がX1と異なり、2つが正反対ではない場合)。 UをX0とX1の正規化された外積とする。これは2つのステップで計算されます。
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の絶対値が最小になります。
この図は、球体上の2つの白い点と2000個のランダムな点によって決定された大円(黒)を示しており、その大円の平面までの絶対3D距離に応じて色と影が付けられています。つまり、| d |です。
最も近い点を見つけたら、まずそれを大円の平面(3D)に投影し、次にそれを半径方向外向きに地表面まで延長することで、大円に投影します。射影は単にd * Uを減算します。
X' = (x', y', z') = X - d*U = (x - d*xu, y - d*yu, z - d*zu).
放射状射影は、VがUに正規化されたのと同じ方法でX 'を単純に正規化します。
X'' = X' / |X'|.
(これは、| X '| = 0の場合に問題になります。これは、最も近い点が大円の極の1つである場合に発生します。この条件のコードにテストを含めて、可能であれば、個別に処理します。dの符号を使用して、どの極を識別するか。)
必要に応じて、通常の式を使用して X ''の座標を(lat、lon)に戻します。