ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GIS多边形自相交检测与导出实操:ArcGIS完整指南

GIS多边形自相交检测与导出实操:ArcGIS完整指南 做GIS数据处理这些年有一个问题几乎每个项目里都会碰上那就是“多边形自身相交”。你打开图一看某个地块或某条河流面好像只是拐了个弯没什么大毛病可一旦运行“检查几何”或者做拓扑验证系统立刻在你脸上甩出一堆Self-Intersection错误。更麻烦的是项目方往往要求把这些自身相交的数据单独导出来要么作为整改清单要么交给外业去核实。我之前带过好几个数据质检项目几乎都卡在“怎么把这些违法几何快速捞出来”这一步。这篇就把检测、导出、修复的完整流程掰开揉碎讲清楚不管你是用ArcMap还是ArcGIS Pro照着做就能把自身相交数据单独提出来不再跟一堆非法几何纠缠。正在做数据清洗、数据质检或者接到别人传过来的“脏数据”而不知从何下手的GIS从业者这篇应该能帮到你。1. 先把“自身相交”和“导出”这两个概念搞清楚1.1 什么是多边形自身相交多边形在GIS里的定义并不仅仅是一圈闭合的线段。一个合法的面要素它的边界环是连续且不相交的内部区域保持完整。而自身相交指的是一个环在空间上和自己交叉形成一个类似“8”字形或者蝴蝶结的轮廓。你可以想象一下一根鞋带摊在桌上中间打了个绳结绳结处两条线交叉穿透这个交叉点在数学意义上让面变得非法了。这里面有一个容易被新手忽略的点很多自相交图形肉眼看起来是正常的。比如一个地块因为弧段转折太多其中一小段弯折回来和邻近的边线发生了微小的交叉这种交叉幅度可能只有几厘米甚至更小在普通比例尺下根本看不出来。但数据的几何合法性不受视觉影响只要边界有交叉点它就会在空间计算时产生歧义——系统不知道该把交叉点周围的区域算进面内还是排出面外。1.2 自相交数据是怎么来的我在实际项目里总结了一下自相交数据的来源大概有这么几类CAD数据转GIS这是最常见的情况。CAD图纸里的封闭多段线Polyline常常存在重复点、回头线、交叉线直接转成面要素后自相交几乎是必然产物。手动画图或编辑时误操作在编辑状态下用“整形要素”Reshape Feature工具拖拽边界时把边线拖过了头拖回到已有多边形内部就会产生自相交。坐标转换和投影数据从地理坐标系转到投影坐标系或者做动态投影时由于坐标值精度变化有些顶点会发生微小位移原本正常的弧段边缘被“挤”出交叉点。程序自动生成或批量处理后遗症比如用脚本批量生成缓冲区、用工具批量合并要素算法在某些临界顶点上的处理不够完善也会制造出非法几何。搞清楚来源的意义在于导出自相交数据之后你要知道该去修复哪一层的原始问题。如果是CAD转换造成的修复的是转换参数如果是投影造成的修复的可能是坐标系统的定义。否则今天改完这500个明天又重新生成500个永远处理不完。1.3 为什么非要把它们导出来有朋友可能会问直接在原图层上把错误修掉不就行了为什么要多此一举先导出这里面的原因很实际审计和留痕数据质检流程要求把问题要素单独立档形成问题清单修复后还要对比前后差异。没有单独的导出数据审计就说不清楚。外业协作很多疑难自相交需要到现场核对问题数据必须导出成独立图层交给外业人员装进移动设备里使用。避免误改直接在原始大数据里改很容易牵连到相邻要素尤其在地籍、林地、水域这类数据里改一个多边形还可能影线相邻图斑的公共边界。先导出问题要素等于把操作范围圈定在可控区域内。存档备查有些项目会要求把原始有问题的数据、导出的问题数据、修复后的数据一起归档形成完整的质量记录。所以“导出自身相交数据”不是额外的工作量它本身就是数据质量控制的标准动作之一。2. 检测自身相交要素的三种主流路线要把自身相交数据导出来第一步是确定哪些要素有问题。检测方法我列了三条路线分别适用不同场景你在实际项目里可以根据数据量和环境选。2.1 路线一用“检查几何”工具最快拿到问题清单ArcGIS自带一个“检查几何”Check Geometry工具位于工具箱的“数据管理工具”下的“要素”工具集里。这个工具会把输入要素类里的各种几何问题全部检查一遍输出一个表格其中“Problem”字段会具体标注问题类型比如“Self-Intersections”自相交、“Empty Geometry”空几何、“Bad Ring Order”环顺序错误等等。操作步骤很简单打开ArcToolbox或功能区上的“分析工具”找到“检查几何”。输入要素选择你要检查的图层。“几何属性”参数可以勾选多个检查项我一般全选宁可多检查几项也不要漏项。设置输出表格路径建议输出到与原始数据同一个文件地理数据库里。运行工具等待结果生成。工具跑完后输出表格里每一行记录对应原始要素的一个错误。这里注意如果一条要素同时存在两个几何问题它可能会在表格里占两行而不是合并成一行所以你的问题数量不等于错误行数后面做汇总时要留意。如果你是ArcGIS Pro用户工具位置和参数基本一致只是在界面面板的显示上会略有区别但核心逻辑完全一样。2.2 路线二用拓扑规则严丝合缝一条不漏“检查几何”适合快速摸底但如果要严谨地做拓扑质检尤其是针对复杂地类边界拓扑规则是更正规的做法。“拓扑”工具在数据管理工具集下它要求输入数据必须位于同一个要素数据集Feature Dataset里所以在建立拓扑之前需要把原始要素类放进一个要素数据集甚至要提前统一坐标系。建立拓扑的核心步骤是在Catalog里右键点击要素数据集选择“新建拓扑”New Topology。选择参与拓扑的要素类。添加规则这里选“不能自相交”Must Not Self-Intersect。如果你处理的是面图层也可以同时添加“不能互相重叠”Must Not Overlap规则把压盖问题一并查出来。设置容差。容差默认值通常是10的负几次方米要根据数据精度来设置不能随便调大否则会把原本合法的边界小转折误判成错误。完成向导后启动编辑并打开“错误检查器”Error Inspector选择要校验的规则点击“验证”Validate按钮系统就会列出所有报错的要素和错误位置。拓扑的优点是它不仅仅告诉你某个要素有自相交错误还能精确到错误发生的坐标位置甚至能定位到环上的具体某一段。缺点是自相交错误在很多场景下并不涉及两个不同要素所以拓扑错误记录对个人用户来说略显“重”。但如果你后续还要检查“不压盖线”这类要素间规则拓扑仍然是更标准的选择。2.3 路线三用Python脚本批量排查和处理如果你经常跟脏数据打交道或者动不动就是几十万条要素那用脚本是效率最高的。ArcPy可以调用检查几何工具也可以直接在游标里读取几何对象的状态来筛选。下面给一个简单的脚本示例用于遍历要素类并输出自相交要素的FIDimport arcpy arcpy.env.workspace rC:\data\demo.gdb fc parcels # 方法1直接调用检查几何工具 err_table arcpy.management.CheckGeometry(fc, in_memory\\geom_errors) print(检查完成错误表已生成) # 方法2用搜索游标逐一判断当前几何是否合法 with arcpy.da.SearchCursor(fc, [OID, SHAPE]) as cursor: for oid, shape in cursor: if not shape.isValid: print(非法要素OID:, oid)这段代码里的shape.isValid属性是ArcPy内置的合法性判断但它只告诉你几何是否合法并不能像检查几何工具那样精确告诉你错误类型是不是自相交。所以我的建议是先运行检查几何工具获得问题表再用Join或者Select By Attributes把原始要素筛选出来这在大数据量下远比一个个读几何更快。3. 导出自身相交数据的详细实操检测到了接下来就是重头戏怎么把自身相交数据真正导出来。这里我拆成三种情况讲基于检查几何结果导出、基于拓扑错误导出、还有大文件数据导出的策略。3.1 基于检查几何结果的导出步骤这是最常用的流程因为“检查几何”工具几乎谁都能跑而且很多ArcGIS安装包自带了它不需要额外的扩展模块。具体操作流程如下运行“检查几何”工具得到错误表格。假设表格名为geom_errors原始要素类是parcels。在ArcMap或Pro的内容列表里右键parcels图层选择“连接和关联”中的“连接”Join把错误表格连接到原始要素上。连接字段原要素的OBJECTIDArcMap里也可能叫FID对应错误表格里的INPUT_FID字段这是一一对应的关键。连接成功后对图层做“按属性选择”Select By Attributes查询条件类似geom_errors.PROBLEM Self-Intersections。如果你在中文环境下字段值可能是“自相交”具体要打开属性表看一眼实际值。选中这些要素后右键图层选择“数据”下的“导出数据”Export Data在导出对话框中把“导出”选项改成“所选要素”设置输出路径和名称点击确定。导出完成后建议把得到的要素类重新命名成类似parcels_selfintersect的格式方便后续识别。这里有一个容易翻车的细节连接的时候用的原要素FID在两个软件里的表现不一样。ArcMap里Shapefile的OBJECTID显示可能是“FID”而要素类的是“OBJECTID”ArcGIS Pro里统一叫OBJECTID。建议连接前先确认字段名避免连错字段导致选出来一堆不相干的东西。另外连接操作会把错误表格里的所有错误记录都带上来。如果一个原始要素有两条自相交错误记录在属性表里就会看到两行记录选择要素时虽然看起来是多条记录但导出的要素仍然是去重后的原始要素。这一点对导出结果没有影响但统计数量时会让你一脸懵所以我在项目里都会在导出后单独跑一次“频数统计”确认最终要素数。3.2 基于拓扑错误要素的导出如果是通过拓扑建立错误检查的那导出自相交数据其实更直接。因为拓扑验证完成后系统会在拓扑所属的要素数据集中生成一个“错误要素类”里面记录了所有拓扑错误的空间位置。ArcMap里的操作打开错误检查器点击“搜索”按钮把错误列出来右键任意一条错误记录可以执行缩放、平移等操作。要导出的话你可以选择错误记录后在右键菜单里找“导出为要素”Export To Features或者直接把错误要素类复制到目标位置。在ArcGIS Pro里错误检查器界面下方有“导出”按钮可以导出错误要素导出后同样会得到一个面或线要素类里面是带有错误类型字段的几何。这种方式的优势是问题要素的几何边界非常精确因为它记录的是交点附近的错误段而不仅仅是原始多边形整体。劣势是拓扑错误要素类的字段结构比较固定导出后还需要手工关联到原始图层才能拿到业务属性。所以我通常的做法是把错误要素导出一个临时文件然后按位置选择Select By Location原始图层里与之相交的要素再做一次导出。这样既保证了精确性又保住了业务属性。3.3 大文件数据导出的注意事项很多项目数据一上来就是几十万甚至上百万个多边形比如一个县的林地一张图、一个市的全要素地类图斑。这种量级下直接“图层右键→导出数据”很容易卡在进度条上一动不动或者干脆让ArcMap崩溃。我的经验是处理大体积自相交导出时要注意下面几件事优先用文件地理数据库。Shapefile在超过2GB会截断而且属性字段限制多大数据量下速度也不如FGDB。导出时输出位置直接选择文件地理数据库里的要素类。把临时图层精简到最小字段集。有些原始图斑字段动辄几十上百个导出时如果不需要全部字段可以在图层属性里先关闭不需要的字段或者用“字段映射”工具只挑必要的字段能减少IO压力。分块处理。如果一次选择出几万个自相交要素导致内存紧张可以按FID区间分批选择、分批导出最后用“合并”Merge工具合到一起。比如用MOD(OID, 10)0、MOD(OID, 10)1这种表达式把数据切成10份。地图里不要开太多图层。导出操作往往涉及图形刷新如果工程里叠着几十个图层内存占用会剧增。导出前把无关图层从内容列表里移除或关闭可见性能让操作顺畅很多。设置临时存储位置。在“地理处理选项”里把后台处理和临时工作空间指向本地SSD不要指向网络路径否则网络IO会成为瓶颈。有一回我处理一个600多万个多边形的全国图斑数据刚开始直接在原库上跑检查几何和导出跑了三个多小时没结果。后来我按省切成小块处理每个小块单独检查再导出最后把自相交要素合并成一个集合总体时间反而控制在了一个小时以内。所以在大数据量面前“分而治之”永远是最稳妥的思路。4. 导出之后修复与质量复核导出自身相交数据只是第一步更关键的是导出之后怎么把这些数据处理干净。这里讲的修复方法会直接影响你后续的空间分析结果。4.1 一键修复几何但别盲信ArcGIS里早就有“修复几何”Repair Geometry工具很多人的第一反应就是跑它。它确实能自动处理大量自相交问题但我要提醒你自动工具的修复结果不等同于业务条件的保存。修复几何的原理大致如下当检测到一个环存在自相交时ArcGIS会尝试把相交点处的边界重新组织让几何对象生成多个子环或者丢弃一部分被“缠绕”的区域。对于简单的蝴蝶结多边形它能修成两个子部分或一个有效面但对于复杂的多次自相交特别是CAD转过来的一团乱麻修复后可能产生极窄的长条碎片甚至出现面积骤变。所以我的建议是跑“修复几何”之前一定要对原始数据做完整备份跑完之后要逐项检查修复前后面积的变化。一个可行的方法是给原始要素加一个面积修改前字段修复后对比一次面积差把面积异常变化的要素筛选出来再看别一股脑全信工具。“修复几何”工具的位置和数据管理工具下的“要素”工具集在一起参数很简单输入输出都是同一个要素类它会原地修改不是生成新要素所以这一步尤其要注意备份。4.2 手动编辑修复“蝴蝶结”的几个关键动作如果自动修复效果不理想那就得动手编辑了。手动修复自相交数据我的常规操作是两大思路拆分和重建。拆分的思路是把“蝴蝶结”从交叉点处切成两个独立的面。步骤是进入编辑会话选择该要素使用“切割面”Cut Polygons工具沿着交叉中心画一条切割线把面拆成两个部分。拆完之后两个部分各自成为有效面业务属性需要你自己决定是拆开还是合并。重建的思路是删除原来的非法面然后根据边界顶点重新绘制一个有效面。这种方法适合那些自相交情况特别严重边界本身已经乱到无法修补的数据。操作时会用到“构造面”或者“要素模板”来手动画范围工作量相对大。在修复到线状要素共有边界时记得坚持“不压盖线”的原则。尤其在地类图斑、村级界线、权籍图中相邻多边形的公共边必须保持重合否则后续做拓扑质检时你会额外得到一大堆重叠Overlap和缝隙Gap错误。如果你修复一个自相交要素时不小心把公共边界改歪了相当于引进了新的拓扑问题。所以每次手动修复后都应重新跑一次“检查几何”和“拓扑验证”而不是只修完自己看到的那一个错误。4.3 修复后的复核清单我给自己设了一套修复后的固定检查动作分享出来供参考检查项工具/方法通过标准几何合法性“检查几何”工具问题表为空无自相交错误面重叠检查拓扑规则“不能互相重叠”错误数量为0边界缝隙检查拓扑规则“不能有缝隙”错误数量为0面积变化幅度对比修复前后面积字段变化率在合理范围内如小于0.1%属性完整性统计修复前后要素数量和关键字段非空数量除拆分预期外数量和字段不应丢失这套清单看着简单但实际项目里能一次通过的少之又少我总是要来回折腾几轮才能把数据洗干净。做数据质检本来就是磨性子的活习惯就好。5. 常见问题与排查技巧实录这章记录几个我在使用ArcGIS导出和处理自相交数据时踩过的坑以及一步步排查出来的解决办法希望能让你少走弯路。5.1 导出结果和实际数量对不上做属性连接导出时最容易出现“选出来500条结果导出只有400条”或者“导出了重复要素”的情况。原因一般有两个一是连接字段选错比如用OBJECTID连了OBJECTID但检查几何输出表格里的INPUT_FID其实是原始要素的FID在不同数据格式下可能出现零星偏移二是检查几何输出的错误表里同一要素有多条错误属性连接让图层属性表出现重复行最后导出时软件按行选择虽然看起来是500行实际对应要素只有400个。排查办法很简单导出前先取消连接只用INPUT_FID写一个IN子查询把那批FID直接当作原始要素的查询条件来选中。比如错误表里的FID是102、203、304你可以用“按属性选择”条件写成OBJECTID IN (102,203,304)。这样选中的永远是原始要素本身不会出现重复记录。5.2 属性表复制到Excel粘贴失败或乱码有些同事喜欢在ArcMap属性表里直接全选复制再粘到Excel里分发问题清单。这个操作对几千条数据问题不大但数据量一大会出现复制后无法粘贴的情况或者粘贴出来中文乱码。我之前遇到过属性表字段里含有大字段如THICK注释、大文本全选复制会触发内存溢出Excel自然就粘不动。我的做法是从导出机制本身去解决把属性表内容先用“表转Excel”Table To Excel工具导出成xlsx或者导出成csv再用Excel打开。如果csv打开乱码多半是因为ArcGIS默认输出的是系统ANSI编码Excel的默认编码不匹配。解决办法是先用记事本把csv另存为UTF-8 BOM编码或者直接在ArcGIS里导出时选择UTF-8文件编码。这个细节在数据量大、含中文属性时特别重要。5.3 大数据量下导出卡死的排查思路如果你已经把数据切成小块处理仍然在导出几十万条自相交要素时卡死那就得检查一下是不是要素本身极其复杂。有些面要素的顶点数量多达上万个导出时计算几何和序列化会非常耗时。我处理过一个CAD转过来的地块一个面的顶点数就有2万多个直接导出这个图斑时软件几乎无响应。遇到这种“臃肿”要素建议先用“简化面”工具在保证形状大体不变的前提下减少顶点数或者将它单独提取出来另建图层。当然做这个操作前一定要考虑业务要求比如确权类数据对边界精度要求极高顶点是不能随便精简的。这种情况下可以改用“复制要素”工具Copy Features而不是交互式导出它绕过了界面刷新更适合处理超复杂要素。5.4 坐标系定义错误引起的连锁反应最后再提一个容易被忽略的坑自相交数据有时不是原始数据错了而是你在“定义投影”和“投影”这两个工具之间弄混了。很多新手拿到没有坐标信息的第三方数据习惯性直接使用“投影”工具去转坐标系结果是先按未知坐标系强行算了一遍顶点位置发生微小偏转结果就产出了自相交。正确的做法是数据如果只缺坐标系定义先用“定义投影”工具指定原坐标系然后再用“投影”工具做坐标转换。每一次投影转换都会带来精度损失从而可能导致部分原来合法的几何在临界处发生自相交。所以质检的时候千万别忽略坐标系这个环节。我的个人习惯是每个处理阶段完成后都跑一次“检查几何”把它当成常规工作流的一部分而不是最后才集中检查。数据清洗本来就是个反复折腾的过程与其问题堆到最后一次性爆发不如分阶段消化掉这样出问题的概率会小很多。
返回列表