Buscando una forma pitónica de calcular la longitud de una serie de WKT

13

Estaba bastante insatisfecho con Cálculo de la longitud de los Linestrings en WGS84 en millas . Me hizo preguntarme si hay una manera más conveniente y pitónica de calcular la longitud de una serie de WKT de acuerdo con un SRID dado.

Tengo en mente algo como:

srid="WGS84"
line="LINESTRING(3.0 4.0, 3.1 4.1)"
print length(line, srid)

Estoy buscando una respuesta precisa, no aproximaciones de sin\cos .

¿Alguna idea?

    
pregunta Adam Matan 01.12.2010 - 14:09

4 respuestas

17

El módulo geopy proporciona el Vincenty formula , que proporciona distancias elipsoidales precisas. Combine esto con el wkt cargando en Shapely, y tendrá un código bastante simple:

from geopy import distance
from shapely.wkt import loads

line_wkt="LINESTRING(3.0 4.0, 3.1 4.1)"

# a number of other elipsoids are supported
distance.VincentyDistance.ELLIPSOID = 'WGS-84'
d = distance.distance

line = loads(line_wkt)

# convert the coordinates to xy array elements, compute the distance
dist = d(line.xy[0], line.xy[1])

print dist.meters
    
respondido por el scw 01.12.2010 - 20:45
4

También puede usar la length de Shapely, es decir,

from shapely.wkt import loads

l=loads('LINESTRING(3.0 4.0, 3.1 4.1)')
print l.length
    
respondido por el tomkralidis 01.12.2011 - 17:56
2

Usaré ogr2ogr ( enlace ) para hacerlo directamente, pero si realmente debes usar python, entonces son enlaces de python ( enlace ) para permitirle hacerlo.

    
respondido por el Ian Turton 01.12.2010 - 17:08
1

Tarde a la fiesta, pero con una contribución esperanzadamente útil. Basándome en respuesta de scw usando geopy, escribí una pequeña función que realiza el cálculo de un objeto LineString bien formado con arbitrariamente muchos coordenadas Utiliza un iterador pairs de Stackoverflow.

Característica principal: las cadenas de documentación son mucho más largas que los fragmentos.

def line_length(line):
    """Length of a line in meters, given in geographic coordinates

    Args:
        line: a shapely LineString object with WGS-84 coordinates

    Returns:
        Length of line in meters
    """
    from geopy.distance import distance

    return sum(distance(a, b).meters for (a, b) in pairs(line.coords))


def pairs(lst):
    """Iterate over a list in overlapping pairs without wrap-around.

    Args:
        lst: an iterable/list

    Returns:
        Yields a pair of consecutive elements (lst[k], lst[k+1]) of lst. Last 
        call yields the last two elements.

    Example:
        lst = [4, 7, 11, 2]
        pairs(lst) yields (4, 7), (7, 11), (11, 2)

    Source:
        https://stackoverflow.com/questions/1257413/1257446#1257446
    """
    i = iter(lst)
    prev = i.next()
    for item in i:
        yield prev, item
        prev = item
    
respondido por el ojdo 26.09.2014 - 14:27

Lea otras preguntas en las etiquetas