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

如何在Python中合并Geopandas数据集中相邻接触的多边形?

合并Geopandas中相邻(互相接触)的多边形

我有一个Geopandas数据集,想要将其中**相邻(互相接触)**的多边形合并为单个多边形。合并前后的效果如下:

合并前后多边形对比

需要注意的是,合并结果为两个多边形——图中的黄色小区域互相接触,因此会被归为一个整体。

测试用示例数据

import pandas as pd
from shapely import geometry

df = pd.DataFrame({"id":["poly_b1","poly_b2","poly_b3","poly_a"],
                  "geom":[geometry.Polygon([(3, 0), (3, 3), (5, 3), (5, 0)]),
                          geometry.Polygon([(0, 0), (3, 10), (3, 0)]),
                          geometry.Polygon([(5, 3), (5, 5), (7, 5), (5, 0)]),
                          geometry.Polygon([(15, 13), (15, 15), (17, 15), (15, 10), (12,2)])]})

解决方案

要实现相邻多边形的合并,核心是先识别出所有互相接触的多边形组(连通分量),再按组合并。具体步骤如下:

  1. 导入依赖库并转为GeoDataFrame
    首先将普通DataFrame转为GeoDataFrame,方便进行空间操作:

    import geopandas as gpd
    import networkx as nx
    
    # 转为GeoDataFrame
    gdf = gpd.GeoDataFrame(df, geometry='geom')
    
  2. 识别相邻多边形对
    通过空间连接筛选出所有互相接触的多边形:

    # 空间连接,找出所有接触的多边形对
    adjacent_pairs = gpd.sjoin(gdf, gdf, how='inner', predicate='touches')
    # 去重,避免重复记录(如A-B和B-A)
    adjacent_pairs = adjacent_pairs[adjacent_pairs.index_left < adjacent_pairs.index_right]
    
  3. 构建连通分量分组
    用图结构找出所有连通的多边形组(即互相接触的多边形集合):

    # 构建无向图
    graph = nx.Graph()
    graph.add_nodes_from(gdf.index)
    graph.add_edges_from(zip(adjacent_pairs.index_left, adjacent_pairs.index_right))
    
    # 给每个多边形分配组ID
    group_mapping = {}
    for group_id, component in enumerate(nx.connected_components(graph)):
        for idx in component:
            group_mapping[idx] = group_id
    
    gdf['merge_group'] = gdf.index.map(group_mapping)
    
  4. 按组合并多边形
    使用dissolve方法按组合并多边形:

    # 按组合并,同时保留原ID信息
    merged_result = gdf.dissolve(by='merge_group', aggfunc={'id': ', '.join})
    

结果说明

运行后merged_result中会包含两个行:

  • 一行对应poly_b1、poly_b2、poly_b3合并后的多边形
  • 另一行对应独立的poly_a

如果需要处理重叠或交叉的多边形,只需将空间连接的predicate参数改为'intersects'即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:36:18