ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ArcGIS中自身相交数据检查与导出的三种实用方案

ArcGIS中自身相交数据检查与导出的三种实用方案 做GIS的同行估计都遇到过这种事手里的面图层或者线图层明面上瞧不出问题可用量算面积、网络分析甚至打印出图的时候它就开始闹脾气——要么面积算出来是错的要么相交分析结果离谱要么出图时突然多出一段诡异的线。查到最后才发现图层里有要素自己跟自己交叉了也就是所谓的自身相交。这类问题在ArcGIS里并不罕见尤其是从CAD转过来的数据、手工数字化的数据或者编辑操作没开捕捉时几乎隔三差五就能碰到。这篇文章就专门聊聊怎么把这类自身相交数据找出来并单独导出方便你后续修复或者做数据分析。写这篇文章的起因也很简单。上个月我接手一批项目成果数据甲方反馈说某个地块的面积量算结果和测绘报告对不上。我拿ArcGIS一查问题就出在几个面要素发生了自身相交边界自己绕了一圈成了“蝴蝶结”形状面积算法自然就乱了。后来我花了一下午把整批数据的自身相交要素全部筛出来、导出来、修掉问题才算彻底解决。回头看这件事最耗时间的不是修复而是“怎么快速把自身相交要素准确导出”。所以今天我把整套流程、三种可行方案、以及我在实操中踩过的坑都整理出来希望对你有帮助。1. 先搞清楚“自身相交”到底是什么以及它为什么必须处理1.1 自身相交的两种典型表现线自交与面自交自身相交这个词听起来有点绕其实看图就明白了。线要素自交就是一条线在延伸过程中和自己发生了交叉形成一个小圈或者一个交叉点面要素自交则是面的边界环在某个位置自己穿过自己形成类似“8字形”或“蝴蝶结”的多边形。在ArcGIS的数据结构里正常的面要素边界是一个简单环线要素是一条不重复经过自身点的路径。一旦出现自交几何上就会产生歧义系统不知道这块区域到底属于面内还是面外也不知道线的走向在哪里发生了重叠。这种拓扑错误最坑的地方在于它不像“缺属性”那样能被表格一眼看出来也不像“要素跑到了范围外”那样能被缩放出图直接发现它藏在几何定义里只有系统级别的几何检查才能暴露。我碰到的案例里线自交多发生在道路、河流、管线数据中面自交多发生在宗地、行政区划、植被分布等面状数据中。两者本质上同源但修复方式略有不同导出后的处理方向也不同。所以动手之前最好先确认自己的数据到底是线自交还是面自交这样后期选用修复工具会更清楚。1.2 数据里混入自身相交的高发场景自身相交数据是怎么混进去的根据我这几年的经验主要集中在这几类场景一是CAD数据直接转GIS。很多测绘成果先是在CAD里完成的CAD的绘图逻辑偏向“视觉表达”不强调拓扑关系。两条线看起来在拐弯处相接、实际却穿过彼此这种情况太常见了。CAD导入ArcGIS后这些视觉上的重叠就变成了实打实的自身相交。从CAD转过来的面边界尤其容易出现这类问题特别是原本是用闭合多段线绘制的图形。二是手工数字化过程中的“手滑”。早期数据采集大多靠人工在屏幕上描图鼠标没点准、捕捉没开好随手一拉就多了一个交叉折点。这种问题在野外勾绘植被边界、地块轮廓时特别普遍。别觉得这是老黄历现在很多临时性项目中依然有人用屏幕数字化处理小范围数据。三是数据编辑时的拓扑破坏。要素合并、裁剪、相交分析后ArcGIS虽然会自动重建几何但跨软件交换、字段修改、几何网络重建等操作偶尔会留下自交残留。还有一类是使用批量缩放、简化几何等工具时容差设置不当导致边界变形、互相折叠也会催生自身相交。四是不同来源数据拼接时产生的边界错乱。比如同一区域的数据来自两家单位分别数字化后拼接成一张图交接处的两个面发生微小交叉这种交叉在宏观比例尺下看不出来但拓扑检查一测一个准。1.3 不处理自身相交后续分析会踩哪些坑自身相交数据如果不处理最直接的影响是面积、长度量算不准。ArcGIS在计算要素面积时如果遇到自交面系统会尝试用内部算法“猜”多边形的有效区域结果往往会和真实情况偏差很大。甲方的测绘报告里地块面积是10.2公顷你量出来8.7公顷相差十几万平方米这就是典型的自身相交造成的量算错误。除了面积还有几类后续操作也容易翻车。拓扑分析时自交要素会导致叠置分析、缓冲区分析结果异常因为系统无法正确判断要素的内外关系。网络分析时道路要素自交可能导致路径计算绕远路或者无法连通。数据入库时部分建库平台对几何有效性有严格校验自交数据直接被打回。更麻烦的是有些数据经过多次制图综合后自身相交会被“固化”到成果里后面再想处理工作量会成倍增长。所以早发现、早导出、早修复是处理自身相交数据的核心原则。而导出这一步是后续一切操作的基础。2. 导出自身相交数据的前期准备先做三步检查2.1 第一步确认ArcGIS版本与数据格式不同版本的ArcGIS在几何检查功能上略有差别。经典版ArcMap自带“检查几何”工具ArcGIS Pro则把这个能力升级为“几何检查”面板不仅能检查还能快速定位和修复。无论你用的是哪个版本核心思路是一致的先找出异常要素再导出异常要素。差异主要在路径名称和界面位置。数据格式也要提前确认。Shapefile、地理数据库要素类、CAD要素类这三类数据在几何检查功能上支持程度不同。Shapefile是最常见的交换格式检查几何工具完全支持地理数据库要素类功能最全修复几何后的保存稳定性也最好CAD要素类则比较特殊它更像是CAD数据的只读映射建议先转成Shapefile或要素类再处理。我个人建议任何一份要导出的数据最好先复制一份在副本上执行检查和导出操作。尤其是从其它软件交换来的数据连数据源本身都不一定干净直接在原文件上操作风险很大。备份这一步永远不亏。2.2 第二步用检查几何Check Geometry定位异常要素ArcMap用户可以直接在ArcToolbox里找到“数据管理工具→要素→检查几何”ArcGIS Pro用户可以在“分析”选项卡下的工具列表里搜索“检查几何”。这个工具的作用是遍历整个要素类把存在几何异常的要素记录下来输出一个独立的错误表。错误表会包含几个关键字段要素所在的类名、要素ID、错误类型描述以及错误的具体规则类型。比如“Self Intersections”表示自身相交“Null Geometry”表示空几何“Duplicate Vertex”表示重复折点。我们这次的目标就是筛选出错误类型等于“Self Intersections”的记录。跑这个工具之前建议把“错误类型”参数设置为“ALL”先做全量检查。有些数据你以为只有自交问题实际跑完会发现同时存在重复折点、环方向错误等问题。一次全量检查能让你对数据整体质量心中有数而不是只盯着自交一个问题。检查完成后工具会在指定的输出位置生成一张错误表这张表是后续导出操作的重要起点。2.3 第三步判断异常要素是否全部属于“自身相交”检查几何工具跑完后结果表里通常混着多种错误类型这时不要急着全选导出应该先筛选出“Self Intersections”这一项。这里有一个容易被忽视的细节字段值的大小写和描述文本可能因版本不同而略有差异。我在ArcGIS 10.2和10.8上都跑过描述内容基本一致但如果你用的是非英文环境输出表里的错误描述可能显示为本地化文本比如“自身相交”。所以筛选时建议先打开错误表的属性表看一眼确认字段里的具体写法。筛选在错误表上操作即可。用“按属性选择”选中“RuleType Self Intersections”然后把选中记录对应的要素ID记录下来。这一步完成后你就有了一个明确的清单哪些要素是自身相交要素。接下来就是用这个清单从原始图层中把对应要素导出来。3. 三种主流导出方案按你的使用习惯选一种3.1 方案一Check Geometry结果关联原图层按属性选择导出这是我平时用得最多的方案因为它全程使用图形化界面适合任何基础的操作人员也方便留痕。操作步骤如下。先用“检查几何”工具生成错误表然后打开原始图层的属性表用OID字段和错误表做关联关联方式可以是“连接和关联”功能也可以直接用“按属性选择”把错误表中的要素ID粘贴到查询语句里。连接之后错误表中的“RuleType”字段会出现在原始图层的属性表中这时用“按属性选择”选中“RuleType Self Intersections”的记录右键图层选择“数据→导出数据”在导出对话框中选择“所选要素”指定输出路径和格式就能把自身相交要素单独导出来。这个方案最大的优点是“所见即所得”每一步都能在界面上看到反馈。缺点是当异常要素特别多时手动按属性选择可能比较繁琐而且关联字段名字要匹配好否则容易查不到数据。我在处理几万个要素的大图层时还是更倾向于用脚本方案。3.2 方案二字段计算器IsValid()快速标记再按属性导出如果你不想用检查几何工具或者安装的ArcGIS版本比较旧、工具路径记不清也可以用字段计算器直接写一个有效性判断脚本把无效要素标记出来再按属性导出。这个办法在很多技术群里传得挺广因为它不依赖“检查几何”工具原理也很简单ArcGIS的几何对象自带一个IsValid属性返回布尔值如果是False就说明该要素的几何无效大概率就是自身相交或者其它几何问题。操作上先在属性表里添加一个短整型字段命名为“IsValid”或“IsValidFlag”。然后在字段计算器中选Python解析器输入以下代码块def checkShape(shape): if shape is None: return -1 if shape.isValid: return 1 return 0 checkShape(!shape!)运行时它会遍历每个要素把几何有效与否转换成0、1值写入字段。计算完成后按“IsValid 0”选中全部无效要素再右键导出就得到了一份包含自身相交要素在内的异常数据。这个方案和检查几何工具的核心区别是它能快速标记出所有几何无效的要素但不能像检查几何工具那样给出“具体是哪一种几何错误”。所以导出的数据里可能混着空几何、重复折点等问题。如果你只需要快速圈定所有可疑要素这个方案足够了如果你要精确只导出“Self Intersections”建议还是用方案一。3.3 方案三ArcPy脚本批处理适合大批量数据当数据量很大或者要定期处理多份数据时手点界面就太慢了。这时候我建议直接用ArcPy脚本把“检查→筛选→导出”三件事合并执行。下面是我在实际项目中用过的脚本框架逻辑很简单你可以根据自己的文件路径和字段名稍作修改import arcpy # 原始数据路径 fc rD:\work\data\land_parcel.shp # 错误表输出路径 error_table rD:\work\data\land_parcel_Errors.dbf # 自身相交要素的导出路径 out_fc rD:\work\data\land_parcel_self_intersect.shp # 1. 运行检查几何 arcpy.CheckGeometry_management(fc, error_table) # 2. 读取错误表中“自身相交”对应的要素ID oid_field arcpy.Describe(fc).OIDFieldName error_oids [] with arcpy.da.SearchCursor(error_table, [FEATURE_ID, RULE_TYPE]) as cursor: for feature_id, rule_type in cursor: if rule_type Self Intersections: error_oids.append(feature_id) # 3. 如果存在自身相交要素按要素ID构造查询表达式并导出 if error_oids: id_list ,.join([str(oid) for oid in error_oids]) where_clause f{oid_field} IN ({id_list}) arcpy.Select_analysis(fc, out_fc, where_clause) print(f共导出 {len(error_oids)} 个自身相交要素结果保存在 {out_fc}) else: print(未发现自身相交要素)这里有几个需要注意的地方。第一错误表里的要素ID字段名称不同版本可能略有差异建议先在ArcMap或Pro里查看一下错误表的字段列表确认字段名是“FEATURE_ID”还是“OBJECTID”之类的其它名称。第二构造查询表达式时如果自身相交要素特别多ID列表很长有可能会超过数据库查询语句的长度限制导致导出失败。遇到这种情况最简单的办法是把ID列表拆成几千个一组分多次执行Select_analysis最后用Append工具合并。这个脚本大概两三分钟就能跑完一份几十万条记录的数据。我第一次用的时候边上同事还觉得写脚本麻烦结果后来自动化处理了十几张图他就服气了。4. 实操过程以“字段计算器按属性选择”为例走一遍全流程4.1 添加标识字段并写入有效性判断下面的流程我以最常见的操作环境为例既可以直接在ArcMap里操作也可以搬到ArcGIS Pro里菜单名称几乎相同。先在ArcMap中加载目标图层右键图层打开属性表点击表格工具栏里的“添加字段”按钮创建一个短整型字段字段名建议全部用小写字母加下划线比如“is_valid”字段类型设为“短整型”精度可以不填默认即可。这里提醒一下如果数据是Shapefile字段名长度不能超过10个字符起名时别太奔放。字段添加完成后在字段上右键选择“字段计算器”在弹出的对话框里把解析器从“VB脚本”切换成“Python”然后在“预逻辑脚本代码”框里粘贴前面那段checkShape函数在下方的表达式框里写“checkShape(!shape!)”。点击确定后系统会逐个要素计算。这一步里最容易出问题的点有三个。一是几何字段访问失败报错“GP工具执行错误”或者“字段计算器无法读取Shape字段”多半是数据源是CAD要素类或只读图层建议先把数据转成Shapefile或要素类。二是“!shape!”的写法不同版本对几何字段的调用写法基本一致但如果你的数据来自地理数据库要素类请确认字段名称确实是“Shape”而不是“地理数据库的几何列名”。三是个别数据量特别大的图层字段计算器会卡在“正在计算…”很久这属于正常现象耐心等待即可如果超过30分钟还没动静可以考虑关掉重新算或者用脚本方案替代。计算结束后打开属性表按“is_valid”字段降序排列你会看到值为0的记录这些就是几何无效的要素。如果你只想导出自身相交要素而不是所有无效要素可以再结合“检查几何”工具的结果表交叉筛选这个我后面细说。4.2 按属性选择后导出要素类标记字段算好后下面的导出操作就变得很简单。在属性表里点击“按属性选择”构造查询条件“is_valid 0”也可以顺手排除一下空几何如果存在的话点击应用地图上会同步高亮显示选中的异常要素。这里有个小技巧在选择时最好先统计一下选中了多少条记录。我用过一版数据整张表一万多条其中两千多条自交当时没留意直接导出了一个两千多条的图层后来一检查里面还混着一百多个空几何要素。所以统计这一步能帮你对导出结果的数量有个预期避免导出一堆脏数据。确认选中后右键图层选择“数据→导出数据”弹出的导出对话框里有几个关键选项要设置好。第一“导出”选项一定选“所选要素”如果留成“所有要素”导出的数据就和原图层没区别了。第二“使用与图层相同的数据框的坐标系”和“数据的坐标系”这两个选项按你的后续用途选择。如果你还要继续修复几何或者做拓扑检查建议选“数据的坐标系”减少一次坐标转换可能带来的额外误差。第三输出格式可以根据需要选“Shapefile”或“要素类”。如果数据要交回给甲方或其它平台一般选Shapefile如果只是在当前工程里继续处理直接存成地理数据库要素类会更稳定。点击确定后系统生成一个新的独立图层这就是你导出的“自身相交数据图层”。你可以给单个异常要素加个备注或者直接把要素ID写进标记字段方便上级审核时逐条核对。4.3 导出的数据要怎么检查与备份导出的数据虽然叫“自身相交数据”但说实话我从来不会直接拿它去改原始图层。正确做法是先把原始图层复制一份作为备份然后在备份副本上执行几何修复修复完成后再对比前后差异。如果是用“修复几何”工具处理输出图层会直接生成一个新的修复结果。修复后重新跑一遍“检查几何”确认错误表里“Self Intersections”为0再对比一下修复前后的要素数量。正常情况下要素数量不该变化面积、周长等指标会轻微变化这是正常的因为系统把几何纠偏了。另一种做法是在导出的自交数据图层里逐条检查。如果你手头有“要素折点转点”工具可以把异常要素的折点转出来看看哪里有重复折点或交叉点也可以把异常要素叠加在原始影像或参考图层上人工目视判断。虽然工作量大了点但能确认每一条自交要素的成因这在数据质量报告里是很好的证据材料。最后再啰嗦一句处理好之后原始图层和导出图层最好分开保存。我习惯把修复后的数据放在“Final”文件夹把导出的异常数据放在“ErrorData”文件夹两者路径写进项目说明里。这样后续检查、验收、归档都非常方便不会出现“咦这个图层怎么有两份”的情况。5. 常见问题与排查技巧实录5.1 我踩过的坑和对应解决办法第一坑选择导出时勾了“所有要素”结果导出的图层比原图层还大。这个错误看起来低级但我在赶工状态下真踩过一次。解决办法是养成导出后立即查看要素数量的习惯在内容列表里右键图层看属性或者打开属性表统计一下记录数数量对不上就马上删掉重新导。第二坑检查几何工具生成的错误表里没有“Self Intersections”记录但字段计算器却标记出一批is_valid0的要素。这通常是因为字段计算器判断的是“泛化的几何有效性”理论上包含自交但在某些版本中对某些特殊几何的判定范围更宽比如包含了空几何、重复折点等情况。解决办法是不要把两种方法完全等同对待字段计算器适合快速圈定嫌疑要素检查几何工具适合精细分类。第三坑导出Shapefile时字段名被截断。Shapefile的字段名上限是10个字符我一开始把字段命名为“self_intersect_flag”导出后直接变成了“self_inter”原本的标记信息不全后面关联数据特别麻烦。解决办法很简单导出前把不需要的辅助字段删掉或者导出后及时重命名。第四坑数据量太大导出过程中ArcMap直接崩溃。这个问题多见于几十万条记录以上、且要素几何特别复杂的图层。解决办法是把数据按空间范围切块处理比如用“选择→按位置选择”先选出某一区域内的异常要素导出后再合并或者干脆用ArcPy脚本分批次导出减少界面交互带来的内存压力。5.2 导出工作完成后的几何修复与验证建议导出自身相交数据的最核心目的最终还是为了修复数据。ArcGIS里有一个现成的“修复几何”工具位于“数据管理工具→要素→修复几何”直接运行即可自动修复大部分自交问题包括清除多余的交叉点、重建闭合环等。修复工具会生成一个新要素类不会直接覆盖原始数据这点比较安全。修复完成后再跑一遍“检查几何”确认错误表为空这是最直接的验证方式。如果你用的是ArcGIS Pro可以直接在地图面板里打开“几何检查”功能它会实时扫描当前图层的所有几何错误并在列表中显示具体的错误类型和位置。这个功能比ArcMap传统工具更直观Pro用户强烈推荐。另外修复后的数据最好再做一个“面积对比验证”方法是在修复前后分别统计同一批要素的总面积差值如果超过0.1%就要留意是不是修复过程中把有效几何也顺手改掉了。至于ArcGIS“不要压盖线”这类更高级的数据质量要求就和本主题不在同一层了。那属于线要素叠置规则和自身相交是两回事但排查思路相通先检查再定位再导出最后修复。掌握了自身相交数据的导出流程其它几何问题的排查也就顺理成章了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进