是否可以使用Shapely将Multipolygon
转换为填充所有漏洞或缺少内部区域的Polygon
?我已经尝试了一段时间,但我无法在文档中找到它。下图我展示了一个多面体的例子,其中包含我要填充的那些洞,以及我想要移除的那些正方形。
答案 0 :(得分:2)
近似方法可能是:
MultiPolygon
例如:
#!/usr/bin/env python
from shapely.geometry import MultiPolygon, Polygon
from shapely.ops import cascaded_union
a = 0.25
delta = 0.49
P = MultiPolygon([
(
((0,0),(0,3),(3,3),(3,2-delta),(2,2-delta),(2,2),(1,2),(1,1),(2,1),(2,1+delta),(3,1+delta),(3,0),(0,0)),
[((a, a), (1-a,a), (1-a,1-a), (a,1-a), (a,a))]
)
])
eps = 0.01
omega = cascaded_union([
Polygon(component.exterior).buffer(eps).buffer(-eps) for component in P
])
for x,y in zip(*omega.exterior.coords.xy):
print(x, y)
虽然上面列出的脚本按预期产生了一个长度为3的边的近似正方形,即它填充了左下角的空洞以及空白空间"在MultiPolygon
的中心,它与扩展 - 收缩过程中的一个洞相当,并具有足够高的参数eps
。
答案 1 :(得分:1)
如果它足以填满某些MultiPolygon m
的漏洞,您可以这样做:
no_holes = MultiPolygon(Polygon(p.exterior) for p in m)
如果您还需要填充MultiPolygon中触摸多边形所产生的孔,则以下内容应该有效:
# Create a polygon `b` that contains `m`
xmin, ymin, xmax, ymax = m.bounds
b = Polygon([(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin)]).buffer(1, resolution=1)
# Take the complement of `m` in `b`, which is a MultiPolygon.
# Pick the outer polygon and take the complement in `b`.
no_holes = b - min(b - m, key=lambda p: p.bounds)