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

如何用Shapely实现两个多边形的差集操作?

问题:从大多边形中排除交集生成带洞多边形

现有代码可实现两个多边形的交集计算并生成交集多边形,需求与之相反:生成从大多边形中排除交集部分的带洞多边形。

已编写的交集代码如下:

from shapely.geometry import shape,Polygon,MultiPolygon,mapping
import geopandas as gpd

g1 = geomap
print(geomap)
g2 = geomap_world
print(geomap_world)

data=[]
for index, orig in g1.iterrows():
    for index2, ref in g2.iterrows():
        if ref['geometry'].intersects(orig['geometry']):                
            data.append({'geometry':ref['geometry'].intersection(orig['geometry'])}) 

df = gpd.GeoDataFrame(data,columns=['geometry'])

df结果示例:

162  POLYGON ((-2.16991 35.16840, -1.79299 34.52792...  

尝试将intersection替换为symmetric_difference,结果却等于想要排除的交集,请问问题出在哪里?


解答

问题根源

symmetric_difference(对称差)的计算逻辑是取两个几何对象互不重叠的所有区域,也就是(A - B) ∪ (B - A),它会同时保留两个多边形各自独有的部分,这和你要的“仅保留大多边形中去掉交集的部分”完全不符。

正确实现

你需要用Shapely的difference方法,它的作用是从当前几何对象中减去与另一个几何对象的重叠区域,正好匹配你的需求。

假设ref['geometry']是你要保留的“大多边形”,修改后的代码如下:

from shapely.geometry import shape,Polygon,MultiPolygon,mapping
import geopandas as gpd

g1 = geomap
g2 = geomap_world

data=[]
for index, orig in g1.iterrows():
    for index2, ref in g2.iterrows():
        if ref['geometry'].intersects(orig['geometry']):                
            # 从大多边形ref中减去与orig的交集部分
            data.append({'geometry': ref['geometry'].difference(orig['geometry'])}) 

df = gpd.GeoDataFrame(data,columns=['geometry'])

关键注意点

  • 确认好谁是“大多边形”:如果你的目标大多边形是orig['geometry'],则把代码改成orig['geometry'].difference(ref['geometry'])
  • 生成的带洞多边形会以Polygon类型存储在GeoDataFrame中,Shapely会自动维护多边形的洞信息;如果结果包含多个独立区域,会返回MultiPolygon类型,GeoPandas也能正常处理

内容的提问来源于stack exchange,提问作者bravopapa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:40:31