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

时间:2018-01-03 17:48:24

标签: python polygons shapely

是否可以使用ShapelyMultipolygon转换为填充所有漏洞或缺少内部区域的Polygon?我已经尝试了一段时间,但我无法在文档中找到它。下图我展示了一个多面体的例子,其中包含我要填充的那些洞,以及我想要移除的那些正方形。

Multipolygon with holes

2 个答案:

答案 0 :(得分:2)

近似方法可能是:

  1. 提取感兴趣的MultiPolygon
  2. 的各个组成部分的外边界
  3. 扩展 - 缩小每个外边界以填充'#34;孔"这些边界大致包含,例如,处理带有切割的"甜甜圈"
  4. 合并上一步中获得的所有几何
  5. 例如:

    #!/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)
    

    MultiPolygon P看起来像: enter image description here

    虽然上面列出的脚本按预期产生了一个长度为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)