Mam punkty w WGS84 lat / long i chciałbym zmierzyć „małe” (mniej niż powiedzmy 5 km) odległości między nimi.
Mogę użyć formuły haversine z http://www.movable-type.co.uk/scripts/latlong.html i działa bardzo dobrze.
Chciałbym jednak użyć bibliotek Python Shapely, aby móc wykonywać więcej operacji niż tylko odległość, a ponieważ w skali, z którą pracuję, płaska ziemia jest wystarczająco dobrym przybliżeniem. Aby niezawodnie rzutować współrzędne geograficzne na współrzędne kartezjańskie, używam Pythona proj4
, ale wydaje się, że dostaję większe błędy, niż bym chciał.
Jeśli korzystam z lokalnej strefy UTM, dostaję różnice między haversine o kilka metrów, co jest w porządku. Ale nie chcę musieć opracowywać strefy UTM (punkty mogą być na całym świecie), więc spróbowałem z „kulistym Mercatorem”, ale teraz różnice między podłużną i przewidywaną odległością są znacznie większe niż 100%. Czy to naprawdę jest odpowiednie dla sferycznego Mercatora? Wszystko, czego naprawdę chcę, to wykonalna projekcja kartezjańska dla dwóch punktów w odległości 5 km od siebie w dowolnym miejscu na świecie.
from shapely.geometry import Point
from pyproj import Proj
proj = Proj(proj='utm',zone=27,ellps='WGS84')
#proj = Proj(init="epsg:3785") # spherical mercator, should work anywhere...
point1_geo = (-21.9309694, 64.1455718)
point2_geo = (-21.9372481, 64.1478206)
point1 = proj(point1_geo[0], point1_geo[1])
point2 = proj(point2_geo[0], point2_geo[1])
point1_cart = Point(point1)
point2_cart = Point(point2)
print "p1-p2 (haversine)", hdistance(point1_geo, point2_geo)
print "p1-p2 (cartesian)", point1_cart.distance(point2_cart)
W tym momencie odległość między nimi wynosi 394 m, a strefa utm 27, 395 m. Ale jeśli użyję sferycznego Mercatora, odległość kartezjańska wynosi 904 m, co jest daleka.