在 Python 中将多多边形转换为多边形

Alb*_*nto 8 python polygons shapely

是否可以使用Shapely将 aMultipolygon转换为Polygon填充所有孔或缺失内部区域的 a ?我已经尝试了一段时间,但在文档中找不到它。下图显示了一个多边形示例,其中包含我要填充的孔和要删除的正方形。

带孔的多边形

小智 6

如果它足以填补某些 MultiPolygon 的漏洞m,您可以这样做:

no_holes = MultiPolygon(Polygon(p.exterior) for p in m)
Run Code Online (Sandbox Code Playgroud)

如果您还需要填充因接触 MultiPolygon 内的 Polygon 而产生的孔,则以下操作应该有效:

# 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)
Run Code Online (Sandbox Code Playgroud)


ewc*_*wcz 5

一种近似的方法可能是:

  1. 提取MultiPolygon感兴趣的单个组件的外边界
  2. 扩展-收缩每个外部边界以填充这些边界大致包含的“洞”,例如,处理“带切口的甜甜圈”
  3. 合并上一步中获得的所有几何图形

例如:

#!/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)
Run Code Online (Sandbox Code Playgroud)

MultiPolygon P样子: 在此处输入图片说明

而上面列出的脚本按预期生成了一个边长为 3 的近似正方形,即,它填充了左下角的洞以及中间的“空白空间”,MultiPolygon它被渲染为等效于具有足够高参数值的扩展-收缩过程eps