Estou fazendo um cálculo muito simples do comprimento de uma polilinha usando o formato:
from shapely.geometry import LineString
...
xy_list = [map(float,e) for e in xy_intm]
line = LineString(xy_list)
s = '%s,%s,%s' % (fr,to,line.length)
Minhas coordenadas estão em WGS84. Não consigo encontrar nenhuma informação sobre o atributo de comprimento bem torneado. Qual é a unidade do atributo length? Existe uma maneira fácil de converter para km ou metros?
Respostas:
Como alfaciano diz de maneira bem torneada, a distância é a distância euclidiana ou distância linear entre dois pontos de um avião e não a distância do Grande Círculo entre dois pontos de uma esfera.
Para a distância do grande círculo, você precisa usar algoritmos como a lei dos cossenos ou a fórmula de Haversine (veja Por que a lei dos cossenos é mais preferível do que a haversine ao calcular a distância entre dois pontos de latitude-longitude? ) Ou use o módulo pyproj que realiza cálculos geodésicos.
Você pode testar o resultado na Longitude Latitude Distance Calculator
fonte
geopy
que implementou uma distância de grande círculo e cálculo de distância de Vincenty.geopy
.Fonte: http://toblerity.org/shapely/manual.html#coordinate-systems
Sendo
shapely
completamente agnóstico em relação ao SRS, é bastante óbvio que o atributo length é expresso na mesma unidade de coordenadas da cadeia de linhas, ou seja, graus. De fato:Em vez disso, se você deseja expressar o comprimento em metros, precisa transformar suas geometrias de WGS84 em um SRS projetado usando pyproj (ou, melhor, executar o cálculo da distância geodésica, consulte a resposta de Gene). Em detalhes, desde a versão 1.2.18 (
shapely.__version__
),shapely
suporta as funções de transformação de geometria ( http://toblerity.org/shapely/shapely.html#module-shapely.ops ) com as quais podemos usá-lo em conjuntopyproj
. Aqui está um exemplo rápido:fonte