22 votos

Soldar segmentos de línea individuales en una cadena de línea usando Shapely

Estoy usando Shapely en python y me dan un %-% MultiLineString un montón de Linestring objetos. Puedo garantizar que todos los objetos LineString %-% son líneas simples con solo 2 vértices y que todos son parte de una sola línea (sin ramas).

Quiero "conectar los puntos" y crear un único LineString. ¿Necesito escribir un método de soldadura recursiva para esto o hay una manera más rápida?

34voto

Joe P Puntos 180

Puedes usar %-% shapelys ops.linemerge para lograr esto:

from shapely import geometry, ops

# create three lines
line_a = geometry.LineString([[0,0], [1,1]])
line_b = geometry.LineString([[1,1], [1,0]])
line_c = geometry.LineString([[1,0], [2,0]])

# combine them into a multi-linestring
multi_line = geometry.MultiLineString([line_a, line_b, line_c])
print(multi_line)  # prints MULTILINESTRING ((0 0, 1 1), (1 1, 2 2), (2 2, 3 3))

# you can now merge the lines
merged_line = ops.linemerge(multi_line)
print(merged_line)  # prints LINESTRING (0 0, 1 1, 2 2, 3 3)

# if your lines aren't contiguous
line_a = geometry.LineString([[0,0], [1,1]])
line_b = geometry.LineString([[1,1], [1,0]])
line_c = geometry.LineString([[2,0], [3,0]])

# combine them into a multi-linestring
multi_line = geometry.MultiLineString([line_a, line_b, line_c])
print(multi_line)  # prints MULTILINESTRING ((0 0, 1 1), (1 1, 1 0), (2 0, 3 0))

# note that it will now merge only the contiguous portions into a component of a new multi-linestring
merged_line = ops.linemerge(multi_line)
print(merged_line)  # prints MULTILINESTRING ((0 0, 1 1, 1 0), (2 0, 3 0))

2voto

Ayman Puntos 3980

Creo que podrías hacerlo con Shapely usando el métodoshapely.ops.linemerge ().

Parece que podría tomar una lista de líneas como entrada y fusionarlas. He utilizado el método 'polygonize' antes y se necesita una lista de líneas.

Echa un vistazo al documento aquí: http://toblerity.org/shapely/manual.html#shapely.ops.linemerge

2voto

Vera Puntos 166

shapely.ops.linemerge() falló en algunas de mis líneas, así que tuve que hacerlo manualmente. Parece fallar para las líneas que "volvieron" a sí mismas, es decir, pasando por el mismo punto más de una vez. En mi caso, sé que las líneas están en el orden correcto, por lo que fue fácil escribir una pequeña función para fusionarlas.

from shapely.geometry import LineString
from typing import List


def merge_lines(lines: List[LineString]) -> LineString:
    last = None
    points = []
    for line in merged_line:
        current = line.coords[0]

        if last is None:
            points.extend(line.coords)
        else:
            if last == current:
                points.extend(line.coords[1:])
            else:
                print('Skipping to merge {} {}'.format(last, current))
                return None
        last = line.coords[-1]
    return LineString(points)

Espero que ayude a alguien

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