Расчет расстояния по широте / долготе путем преобразования в utm дает другие результаты, чем при использовании приближенного метода
У меня есть два метода для вычисления расстояния между координатами с географической привязкой в python:
from pyproj import Proj
import math
def calc_distance(lat1, lon1, lat2, lon2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = math.sin(dlat / 2) ** 2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2
c = 2 * math.asin(math.sqrt(a))
km = 6371 * c
return km
def calc_distance_convert_utm(lat1, lon1, lat2, lon2):
myProj = Proj("+proj=utm +zone=42, +north +ellps=WGS84 +datum=WGS84 +units=m +no_defs")
# convert to utm
utm_x1, utm_y1 = myProj(lat1, lon1)
utm_x2, utm_y2 = myProj(lat2, lon2)
diff_x = abs(utm_x1 - utm_x2)
diff_y = abs(utm_y1 - utm_y2)
distance = math.sqrt(diff_x**2 + diff_y**2)
return distance
Который я называю со следующими значениями:
lat1 = 34.866527
lon1 = 69.674606
lat2 = 34.864990
lon2 = 69.657655
print "approximation method: ", calc_distance(lat1, lon1, lat2, lon2)
print "converting to utm method: ", calc_distance_convert_utm(lat1, lon1, lat2, lon2)
Однако, если я сравниваю результаты, я получаю два разных значения:
approximation method: 1.55593476881
converting to utm method: 1928.21537269
Обратите внимание, что первый метод возвращает расстояние в километрах, а второй - в метрах. Я сравнил результат с дистанционными калькуляторами, которые вы можете найти в Интернете, и кажется, что первый метод (метод аппроксимации) - это "более правильный" ответ, поскольку это значение, которое возвращает большинство онлайн-калькуляторов. Интересно, почему второй метод (преобразование в utm first) не возвращает более похожий результат (что-то вроде 1555.9347...). У меня разница почти 0,5 км, что мне кажется довольно значительным.
Я сделал что-то не так? Любая помощь приветствуется! Спасибо
1 ответ
Я нашел ошибку... В методе преобразования utm я переключил значения широты / долготы в процессе преобразования. Так должно быть:
utm_x1, utm_y1 = myProj(lon1, lat1)
utm_x2, utm_y2 = myProj(lon2, lat2)