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

如何使用GeoPandas查找相交多边形并执行合并操作?

用GeoPandas合并相交的多边形

要实现检查GeoDataFrame中相交的多边形并合并,核心思路是识别所有互相连通的多边形组(即相交或通过其他多边形间接连通的集合),再按组合并几何。以下是具体实现步骤:

步骤1:准备环境与数据

首先导入依赖库,并确保GeoDataFrame的几何列正确设置:

import geopandas as gpd
from shapely.ops import unary_union
import networkx as nx

# 假设数据已读入为gdf,显式设置几何列(若未自动识别)
gdf = gdf.set_geometry('geom')

# 可选:修复无效几何(避免相交判断出错)
gdf['geom'] = gdf['geom'].make_valid()

步骤2:识别相交的多边形组

通过空间自连接找到所有相交的多边形对,再用图结构构建连通组件(把所有互相连通的多边形归为同一组):

# 空间自连接:筛选所有相交的多边形对(排除自身匹配)
intersection_pairs = gpd.sjoin(gdf, gdf, how='inner', predicate='intersects')
intersection_pairs = intersection_pairs[intersection_pairs.index_left != intersection_pairs.index_right]

# 构建图结构:多边形为节点,相交关系为边
graph = nx.Graph()
graph.add_nodes_from(gdf.index)
# 添加相交边
edges = list(zip(intersection_pairs.index_left, intersection_pairs.index_right))
graph.add_edges_from(edges)

# 生成连通组件,给每个多边形分配组ID
component_groups = list(nx.connected_components(graph))
group_mapping = {}
for group_id, component in enumerate(component_groups):
    for idx in component:
        group_mapping[idx] = group_id

# 为原GeoDataFrame添加组ID列
gdf['group_id'] = gdf.index.map(group_mapping)

步骤3:按组合并多边形

使用dissolve方法按组ID聚合,用unary_union合并同组的多边形几何:

# 按组合并:保留原索引列表,合并几何
merged_gdf = gdf.dissolve(
    by='group_id',
    aggfunc={
        'index': list,  # 保留原多边形的索引集合
        'geom': unary_union  # 合并同组几何
    }
).reset_index(drop=True)

结果说明

  • 合并后的merged_gdf中,每一行对应一组合并后的多边形:
    • index列是原GeoDataFrame中属于该组的所有索引(示例中会出现[6,10]和[2,4]的组)
    • geom列是合并后的单一多边形
  • 不与任何其他多边形相交的个体,会单独成为一行,最终结果行数符合预期(示例中10行→8行)

可选优化

  • 若仅需判断直接相交(不处理间接连通的情况),可简化逻辑,但连通组件的方式更适配多数场景(比如A与B相交、B与C相交,三者会被合并为一个多边形)
  • 若不需要保留原索引,aggfunc可仅保留geom: unary_union

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:24:40