You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:11:47