หากคุณต้องการการตรวจวัดทางธรณีวิทยาที่มีความแม่นยำสูงและมีประสิทธิภาพให้ใช้GeographicLibซึ่งเขียนด้วยภาษาโปรแกรมหลายภาษาเช่น C ++, Java, MATLAB, Python เป็นต้น
ดูCFF Karney (2013) "อัลกอริทึมสำหรับธรณีวิทยา"สำหรับการอ้างอิงวรรณกรรม โปรดทราบว่าอัลกอริธึมเหล่านี้มีความแข็งแกร่งและแม่นยำกว่าอัลกอริธึมของ Vincenty ตัวอย่างเช่นใกล้กับแอนตีรหัส
ระยะทางคำนวณเป็นเมตรระหว่างจุดสองจุดรับs12
แอตทริบิวต์ระยะทางจากการแก้ปัญหาเนื้อที่ผกผัน เช่นกับแพ็คเกจทางภูมิศาสตร์สำหรับ 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))
22.481 กม. ระหว่าง (84.57916462672875, 158.67545706102192) และ (84.70326937581333, 156.9784597422855)