Superposición de polígonos con Shapely

15

Estoy tratando de capturar todos los polígonos no superpuestos indicados a continuación usando Shapely (dados los polígonos A, B y C). Además, espero hacerlo sin iteración, buscando intersecciones, etc. La respuesta aceptada a esta pregunta expresa el método PostGIS, pero parece que" unión "significa diferentes cosas para diferentes personas.

    
pregunta valveLondon 09.07.2011 - 00:56

2 respuestas

21

Necesitas iterar en algún nivel. ( Actualizar : edité para eliminar todos los bucles "for", excepto uno lista de comprensión )

# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import cascaded_union
from itertools import combinations

# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)

# list the shapes so they are iterable
shapes = [A, B, C]

Primero necesita la unión de todas las intersecciones (use una unión en cascada ), usando el combinación de cada forma. Luego elimina (a través de difference ) las intersecciones de la unión de todas las formas.

# All intersections
inter = cascaded_union([pair[0].intersection(pair[1]) for pair in combinations(shapes, 2)])
# Remove from union of all shapes
nonoverlap = cascaded_union(shapes).difference(inter)

Aquí es cómo se ve nonoverlap (a través de JTS Test Builder):

    
respondido por el Mike T 09.07.2011 - 02:14
1

Después de unos años, parece haber una mejor solución a través de shapely :

# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import polygonize, unary_union

# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)
...

# list the shapes so they are iterable
shapes = [A, B, C, ...]

# generate the overlay
list(polygonize(unary_union(list(x.exterior for x in shapes))))

Es compatible con cualquier geometría, el único problema es el tiempo de cálculo y no admite polígonos con agujeros.

    
respondido por el Deo Leung 03.07.2017 - 09:56

Lea otras preguntas en las etiquetas