20 votos

¿Qué es la unidad el atributo length bien formados?

Estoy haciendo un cálculo muy simple de la longitud de una polilínea utilizando bien proporcionado:

Mis coordenadas son en WGS84. Parece que no puedo encontrar cualquier información sobre shapely atributo length. ¿Qué es la unidad del atributo de longitud? ¿Hay una manera fácil de convertir de km o metros?

23voto

Nikola Puntos 21

Sistemas De Coordenadas

[...] Bien formada, no admite el sistema de coordenadas de transformaciones. Todos las operaciones en dos o más de las características de suponer que las características que existen en el mismo plano Cartesiano.

Fuente: http://toblerity.org/shapely/manual.html#coordinate-systems

Ser shapely totalmente independiente en referencia a los SRS, es bastante obvio que el atributo de longitud se expresa en la misma unidad de coordenadas de la cadena de línea, es decir, títulos. De hecho:

>>> from shapely.geometry import LineString
>>> line = LineString([(0, 0), (1, 1)])
>>> line.length
1.4142135623730951

En cambio, si usted quiere expresar la longitud en metros, tiene que transformar su geometrías de WGS84 a una proyección de SRS usando pyproj (o, mejor, ejecutar distancia geodésica cálculo, véase el Gen de la respuesta). En detalle, desde la versión 1.2.18 (shapely.__version__), shapely apoya la geometría de funciones de transformación ( http://toblerity.org/shapely/shapely.html#module-shapely.ops) que se puede utilizar en conjunción con pyproj. Aquí está 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

20voto

GreyCat Puntos 146

Como alfaciano dice en shapely, la distancia es la Distancia Euclidiana o la distancia Lineal entre dos puntos de un plano y no en el Gran círculo de la distancia entre dos puntos sobre una esfera.

from shapely.geometry import Point
point1 = Point(50.67,4.62)
point2 = Point(51.67, 4.64)
import math
# Euclidean Dustance
def Euclidean_distance(point1,point2):
     return math.sqrt((point2.x()-point1.x())**2 + (point2.y()-point1.y())**2)

print Euclidean_distance(point1,point2)
1.00019998 # distance in degrees (coordinates of the points in degrees)

# with Shapely
print point1.distance(point2)
1.0001999800039989 #distance in degrees (coordinates of the points in degrees)

Para el gran círculo de la distancia, usted necesita para utilizar los algoritmos de la ley de los cosenos o la fórmula de Haversine (mira por Qué es la ley de los cosenos más preferible de haversine a la hora de calcular la distancia entre dos de latitud y longitud de los puntos?) o utilizar el módulo pyproj que realiza cálculos geodésicos.

# law of cosines
distance = math.acos(math.sin(math.radians(point1.y))*math.sin(math.radians(point2.y))+math.cos(math.radians(point1.y))*math.cos(math.radians(point2.y))*math.cos(math.radians(point2.x)-math.radians(point1.x)))*6371
print "{0:8.4f}".format(distance)
110.8544 # in km
# Haversine formula
dLat = math.radians(point2.y) - math.radians(point1.y)
dLon = math.radians(point2.x) - math.radians(point1.x)
a = math.sin(dLat/2) * math.sin(dLat/2) + math.cos(math.radians(point1.y)) * math.cos(math.radians(point2.y)) * math.sin(dLon/2) * math.sin(dLon/2)
distance = 6371 * 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
print "{0:8.4f}".format(distance)distance
110.8544 #in km

# with pyproj
import pyproj
geod = pyproj.Geod(ellps='WGS84')
angle1,angle2,distance = geod.inv(point1.x, point1.y, point2.x, point2.y)
print "{0:8.4f}".format(distance/1000)
110.9807 #in km

Usted puede probar el resultado en Longitud Latitud Calculadora de Distancia

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X