緯度間の距離を比較することから始めます。各緯度は約69マイル(111キロメートル)離れています。範囲は(地球のわずかな楕円形のために)赤道での68.703マイル(110.567 km)から極での69.407(111.699 km)まで変化します。2つの場所の間の距離は、それらの緯度の間の距離以上になります。
これは経度には当てはまらないことに注意してください。経度の各度の長さは緯度に依存します。ただし、データが特定の領域(たとえば、単一の国)に制限されている場合は、経度の最小および最大の境界を計算することもできます。
続行すると、球体地球を想定した低精度で高速の距離計算が行われます。
座標が{lat1、lon1}と{lat2、lon2}の2点間の大円距離dは、次の式で与えられます。
d = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))
数学的に同等の式で、短距離の丸め誤差の影響を受けにくいものは次のとおりです。
d = 2*asin(sqrt((sin((lat1-lat2)/2))^2 +
cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))
dはラジアン単位の距離です
distance_km ≈ radius_km * distance_radians ≈ 6371 * d
(6371 kmは地球の平均半径です)
この方法の計算要件は最小限です。ただし、結果は短い距離では非常に正確です。
次に、それが特定の距離にある場合は、多かれ少なかれ、より正確な方法を使用します。
GeographicLibは私が知っている中で最も正確な実装ですが、Vincentyの逆式も使用できます。
RDBMSを使用している場合は、緯度を主キーとして設定し、経度を副キーとして設定します。上記のように、緯度範囲または緯度/経度範囲をクエリしてから、結果セットの正確な距離を計算します。
すべての主要なRDBMSの最新バージョンは、地理データ型とクエリをネイティブにサポートしていることに注意してください。