高精度で堅牢な測地測定が必要な場合は、C ++、Java、MATLAB、Pythonなどのいくつかのプログラミング言語でネイティブに記述されているGeographicLibを使用します。
参照CFF Karney(2013)、「測地線のためのアルゴリズム」文学の参考のため。これらのアルゴリズムはVincentyのアルゴリズムよりも堅牢で正確です。
2点間の距離をメートル単位で計算するにs12
は、逆測地線ソリューションから距離属性を取得します。と例えば、geographiclibの Python用のパッケージ
from geographiclib.geodesic import Geodesic
g = Geodesic.WGS84.Inverse(-41.32, 174.81, 40.96, -5.50)
print(g) # shows:
{'a12': 179.6197069334283,
'azi1': 161.06766998615873,
'azi2': 18.825195123248484,
'lat1': -41.32,
'lat2': 40.96,
'lon1': 174.81,
'lon2': -5.5,
's12': 19959679.26735382}
または、メートルからキロメートルに変換する便利な関数を作成します。
dist_km = lambda a, b: Geodesic.WGS84.Inverse(a[0], a[1], b[0], b[1])['s12'] / 1000.0
a = (-41.32, 174.81)
b = (40.96, -5.50)
print(dist_km(a, b)) # 19959.6792674 km
次に、リストA
との間の最も近いポイントを見つけるためにB
、それぞれ100ポイントを使用します。
from random import uniform
from itertools import product
A = [(uniform(-90, 90), uniform(-180, 180)) for x in range(100)]
B = [(uniform(-90, 90), uniform(-180, 180)) for x in range(100)]
a_min = b_min = min_dist = None
for a, b in product(A, B):
d = dist_km(a, b)
if min_dist is None or d < min_dist:
min_dist = d
a_min = a
b_min = b
print('%.3f km between %s and %s' % (min_dist, a_min, b_min))
(84.57916462672875、158.67545706102192)と(84.70326937581333、156.9784597422855)の間の22.481 km