无公共属性字段时如何自动合并相邻矢量多边形
基于相邻关系合并多边形的自动化处理方案
你可以通过两种方案实现无公共属性下按邻接关系合并多边形,完全可以自动化批量处理,不需要手动操作:
方案1:QGIS内置工具组合实现(零代码)
不需要额外安装组件,直接用QGIS自带工具按以下步骤操作即可:
- 给原始多边形图层新增唯一标识字段:打开字段计算器,新建整型字段
orig_id,表达式填$id,给每个要素分配唯一ID。 - 识别邻接关系:调用「按位置连接属性」工具,输入层和连接层都选原始多边形图层,几何谓词勾选
touches(触碰),运行后即可得到每个要素对应的所有邻接要素ID。 - 分配连通组ID:调用「连通分量分析」工具,基于邻接关系给属于同一连通域(互相相邻)的所有多边形分配同一个
group_id字段值。 - 执行溶解:调用「溶解(dissolve)」工具,选择按
group_id字段溶解,即可得到所有相邻多边形合并后的结果,非相邻多边形不会被合并。 - 后续筛选:给溶解后的结果图层新建面积字段,表达式填
$area / 1000000即可得到平方公里为单位的面积,直接筛选数值大于100的要素即可。
方案2:PyQGIS脚本批量自动化(适合大文件/多文件处理)
如果需要处理大量文件,可以直接使用以下脚本批量执行,依赖networkx库处理连通关系,运行前在QGIS对应的Python环境中执行pip install networkx安装即可:
from qgis.core import * import networkx as nx # 替换为你的矢量文件路径 input_path = "your_input_file.shp" # 替换为你的输出文件路径 output_path = "your_output_dissolve.shp" # 加载图层 layer = QgsVectorLayer(input_path, "raw_polygons", "ogr") if not layer.isValid(): raise ValueError("图层加载失败,请检查文件路径") # 构建邻接关系图 adj_graph = nx.Graph() # 添加所有要素为图节点 for feature in layer.getFeatures(): adj_graph.add_node(feature.id()) # 匹配邻接要素添加边 for feat_a in layer.getFeatures(): geom_a = feat_a.geometry() for feat_b in layer.getFeatures(): # 避免重复判断 if feat_a.id() >= feat_b.id(): continue if geom_a.touches(feat_b.geometry()): adj_graph.add_edge(feat_a.id(), feat_b.id()) # 识别连通分量,分配组ID group_id_map = {} for group_idx, component in enumerate(nx.connected_components(adj_graph)): for fid in component: group_id_map[fid] = group_idx # 给图层新增group_id字段并赋值 layer.startEditing() layer.addAttribute(QgsField("group_id", QVariant.Int)) layer.updateFields() for feat in layer.getFeatures(): feat["group_id"] = group_id_map[feat.id()] layer.updateFeature(feat) layer.commitChanges() # 执行溶解操作 processing.run("native:dissolve", { "INPUT": layer, "FIELD": ["group_id"], "OUTPUT": output_path })

内容的提问来源于stack exchange,提问作者Anu Rai
相关产品推荐
相关产品推荐

