web-dev-qa-db-fra.com

Correction d'un polygone invalide dans Shapely

Shapely définit un polygone comme invalide si l'un de ses segments se croise, y compris les segments colinéaires. De nombreux progiciels créeront une région ou une zone avec une "découpe" comme indiqué ici qui a des segments colinéaires:

enter image description here

>>> pp = Polygon([(0,0), (0,3), (3,3), (3,0), (2,0), 
                  (2,2), (1,2), (1,1), (2,1), (2,0), (0,0)])
>>> pp.is_valid
WARNING:shapely.geos:Self-intersection at or near point 2 0
False

Naturellement, la découpe peut être implémentée en natif dans Shapely, ou cette même géométrie peut être implémentée en tant que deux polygones valides, mais si je n'ai que la liste des points ci-dessus, y a-t-il un moyen de "corriger" cela (créer une géométrie valide à partir de cela liste de points)?

31
jpcgt

J'ai trouvé une solution qui fonctionne pour le cas spécifique étant donné:

>>> pp2 = pp.buffer(0)
>>> pp2.is_valid
True
>>> pp2.exterior.coords[:]
[(0.0, 0.0), (0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (2.0, 0.0), (0.0, 0.0)]
>>> pp2.interiors[0].coords[:]
[(2.0, 1.0), (2.0, 2.0), (1.0, 2.0), (1.0, 1.0), (2.0, 1.0)]
37
jpcgt