고정밀하고 강력한 측지 측정이 필요한 경우 C ++, Java, MATLAB, Python 등을 비롯한 여러 프로그래밍 언어로 작성된 GeographicLib를 사용하십시오 .
참조 CFF Karney (2013) "측지선을위한 알고리즘" 문학 참조. 이러한 알고리즘은 Vincenty 알고리즘보다 강력하고 정확합니다 (예 : antipodes).
두 점 사이의 거리를 미터 단위로 계산하려면 역 측지 솔루션s12
에서 거리 속성을 가져옵니다 . 예를 들어, 파이썬 용 geographiclib 패키지
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.481km