在GeoPandas中合并重叠几何并保留对应最小索引
解决GeoPandas合并重叠多边形并保留最小Index的问题
要实现将重叠多边形合并为MultiPolygon并保留组内最小原index,核心是先识别出所有空间连通(重叠/相交)的多边形组,再按组聚合。以下是具体步骤和代码:
步骤1:准备数据并构建空间邻接矩阵
首先将原index转为列(避免后续操作丢失),然后通过空间连接找到所有相交的多边形对,构建邻接矩阵用于识别连通组:
import geopandas as gpd from scipy.sparse import csr_matrix from scipy.sparse.csgraph import connected_components # 将原index转为列,方便后续聚合取最小值 gdf = gdf.reset_index().rename(columns={'index': 'original_index'}) # 空间连接找到所有相交的多边形对 spatial_join = gpd.sjoin(gdf, gdf, how='inner', predicate='intersects') # 构建稀疏邻接矩阵 rows = spatial_join.index_left.values cols = spatial_join.index_right.values adj_matrix = csr_matrix(([1]*len(rows), (rows, cols)), shape=(len(gdf), len(gdf)))
步骤2:识别连通组并分组聚合
通过连通分量分析给每个重叠多边形组分配唯一ID,再按组聚合,保留最小原index并合并几何:
# 计算连通分量,得到每个多边形所属的组ID _, group_labels = connected_components(csgraph=adj_matrix, directed=False) gdf['group_id'] = group_labels # 按组聚合:取最小原index,合并几何为MultiPolygon result = gdf.groupby('group_id').agg( original_index=('original_index', 'min'), geometry=('geometry', lambda x: x.unary_union) ).reset_index(drop=True) # 将最小原index设为结果的index(可选) result = result.set_index('original_index')
关键说明
- 你之前使用
dissolve无效的原因是缺少正确的分组键:按原index分组时每个行都是独立组,不分组则所有行合并为一组。 - 若仅需合并严格重叠(排除完全包含/相邻)的多边形,可将
sjoin的predicate参数改为overlaps。 - 合并后的几何会自动处理为MultiPolygon(若组内多个多边形)或单个Polygon(若组内只有一个多边形)。
内容的提问来源于stack exchange,提问作者Nolan Cardozo
相关产品推荐
相关产品推荐

