Tenho pontos no WGS84 lat / long e gostaria de medir distâncias "pequenas" (menos do que 5 km) entre eles.
Eu posso usar a fórmula haversine em http://www.movable-type.co.uk/scripts/latlong.html e funciona muito bem.
Eu gostaria de usar as bibliotecas Python Shapely, para que eu possa fazer mais operações do que apenas distância, e porque na escala em que estou trabalhando, uma terra plana é uma aproximação suficientemente boa. Para projetar com segurança as cordas geográficas em uma coordenada cartesiana, estou usando o Python proj4
, mas parece ter erros maiores do que eu gostaria.
Se eu usar a zona UTM local, obtenho diferenças entre a barreira de um par de metros, o que é bom. Mas eu não quero ter que trabalhar na zona UTM (os pontos podem ser mundiais), então tentei com o "Mercator esférico", mas agora as diferenças entre distâncias oceânicas e distâncias projetadas estão bem acima de 100%. Isso é realmente certo para Mercator esférico? Tudo o que eu realmente quero é uma projeção cartesiana viável para dois pontos a 5 km um do outro em qualquer lugar do mundo.
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)
Neste ponto, a distância do haversine entre eles é de 394m, e usando a zona utm 27, 395m. Mas se eu usar Mercator esférico, a distância cartesiana é 904m, o que está muito distante.
fonte
Respostas:
Sim, você receberá esses tipos de erros com uma projeção global de Mercator: é precisa no equador e a distorção aumenta exponencialmente com a latitude longe do equador. A distorção da distância é exatamente 2 (100%) a 60 graus de latitude. Nas latitudes de teste (64,14 graus), calculo uma distorção de 2,294, concordando exatamente com a razão 904/394 = 2,294. (No início, eu calculei a versão 2.301, mas isso foi baseado em uma esfera, não no elipsóide WGS84. A diferença (de 0,3%) nos dá uma sensação da precisão que você pode obter ao usar uma projeção baseada em elipsóide versus a fórmula Haversine baseada em esfera. )
Não existe projeção global que produza distâncias altamente precisas em todos os lugares. Essa é uma das razões pelas quais o sistema de zonas UTM é usado!
Uma solução é usar a geometria esférica para todos os seus cálculos, mas você a rejeitou (o que é razoável se você estiver realizando operações complexas, mas vale a pena revisar a decisão).
Outra solução é adaptar a projeção aos pontos que estão sendo comparados . Por exemplo, você pode usar com segurança um Mercator transversal (como no sistema UTM) com um meridiano próximo ao centro da região de interesse. Mover o meridiano é uma coisa simples de se fazer: basta subtrair a longitude do meridiano de todas as longitudes e usar uma única projeção de TM centrada no Meridiano Principal (com um fator de escala de 1, em vez de 0,9996 do sistema UTM). Para o seu trabalho, isso tenderá a ser maispreciso do que usar o próprio UTM. Ele fornecerá ângulos corretos (a TM é conforme) e será notavelmente preciso para pontos separados por apenas algumas dezenas de quilômetros: espere uma precisão superior a seis dígitos. De fato, eu estaria inclinado a atribuir pequenas diferenças entre essas distâncias de TM adaptadas e as distâncias de Haversine à diferença entre o elipsóide (usado para a projeção de MT) e a esfera (usada por Haversine), em vez de distorção na projeção.
fonte
Eu não tentei isso, mas a partir da documentação, parece que você pode usar http://search.cpan.org/~grahamc/Geo-Coordinates-UTM-0.08/UTM.pm#latlon_to_utm para obter um par lat / lon (mais elipsóide) para Zona UTM e lista de coordenadas. Então você pode continuar com seu cálculo como antes.
fonte