修复 Shapely 中的无效多边形

新手上路,请多包涵

如果 Polygon 的任何线段相交(包括共线线段),则 Shapely 将 Polygon 定义为无效。许多软件包将创建一个带有“切口”的区域或区域,如此处所示,它具有共线段:

在此处输入图像描述

 >>> pp = Polygon([(0,0), (0,3), (3,3), (3,0), (2,0),
                  (2,2), (1,2), (1,1), (2,1), (2,0), (0,0)])
>>> pp.is_valid
WARNING:shapely.geos:Self-intersection at or near point 2 0
False

自然地,可以在 Shapely 中本地实现切口,或者可以将相同的几何体实现为两个有效的多边形,但是如果我只有上面显示的点列表,是否有一个简单的“修复”这个(从这个创建有效的几何体)点列表)?

原文由 jpcgt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

我找到了适用于给定特定案例的解决方案:

 >>> pp2 = pp.buffer(0)
>>> pp2.is_valid
True
>>> pp2.exterior.coords[:]
[(0.0, 0.0), (0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (2.0, 0.0), (0.0, 0.0)]
>>> pp2.interiors[0].coords[:]
[(2.0, 1.0), (2.0, 2.0), (1.0, 2.0), (1.0, 1.0), (2.0, 1.0)]

原文由 jpcgt 发布,翻译遵循 CC BY-SA 4.0 许可协议

为此,Shapely 实施了一个解决方案。通过 pip 你可以使用任何 shapely 版本 >= 1.8a3 并以这种方式导入:

 from shapely.validation import make_valid

通过 pip 和 conda 可用的当前版本包括 make_valid 功能。如果需要安装旧版本的 shapely,可以使用如下所示的 shapely 实现:

 def make_valid(ob):

    from shapely.geometry.base import geom_factory
    from shapely.geos import lgeos

    if ob.is_valid:
        return ob

    return geom_factory(lgeos.GEOSMakeValid(ob._geom))

原文由 Rafael Matias 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏