ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

QGIS线要素分割与合并全攻略:从工具入口到实战避坑

QGIS线要素分割与合并全攻略:从工具入口到实战避坑 QGIS里处理线数据我遇到最多的需求就是两个把一条长线切成若干段或者把一堆断线拼成一条整线。新手刚接触的时候打开工具箱翻半天找不到入口要么工具栏里点来点去不出结果要么分割合并后属性全乱了。这篇博文把线要素分割和合并这件事讲透从工具入口、参数设置到常见坑位一条龙过一遍。需要说明的是这里说的是矢量线要素的分割跟图像处理里经常提到的语义分割、实例分割完全不是一回事别搜错方向。这组操作在路网整理、河网提取、管线编辑、行政边界匹配这些场景里非常高频。道路按行政区分段统计里程河流按桩号切开做巡河点位管理供水管道按巡检片区重新合成一条干线全都绕不开分割和合并。想把这些数据搞好光会点按钮不够还得懂背后的几何逻辑和属性继承规则。这篇内容我按五块来写先讲场景和准备再分别拆解分割与合并的几种主流玩法接着给一个行车数据整理的完整案例最后把最有代表性的几个报错和坑位列出来。1. 先搞清楚线要素的分割与合并解决的是什么麻烦1.1 典型使用场景快速判断拿我接触过的实际项目来举例子。市政管线数据经常按施工批次存储同一条供水干管被拆成十来个要素而道路数据相反一条省道可能是从CAD里转过来的整条线带着几百个顶点挤在同一个要素里。前者需要的操作是合并后者需要的是分割。场景与工具对应关系大概是这样业务场景要解决的问题优先使用的工具路网按乡镇边界切分一条长路按边界线分成多段用线切割线工具道路按桩号分段管理每500米或1公里一段按长度分割线河流在桥梁位置打断桥墩所在点作为切割点按点分割线/手动分割加捕捉管线施工段合并为干线把几十条短管连成一条完整管线融合工具/合并选中要素提取的河网断线连接把断断续续的河段拼成连续线捕捉后合并选中要素统一线方向做流向分析全部线从上游指向下游反转线方向/方向重算工具遇到具体需求的时候先对照这个表能少走很多弯路。很多初学者一上来就点“合并”结果发现两段线根本没有公共端点合并完了变成一个多部件要素那不是你想要的。1.2 动手前必须做的三件小事先说第一件事备份。在QGIS里做编辑操作不光是分割合并任何矢量修改都建议先复制一份数据或者另存一个备份文件。编辑操作一旦保存撤销栈清空想恢复就只能靠备份了。我的习惯是重要数据在动手前开一个QGZ工程副本或者把原始shp复制一份放到同级目录命名为“xxx_原始备份”。第二件事是确认图层可编辑。这个太基础但出错率极高。分割按钮灰着、点击无反应八成是没进入编辑模式。在图层列表里选中线图层右键点“切换编辑状态”或者直接按快捷键CtrlE部分版本是右键菜单里的开头第一个图标工具栏上的编辑按钮会亮起。检查一下当前选中的图层确实是你想改的那个尤其是工程里同时加载了多个线图层时手一抖改错图层的事情经常发生。第三件事是打开捕捉设置。分割的时候想让分割点精准落在某个折点、端点或交叉点上不依赖捕捉的话鼠标很容易“差一点点”。项目菜单里找到“捕捉选项”勾选“启用要素捕捉”默认容差建议选像素而不是地图单位数值给到10左右比较顺手。捕捉类型把“端点”“折点”都勾上这样鼠标靠近时会自动吸附到线的顶点和端点分割精度高很多。1.3 坐标系设置顺手说一句有朋友问QGIS软件如何设置2000坐标系这其实和分割合并本身没有直接关系但它影响距离计算和长度分割的准确性。如果图层本身是WGS84经纬度坐标你按长度分割的时候输入“1000”表示的是1000度那肯定不对。在工程右下角或“属性”里把坐标系设置为CGCS2000对应的投影坐标系比如3度分带、中央经线对应你所在区域的带号再去做按长度分割长度单位才是米。坐标系的正确设置是一切量算操作的前提。2. 线要素分割四条路总有一条适合你2.1 手动分割工具最灵活也最容易用错工具栏上最常用的分割工具叫“分割要素”图标是两条线被一个红点断开的样子在高级数字化工具栏里。如果你的界面上找不到在“视图”菜单的“工具栏”里把“高级数字化工具栏”勾选出来。操作流程是这样的先把线图层切换为编辑状态然后选中你要分割的那条线如果不选中工具会对图层里的所有线生效容易误伤点击“分割要素”工具鼠标变成十字光标在线上你想断开的位置单击一下右键结束操作。看着很简单但有很多细节需要注意。首先分割线必须真正穿过被分割的线如果只是点在线的某个顶点上、没有从线的一侧进另一侧出QGIS会认为没有完成有效分割。其次按一下鼠标只会在那个交点上把线切开右键结束整个操作一次可以切很多刀。另外分割之后每条子线都保留原始要素的属性这一点和很多人的预期不同属性会复制到所有子段上。我实际用下来觉得手动分割最爽的场景是沿着一条路上的R角、路口、桥墩等肉眼可辨的位置切几刀。缺点是当你要切几十个点时效率太低那种工作量应该用下面要讲的自动分割工具。2.2 按固定长度分割快速分段利器把一条几公里长的公路按500米一段切开或者把管网按100米均分用“按长度分割线”是最省事的。这个工具在处理工具箱里搜索“分割”两个字就能看到全名叫“按长度分割线”。参数很简单输入线图层、设定最大长度运行后会生成一个结果图层。单位跟随图层坐标系如果你的数据是CGCS2000投影坐标系输入500就是500米如果是经纬度输入500就是500度这就是我前面强调坐标系的原因。具体执行原理是先沿着线从头累加距离每累加到指定长度就切断一次剩余不满一个完整长度的部分作为最后一段保留。举个例子一条2520米的路按500米分割会得到6段500、500、500、500、500、20。最后那个20米的碎段往往需要单独处理它确实比较短如果你希望最后一段不要这么碎可以调整分割长度。实际处理道路数据时我一般会先用“字段计算器”统计一下该要素总长度再考虑合理的分段长度而不是随手填一个数字。这个工具默认生成一个新图层不修改原始数据这点设计得很安全。生成后如果没问题可以右键图层导出为shp或者只拷贝要素回原始图层。2.3 按点位分割在交叉口、桥墩、站点精确切开这里说一个很多新手不知道的事分割点不是必须自己去画可以先用点图层把切割点准备好再一次性把线在这些点上切开。QGIS处理工具箱里有“按点分割线”的算法操作上可以选GRASS的组件具体位置在不同版本里偶尔会变但搜索“split lines”基本能找到。点源数据可以是手工创建的点图层也可以从线的折点提取出来的点或者用“提取交叉点”按钮把同图层中相交的点提取出来。最关键的是点必须精确落在线上否则工具会报错或忽略该点。如果你的点与线之间存在微小偏移先跑一遍“按位置对齐几何图形”把点吸附到线上去容差设个1到5米视数据精度而定。没有人提到的一个坑是按点分割线工具的很多实现版本要求线图层没有“Z值”或“M值”如果你的线是从CAD带高度信息导入的系统会提示“算法不支持Z/M值”。解决办法是用“去除几何的Z值”先把几何降维再执行分割。2.4 用另一个图层切割适合按边界分线当你手里有现成的边界图层比如行政区边界、地块边界、规划分区时“分割图层”比手动分割高效得多。选中处理工具箱里的“分割图层”算法它允许你用某个线图层的所有线段对另一个线图层做切割效果相当于用刀模批量切出边界线。我去年做一个县级的道路里程统计全县境内的国省道就是被乡镇边界线这么切的乡镇边界shp作为分割图层道路shp作为目标图层运行一次每条路就被切成了与乡镇边界相交的若干段然后按乡镇编码统计里程数据精准还能对得上台账。用这个工具要注意分割图层的范围最好和目标图层完全重叠如果边界线超出了你要分割的道路范围也不会出问题只是切不到的地方不产生效果。另外属性继承逻辑跟手动分割一样原始道路的属性会被完整复制到切出来的每段上。分割结果默认是临时图层记得导出保存。3. 线要素合并让断线变整线3.1 合并选中要素属性取舍要心里有数合并线要素有两条路线工具栏的“合并选中要素”和处理工具箱的“融合”工具两者适用场景不同先说前者。在编辑状态下用箭头选择工具按住Shift依次点选两条或更多线要素然后点击编辑工具栏里那个“合并选中要素”的图标。这个图标长得像两条线汇入一个点不同版本的画法略有区别。点击后会弹出一个对话框问合并后的要素保留哪个源的属性。实际上对话框里会有所有选中要素的字段列表你可以勾选一个要素作为属性来源也可以手动填属性值。常见做法是选择其中任一条的ID、道路名称、类型等属性。合并的几何结果取决于两条线是否共享端点。如果两条线的端点完全重合合并后会生成一条连续的线如果两条线之间是断开的哪怕只有一小段距离合并出来的结果是一个MultiLineString也就是多部件线要素。看起来很像是两条线但它们已经被绑定在一个要素里了。这一点很多人没意识到在后续做空间查询、导出CAD、计算总长度时显示和结果都符合一个要素的规则但拿到ArcGIS或其他软件里它就是一个多部件要素不是真正意义上的连续单线。3.2 多部件问题与解决办法确保线段首尾相连多部件线在不合并不相邻要素的前提下是可以规避的。核心办法是提前捕捉端点让两条线真正共用一个节点。高级数字化工具栏里有一个“顶点点位”工具或者直接编辑折点将断线的端点拖拽到另一条线的端点附近配合捕捉设置光标会自动吸附到最近邻的端点上。如果你手里已有大量的断线不想一条一条拖可以用GRASS工具里的“v.clean”操作参数选择“break”和“rmdupl”先把重叠线和伪节点清理掉再执行融合。不过GRASS工具对初学者不太友好参数多且术语偏底层。还有一个很实用的组合方案先用“修复几何”保证所有线段几何有效再运行“融合”工具把同属性的线段全部融合最后用“多部件转单部件”把融合结果拆开再去检查是否有Segments连接异常。这一套流程在批量道路合并场景里非常值得保存下来复用。3.3 融合工具按属性快速合并成片工具箱里的“融合”工具是做批量合并的主力它的特点是按字段值分组。比如路网数据中每段道路都有“道路名称”字段几百条线段想按道路名合并成一条条完整道路用“融合”瞬间完成。参数很简单输入图层后可以选择按一个或多个字段分组不选字段的话会把图层内所有线融成一条。融合的行为逻辑值得展开说。如果两条线段首尾相连融合后自然连成一条单线如果存在重叠或相交但端点不重合的情况融合会尝试在交点处打断并合并处理得当会生成正确结果处理不当则可能出现无效几何。所以融合完成后强烈建议运行“检查有效性”工具看看有没有自交、重复节点等问题。融合还有一个容易被忽略的地方它保留的字段是分组字段和统计字段。如果不设置分组字段融合后只剩一条线所有其他属性都消失。如果设置了分组字段最终每一个分组保留分组的唯一值。如果你希望合并后保留其他属性比如道路等级、宽度、路面类型这些属性应该先通过“按位置连接属性”或字段计算器合并到分组字段所在的任一段线上再去融合。3.4 合并后的整理线方向、节点检查一个不能少合并完成后经常出现线方向混乱的问题。比如两条道路一条从北向南画另一条从南向北画合并后方向取决于你选中的第一个要素或融合时的输入顺序整条线的走向是不确定的。做管线流向、河流分析时线方向错了结果就全错了。QGIS里有专门的方向处理工具高级数字化工具栏里的“反转线方向”先选中线要素点击即可反向。如果要批量给整个图层统一方向处理工具箱里有“重算线方向”算法它会从线的起点出发尽量让每段线朝向同一个趋势不过它只保证单要素内部一致性不保证不同要素之间的逻辑方向。另有一个更简单的小技巧在属性表里加一个字段用“$x_at(0)”和“$y_at(0)”分别取每条线的起点坐标再结合上下游判断人工批量调整。合并后的节点检查也同样重要。生成的多部件要素、残留的伪节点都可能让拓扑关系异常。用“拓扑检查器”插件加载线图层后选择“必须被覆盖”“不能相交”等规则能快速定位问题。修复时可以直接在编辑状态下使用“修复几何”。4. 案例实操把乱糟糟的道路数据处理干净这一节我用一个完整案例把前面讲的技术串起来。假设手里有一个从CAD转来的县城道路shp文件坐标系是CGCS2000存在两个问题一是同一条路被截成几十段形状破碎二是跨乡镇要素没有在乡镇边界处打断无法按乡镇统计里程。目标是把每条道路合并为完整线然后在乡镇边界处切分。4.1 数据准备与坐标系设置打开QGIS先从菜单“图层”里加载道路shp和乡镇边界shp。右键道路图层打开“图层属性”切换到“信息”或“源”标签页确认坐标系。如果显示的是EPSG:4490或EPSG:4547这类CGCS2000系列坐标说明坐标没问题如果看到的是GCS_WGS_1984或其他需要重投影或指定正确的坐标系。假设当前图层坐标系已经正确工程坐标系如果没有自动设置可以右键单击图层选择“在画布上设置CRS”把工程CRS切换到和图层一致。如果图层确实没有坐标系而你知道它应该是2000坐标系的某个投影带可以在“图层属性”的源设置点“从CRS列表中选择”输入“CGCS2000”再找到所在地区的投影坐标系确认。这是处理所有量算问题的关键一步必须在分割合并前做好。4.2 按道路名称合并切换道路图层为编辑状态打开属性表查看是否有一个字段能唯一标识道路比如“道路名”或“编号”。如果没有先加一个字段把分散路段归到一个统一名称里。接着打开处理工具箱输入“融合”在参数框里选择图层为道路shp字段勾选“道路名称”字段。运行之后生成临时结果图层加载到画布检查可以看到每条命名的道路已经变成了一条完整的线。如果某条路合并后是完全的单一连续线恭喜你。如果出现零星的多部件线多半是道路本身在某些位置断开需要用“捕捉对齐”或者手动编辑端点把这些空隙接上再重新融合。这个环节最容易在匝道、立交桥位置翻车因为高架和地面道路在平面投影上看起来相交实际上并不相连。4.3 在乡镇边界处分割调整完合并结果之后对新的融合结果图层执行分割。处理工具箱里找到“分割图层”目标图层选融合后的道路线分割图层选乡镇边界线。运行后会生成一个切分结果图层道路在边界相交处被切开了。注意分割后不要直接认为万事大吉。因为有的乡镇边界线和道路的相交点与道路顶点不在同一位置分割工具自动定位交点后会产生新的折点这是正常现象。但需要检查每个要素的属性看ID是否保留以便后面按乡镇区域做空间连接统计。如果统计需求是要得到道路在每个乡镇内的里程打开“字段计算器”对分割结果添加一个自增字段然后使用“按位置连接属性”将乡镇名称连接到切分段上最后按乡镇字段计算道路长度总和搞定。4.4 检查验证与输出完成分割合并之后我习惯做一轮完整检查第一看属性表里是否有无效几何。运行“检查有效性”工具输出图层如果出现错误记录用“修复几何”处理。第二检查分割处是否产生重复点。用拓扑检查器跑一遍“不能有重复”把重复节点清掉。第三确认长度字段准确。用字段计算器给每个切分后的路段添加长度字段公式输入$length单位是图层坐标系单位算出来的结果与台账对一下。确认无误后右键结果图层导出为shp或GeoPackage保存。注意shp对字段名长度有限制字段名超过10个字符会被截断建议用GeoPackage格式保存。5. 高频问题与避坑笔记5.1 分割按钮为什么是灰色的这个问题排名第一。主要原因有三个图层没有进入编辑状态图层是临时生成的Virtual Layer或只读图层或者当前选中的图层类型不是线图层比如选中了面图层。解决办法依次是先检查图层是否编辑状态然后看图层类型最后看看数据是否存在只读位置比如文件没有写权限。另外一些工具在QGIS处理工具箱里是只读算法不经过编辑状态也能运行比如按长度分割线但“分割要素”这种手工工具必须开启编辑。5.2 捕捉设置里的三个参数“启用要素捕捉”开关、容差值和捕捉类型是三个最关键的地方。容差值建议在“像素”和“地图单位”之间按场景切换做精细编辑用像素值做较大范围的捕捉用地图单位。捕捉类型勾选“端点”和“折点”一般足够需要捕捉线段中央时再勾选“中点”。很多人分割不精准往往是容差设成了0也就是关闭捕捉。容差设太大会导致你明明想把分割点放在某个顶点附近系统却自己吸附到了更远的另一个点上所以这个值要按比例微调。5.3 合并后怎么多了个MultiLineString这个问题我在前面已经反复强调根源是参与合并的线段首尾没有真正相连。解决办法不是回到合并工具里重试而是先把端点补到同一个节点。建议打开“捕捉选项”勾选“端点”然后编辑其中一个要素的顶点把端点拖到另一个要素的端点上或者用“合并”之后执行“多部件转单部件”再检查连通性。如果检测到多个部分再用“修复几何”配合手动编辑。5.4 实用速查记忆表把常用的几个工具整理成一个表贴在屏幕上随时对照工具名称入口适用场景输出方式分割要素高级数字化工具栏手工在指定位置切分直接修改原图层按长度分割线处理工具箱按固定距离均分长线生成新图层按点分割线处理工具箱/GRASS按点图层批量打断生成新图层分割图层处理工具箱用边界线切割目标线生成新图层合并选中要素编辑工具栏少量线段手动合并直接修改原图层融合处理工具箱按字段批量合并生成新图层多部件转单部件处理工具箱拆分多部件要素生成新图层修复几何处理工具箱修正无效几何生成新图层这个表覆盖了线要素分割合并的大部分日常需求。这轮操作下来我的体会是线要素编辑的核心不是记住按钮在哪而是理解三个点捕捉决定精度属性继承决定信息含金量拓扑关系决定结果能不能被别人用。每次处理共享数据之前我仍然会先把备份复制出来再一点点调整捕捉设置等到跑完有效性检查才敢往外发。你在这个环节里踩过的坑多半都能从上面这几个问题中找到影子。
返回列表