Tuesday, 22 October 2019

Removing small polygon gaps in Shapely polygon?


I know this issue has been addressed before with different software, but how do I do it with Shapely?


I have a polygon with a very small gap on the interior of the shape:


gap


Here is a close up:


gapClose


The polygon is valid so I can't use the buffer trick, and simplifying the polygon also doesn't work.



Answer



The thing you are looking at is a sliver geometry. Similar to @sgillies's answer, except use a few buffer parameters to control the chiselled geometry shape:


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

Note that the fixed fx geometry has one less coordinate, which was the dangling sliver. Also note that some of the vertices may have wiggled around from their original position, usually several times less than eps.


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...