如何用Python Shapely库,基于内外Polygon创建带孔洞的多边形?
在Shapely中构建带孔洞的Polygon
嘿,这个问题我太熟了!在Shapely里给基础多边形(outer)加上inners列表里的孔洞,其实逻辑很直接——核心就是利用Shapely的Polygon构造规则:一个带孔洞的多边形由一个外部环和**一组内部环(孔洞)**组成。
先搞清楚基础格式要求
首先得确保你的outer和inners符合Shapely的要求:
- 如果
outer已经是Shapely的Polygon对象,直接提取它的外部环就行:outer_ring = outer.exterior - 如果
outer是原始的坐标列表(比如[(x1,y1), (x2,y2), ...]),得先转成LinearRing:from shapely.geometry import LinearRing, Polygon,然后outer_ring = LinearRing(outer) - 对于
inners里的每个元素:如果是Polygon对象,就取它的外部环作为孔洞的环;如果是坐标列表,同样转成LinearRing
动手构建带孔洞的目标多边形p
直接用Polygon构造函数,第一个参数传外部环,第二个参数传内部环的列表就行:
情况1:outer和inners都是坐标列表
from shapely.geometry import LinearRing, Polygon # 假设outer是外部多边形的坐标列表,inners是多个孔洞的坐标列表组成的列表 outer_ring = LinearRing(outer) # 把每个孔洞转成LinearRing inner_rings = [LinearRing(hole) for hole in inners] # 创建带孔洞的多边形p p = Polygon(outer_ring, inner_rings)
情况2:outer和inners都是Shapely的Polygon对象
from shapely.geometry import Polygon # 提取outer的外部环,以及每个inner的外部环作为孔洞 inner_rings = [hole.exterior for hole in inners] p = Polygon(outer.exterior, inner_rings)
几个要注意的小细节
- 孔洞必须完全落在外部多边形的范围内,而且孔洞之间不能重叠或交叉,不然创建出来的多边形会是无效的(可以用
p.is_valid检查有效性) - 坐标顺序:Shapely默认外部环是顺时针,内部环是逆时针,不过就算你搞反了,Shapely也会自动调整,不用太纠结,但规范一点更好
- 如果你的坐标列表没闭合(最后一个点和第一个点不一样),
LinearRing会自动帮你闭合,但最好自己提前把坐标弄成闭合的,避免意外
给你举个实际运行的例子:
# 外部大正方形 outer = [(0,0), (0,10), (10,10), (10,0), (0,0)] # 两个小正方形孔洞的坐标 hole1 = [(2,2), (2,4), (4,4), (4,2), (2,2)] hole2 = [(6,6), (6,8), (8,8), (8,6), (6,6)] inners = [hole1, hole2] outer_ring = LinearRing(outer) inner_rings = [LinearRing(hole) for hole in inners] p = Polygon(outer_ring, inner_rings) # 检查是否有效,正常应该返回True print(p.is_valid)
这样就得到一个带两个方形孔洞的正方形多边形啦!
内容的提问来源于stack exchange,提问作者Eric H.
相关产品推荐
相关产品推荐

