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.