Sovrapposizione di poligoni con Shapely


15

Sto cercando di catturare tutti i poligoni non sovrapposti indicati di seguito usando Shapely (dati poligoni A, B e C). Inoltre, spero di farlo senza iterazione, test per intersecare ecc. La risposta accettata a questa domanda esprime il metodo PostGIS ma sembrerebbe che "unione" significhi cose diverse per persone diverse.

sovrapposizione di poligoni

Risposte:


21

Devi iterare a un certo livello. ( Aggiornamento : ho modificato per rimuovere tutti i loop "for", tranne una comprensione dell'elenco )

# 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]

Innanzitutto è necessario l'unione di tutte le intersezioni (utilizzare un'unione a cascata ), utilizzando la coppia di combinazioni di ogni forma. Quindi rimuovi (tramite difference) le intersezioni dall'unione di tutte le forme.

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

Ecco come nonoverlapappare (tramite JTS Test Builder): non sovrapposizione


1

Dopo alcuni anni sembra esserci una soluzione migliore attraverso 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))))

Supporta qualsiasi lunghezza di geometria, l'unico problema riguarda il tempo di calcolo e non supporta il poligono con fori.


Per curiosità, perché pensi che la tua soluzione sia migliore di quella di @MikeT? Posso solo leggere un problema in termini di tempi di calcolo.
mgri,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.