Polígono superpuesto con Shapely

15

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

superposición de polígonos

válvula de Londres
fuente

Respuestas:

21

Necesita iterar en algún nivel. ( Actualización : he editado para eliminar todos los bucles "for", excepto una comprensión de la lista )

# 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 par de 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)

Esto es lo que nonoverlapparece (a través de JTS Test Builder): no solapamiento

Mike T
fuente
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))))

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

Deo Leung
fuente
Por curiosidad, ¿por qué crees que tu solución es mejor que la de @MikeT? Solo puedo leer sobre un problema en términos de tiempos de cálculo.
mgri