¿Eliminar pequeños espacios de polígono en Shapely polygon?

9

Sé que este problema se ha abordado anteriormente con diferentes softwares, pero ¿cómo lo hago con Shapely?

Tengo un polígono con un espacio muy pequeño en el interior de la forma:

brecha

Aquí hay un primer plano:

gapClose

El polígono es válido, así que no puedo usar el truco del búfer, y simplificar el polígono tampoco funciona.

camdenl
fuente

Respuestas:

13

Lo que estás viendo es una geometría de astilla. Similar a la respuesta de @ sgillies , excepto que use algunos parámetros de búfer para controlar la forma de geometría cincelada:

import json
from shapely.geometry import shape, JOIN_STYLE
eps = 0.001  # epsilon that is approx. the width of slivers, e.g. 1 mm

# Load the original polygon from GeoJSON
poly = shape(json.loads('{"type": "Polygon", "coordinates": [[[...]]]}'))

# Here's the algorithm
fx = poly.buffer(eps, 1, join_style=JOIN_STYLE.mitre).buffer(-eps, 1, join_style=JOIN_STYLE.mitre)

# Compare number of vertices in the exterior LinearRing
print(len(poly.exterior.coords))  # 136
print(len(fx.exterior.coords))    # 135

Tenga en cuenta que la fxgeometría fija tiene una coordenada menos, que era la astilla colgante. También tenga en cuenta que algunos de los vértices pueden haberse movido desde su posición original, generalmente varias veces menos que eps.

Mike T
fuente
6

Intente dilatar y erosionar por un pequeño factor ( eps).

   geom.buffer(eps).buffer(-eps)
sgillies
fuente