v.clean 是 GRASS GIS 中用于自动修复矢量数据拓扑错误的核心工具,集成于 QGIS 中。它不改变数据原始几何语义,而是通过一系列可组合的清理工具来修正常见拓扑缺陷(如未闭合、自相交、悬挂线、重复节点、角度畸变等),从而为后续分析(如 v.overlay、面积统计、网络分析)提供拓扑健全的矢量数据。
核心概念
拓扑(Topology):指要素间的空间关系(如“线端点落在多边形边界上”“两线在交点处真正共享一个节点”),而非仅靠视觉重叠。GRASS 要求边界必须由多个线段在精确同一坐标处连接,否则无法构建有效多边形。
type= :
- line:处理普通线(如道路、河流),不参与构面;
- boundary:专用于构成多边形边界的线(必须成环、无悬挂、无重叠);
- 混用 type=line,boundary 可能导致意外结果(例如 snap 对 boundary 过度修正会撕裂多边形)。
threshold 单位:
- 对 snap、rmdangle、prune 等工具 → 地图单位(需采用投影坐标系);
- 对 rmarea → 强制为平方米(m²);
- 对 break/bpol/rmdupl/rmsa 等 → 阈值被忽略,填 0 即可(仅占位)。
错误输出(error=):生成一个独立图层,包含所有被识别/修改的异常几何(如悬挂端点、小角度节点、零长线),是质量检查的关键依据。
break 工具
官方定义
tool=break:在所有线与线(或边界与边界)的交点处打断线段,并打断塌陷的环(collapsed loop),例如坐标序列 0,0 → 1,1 → 0,0(首尾重合但非闭合环)会被在 (1,1) 处打断。
实际作用
假设两条线交叉:
Line A: (0,5) —— (10,5) ← 水平线
Line B: (5,0) —— (5,10) ← 垂直线
执行 v.clean input=lines output=broken tool=break type=line 后:
交点 (5,5) 成为新节点;
Line A 被拆为 (0,5)→(5,5) 和 (5,5)→(10,5) 两段;
Line B 被拆为 (5,0)→(5,5) 和 (5,5)→(5,10) 两段。
典型应用场景
提取交叉点:配合 error= 参数,break 会将所有交点写入 error 图层:
预处理 Shapefile:Shapefile数据导入后边界经常未在交点处打断 → 必须先 break 再 rmdupl(去重)才能构建有效多边形。
snap 工具
官方定义
tool=snap:将一个顶点在指定阈值内吸附到另一个顶点(仅限“已有顶点”,不是吸附到线段上)。若某顶点周围 threshold 范围内无其他顶点,则不操作。
算法行为
顶点 A 距离顶点 B ≤ threshold:A 被移动至 B 的精确坐标(A 与 B 合并)
顶点 A 距离任意其他顶点 > threshold:A 位置不变
顶点 A 靠近一条线段中点(但附近无顶点):snap 不支持线段吸附
操作注意事项
- 对 boundary 类型慎用!
- 若 threshold 过大(如 10),可能导致相邻多边形的边界顶点被错误吸附,造成多边形撕裂、重叠或空洞。
- 必须后处理:snap 后常产生小角度(acute angles)、重复线段,因此必须接 break,rmdupl,rmsa 处理工具。
其他常用工具
rmdangle: 删除长度 ≤ threshold 的悬挂线(dangle)
chdangle:将悬挂边界(dangling boundary)改为 line 类型(不删除)
rmbridge:删除连接岛屿(island)与外多边形的“桥接线”(OGC 不允许的拓扑)
bpol:专为 Shapefile 设计:在多边形共享节点处打断边界(比 break 更高效)
prune:简化线/边界:移除距离其邻接线段过近的顶点(保拓扑)
rmsa:删除“计算角度为 0°”的极小角度(如 0.001°)
rmdupl:删除完全重合的几何(点/线/边界坐标全同)
rmline:删除长度为 0 的线/边界(如重复点构成的线)
更多GIS算法问题,欢迎留言或联系我们。转载须注明出处。