La chose que vous regardez est une géométrie de ruban. Semblable à la réponse de @ sgillies , sauf utiliser quelques paramètres de tampon pour contrôler la forme de la géométrie ciselée:
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
Notez que la fx
géométrie fixe a une coordonnée de moins, qui était le ruban pendant. Notez également que certains des sommets peuvent avoir bougé de leur position d'origine, généralement plusieurs fois moins que eps
.