Superposition de polygones avec Shapely

15

J'essaie de capturer tous les polygones non superposés indiqués ci-dessous en utilisant Shapely (les polygones A, B et C donnés). De plus, j'espère pouvoir le faire sans itération, sans test d'intersection, etc. La réponse acceptée à cette question exprime la méthode PostGIS mais il semblerait que «union» signifie des choses différentes pour différentes personnes.

superposition de polygones

valveLondres
la source

Réponses:

21

Vous devez répéter à un certain niveau. ( Mise à jour : j'ai édité pour supprimer toutes les boucles "for", à l'exception d'une compréhension de liste )

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

Vous devez d'abord l'union de toutes les intersections (utilisez une union en cascade ), en utilisant la combinaison de chaque forme. Ensuite, vous supprimez (via difference) les intersections de l'union de toutes les formes.

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

Voici à quoi nonoverlapressemble (via JTS Test Builder): sans chevauchement

Mike T
la source
1

Après quelques années, il semble y avoir une meilleure solution grâce à 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))))

Il prend en charge n'importe quelle longueur de géométrie, le seul problème concerne le temps de calcul et ne prend pas en charge le polygone avec des trous.

Deo Leung
la source
Par curiosité, pourquoi pensez-vous que votre solution est meilleure que celle de @MikeT? Je ne peux lire qu'un problème de temps de calcul.
mgri