Suite

Superposition de polygones avec Shapely

Superposition de polygones avec Shapely


J'essaie de capturer tous les polygones qui ne se chevauchent pas indiqués ci-dessous à l'aide de Shapely (étant donné les polygones A, B et C). De plus, j'espère 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 différentes choses pour différentes personnes.


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

# importations utilisées tout au long de cet exemple depuis shapely.geometry import Point depuis shapely.ops import cascaded_union depuis itertools import combinaisons # Voici vos formes d'entrée (cercles A, B, C) A = Point(3, 6).buffer(4) B = Point(6, 2).buffer(4) C = Point(1, 2).buffer(4) # liste les formes afin qu'elles soient des formes itérables = [A, B, C]

Vous avez d'abord besoin de l'union de toutes les intersections (utilisez une union en cascade), en utilisant la paire de combinaisons de chaque forme. Ensuite, vous supprimez (viadifférence) les intersections de l'union de toutes les formes.

# Toutes les intersections inter = cascaded_union([pair[0].intersection(pair[1]) pour les paires dans les combinaisons (formes, 2)]) # Supprimer de l'union de toutes les formes nonoverlap = cascaded_union(formes).difference(inter)

Voici quoinon-chevauchementressemble (via JTS Test Builder):


Après quelques années, il semble y avoir une meilleure solution à traversgalbé:

# importations utilisées tout au long de cet exemple depuis shapely.geometry import Point depuis shapely.ops import polygonize, unary_union # Voici vos formes d'entrée (cercles A, B, C) A = Point (3, 6).buffer(4) B = Point (6, 2).buffer(4) C = Point(1, 2).buffer(4)… # liste les formes afin qu'elles soient des formes itérables = [A, B, C,… ] # génère la liste de superposition (polygone (unary_union(list(x.exterior pour x dans les formes))))

Il prend en charge toutes les longueurs de géométrie, le seul problème concerne le temps de calcul et ne prend pas en charge les polygones avec des trous.