Sistemas coordinados
[...]
Shapely no admite transformaciones de sistemas de coordenadas. Todas las operaciones en dos o más entidades suponen que las entidades existen en el mismo plano cartesiano.
Fuente: http://toblerity.org/shapely/manual.html#coordinate-systems
Siendo shapely
completamente agnóstico en referencia a SRS, es bastante obvio que el atributo de longitud se expresa en la misma unidad de coordenadas de su cadena lineal, es decir, grados. De hecho:
>>> from shapely.geometry import LineString
>>> line = LineString([(0, 0), (1, 1)])
>>> line.length
1.4142135623730951
En cambio, si desea expresar la longitud en metros, debe transformar sus geometrías de WGS84 a un SRS proyectado utilizando pyproj (o, mejor, ejecutar el cálculo de distancia geodésica, consulte la respuesta de Gene). En detalle, desde la versión 1.2.18 ( shapely.__version__
), shapely
admite las funciones de transformación de geometría ( http://toblerity.org/shapely/shapely.html#module-shapely.ops ) con las que podemos usarlo junto con pyproj
. Aquí hay un ejemplo 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