如何使用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
相关产品推荐
相关产品推荐

