Sistemas coordenados
[...]
Shapely não suporta transformações de sistema de coordenadas. Todas as operações em dois ou mais recursos pressupõem que os recursos existem no mesmo plano cartesiano.
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:
>>> from shapely.geometry import LineString
>>> line = LineString([(0, 0), (1, 1)])
>>> line.length
1.4142135623730951
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 conjunto pyproj
. Aqui está um exemplo rápido:
from shapely.geometry import LineString
from shapely.ops import transform
from functools import partial
import pyproj
line1 = LineString([(15.799406, 40.636069), (15.810173,40.640246)])
print str(line1.length) + " degrees"
# 0.0115488362184 degrees
# Geometry transform function based on pyproj.transform
project = partial(
pyproj.transform,
pyproj.Proj(init='EPSG:4326'),
pyproj.Proj(init='EPSG:32633'))
line2 = transform(project, line1)
print str(line2.length) + " meters"
# 1021.77585965 meters