Usando Python2.7 y shapely, permita que:
import shapely
coords = [(0, 0), (0, 2), (2, 0), (2, 2), (0, 0)]
bowtie = shapely.geometry.Polygon(coords)
bowtie.is_valid
lo cual da como resultado:
Auto-intersección en o cerca del punto 1 1
Out[2]: False
Entonces intentemos el método buffer(0)
como se describe en la documentación (http://toblerity.org/shapely/manual.html):
limpio = bowtie.buffer(0)
tipo(limpio)
lo cual da como resultado:
Out[4]: shapely.geometry.polygon.Polygon
La diferencia entre el ejemplo en la documentación es que en este caso presente, el punto de cruce no está definido en las coordenadas originales, por lo que no resulta en un multipolígono y no es realmente consistente con estas coordenadas iniciales, como muestra este comando:
limpio.wkt
cuando devuelve:
Out[16]: 'POLYGON ((0 0, 0 2, 1 1, 0 0))'
Y la imagen resultante para una mejor comprensión visual:
Con:
Rojo: polígono original auto-intersectante
Turquesa: polígono de pajarita limpio con el método buffer(0)
(solo una mitad del polígono original. Ten cuidado con el efecto de escalamiento diferente en iPython...)
Pregunta:
¿Cómo se puede recuperar fácilmente la forma original con una geometría válida para poder realizar más operaciones como intersecciones, etc?