如何在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)])]})
解决方案
要实现相邻多边形的合并,核心是先识别出所有互相接触的多边形组(连通分量),再按组合并。具体步骤如下:
导入依赖库并转为GeoDataFrame
首先将普通DataFrame转为GeoDataFrame,方便进行空间操作:import geopandas as gpd import networkx as nx # 转为GeoDataFrame gdf = gpd.GeoDataFrame(df, geometry='geom')识别相邻多边形对
通过空间连接筛选出所有互相接触的多边形:# 空间连接,找出所有接触的多边形对 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]构建连通分量分组
用图结构找出所有连通的多边形组(即互相接触的多边形集合):# 构建无向图 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)按组合并多边形
使用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
相关产品推荐
相关产品推荐

