先别急着点“编辑器”里的分割工具,我见过太多人在ArcGIS里做“分割面”操作,第一步就找错地方。这个功能在ArcToolbox和编辑器工具栏里各有一份,名字看着差不多,功能却完全不同,用错了轻则白干半小时,重则把原始数据改得面目全非。这篇文章专门把ArcGIS里所有“分割面”的家底翻一遍,从工具箱里的三个分割工具到编辑器里的手工切割,把每个工具背后的原理、适用场景和隐藏的坑都讲透。
这个系列我已经写到第59篇,前面讲了不少矢量化、拓扑检查和属性表处理的内容,这次轮到“分割面”这个高频操作。无论你是做国土调查、规划建库,还是处理日常的宗地、地块数据,这篇文章都值得收藏。新手可以按步骤照做,老手可以重点看第三节和第五节,那里有常规文档里不会写清楚的边界条件和数据陷阱。
1. 先把三个“分割面”分清楚
ArcGIS里名字带“分割”的工具不少,但针对面要素的,工具箱(Analysis Tools)里主要有三个:分割面、按属性分割、按要素分割。再加上编辑器工具栏里的“切割面工具”,一共是四套方案,各管一摊。
很多人把“分割面”和“按属性分割”混为一谈,这俩其实是完全不同层级的东西。简单打个比方:分割面是在一块蛋糕上切一刀,切完之后蛋糕还是那块蛋糕,只是多了条切痕;按属性分割是把一箱蛋糕按照口味分装到不同盒子里,蛋糕块数没变,但存放的箱子变了。
| 工具名称 | 菜单位置 | 核心作用 | 输出结果 |
|---|---|---|---|
| 分割面 | ArcToolbox → 分析工具 → 叠加分析 | 用一个面图层去切另一个面图层 | 原要素被切割,属性保留,相交处新增要素 |
| 按属性分割 | ArcToolbox → 分析工具 → 提取分析 | 按字段值把一个要素类拆成多个要素类 | 输出多个要素类,每个对应一个属性值 |
| 按要素分割 | ArcToolbox → 分析工具 → 提取分析 | 按要素一对多拆分成多个要素类 | 输出要素类数量等于输入要素数量 |
| 切割面工具 | 编辑器工具栏 → 切割面 | 手动绘制一条线把面切开 | 原面要素被实际修改和替换 |
第四种“切割面工具”最容易理解,它修改的是原始数据本身。你在编辑会话里选中一个面,画一条线穿过去,这个面就被一分为二,原来的那条记录没了,变成两条新记录。这个操作会直接改变源数据,所以用之前必须确认数据可编辑、有备份,不是随手就能上的操作。
前三个工具都不修改原始数据,它们生成新的输出,属于“计算”性质的工具。这个区别非常关键,我在实际项目中见过有人用“切割面工具”去切一个只读数据库里的图层,结果画了半天线发现根本切不动,最后才发现自己的操作路径从一开始就选错了。
2. 分割面工具背后的原理
分割面工具(Split Polygon)做的事情用一句话概括:拿一个图层的每个要素去切另一个图层的面,把所有相交的部分都变成独立要素输出。听起来很简单,实际用起来需要理解两个核心参数和一个边界规则。
第一个核心参数是“容差”,这个值控制着切割时的空间判断精度。默认情况下它使用要素类的XY容差,一般是你数据坐标系的精度值,比如0.001米。如果你的两个图层在边界上有微小的缝隙或者重叠,容差太大或者太小都可能产生意想不到的结果。我习惯在工具对话框里把容差显式设置成数据坐标系中0.01米或者0.001米,避免因为默认值导致碎屑多边形问题。
第二个核心参数是“保持属性”,勾选后输出要素会保留被切割面的全部属性字段,而切割面的属性不会被写入。这一点常常让人困惑——有人以为分割完了之后,两个图层的属性会自动合并关联,实际上不是。分割只负责几何上的切割,属性上除非你使用“相交”工具,否则切割面的属性是丢掉的。如果需要切割带的属性信息,必须在分割前先把需要保留的字段用“连接字段”的方式复制到面图层上。
工具的输出是一个全新的要素类,不会动你原来的数据。这一步既是优点也是陷阱。优点是原始数据安全,缺点是如果你忘记设定正确的输出坐标系,或者输出位置选了个临时目录,后续引用数据的时候就容易出幺蛾子。我在公司项目里从来都是先建好输出要素类的路径,然后直接把结果存到目标数据库里,不经过中间临时数据这一层。
关于输出坐标系,特别提醒一下新手。分割面工具的默认输出坐标系是输入的第一图层(被切割面)的坐标系。如果你的切割图层是地理坐标系,被切割图层是投影坐标系,输出的坐标系取决于你把谁放在第一个参数的位置。所以参数顺序不是随便填的,它直接影响输出结果的空间参考。我一般建议把需要保真坐标的那个图层放在第一个参数位置。
分割面还有一个容易被忽视的细节:它会处理多部分(MultiPart)要素。一个多部分面要素,如果被分割线切到其中某一部分,输出的是多个独立的单部分要素,而不是保留多部分结构。这个行为对后续的属性汇总、面积统计都有影响。要在分割前用“多部分至单部分”工具先拆开,或者做好心理准备接受输出结果变成多个单部分要素。
3. 四种分割方式的操作流程与适用场景
搞清楚了原理,接下来逐个过操作流程。每个方案我写清楚步骤、适用场景,以及我自己在实际项目中踩过的坑。
3.1 分割面工具的标准操作
打开ArcToolbox,路径是“分析工具 → 叠加分析 → 分割面”。对话框里四个项目:输入要素、分割要素、输出要素类、容差。
输入要素就是你要被切的那个面图层,分割要素是切刀。我用一个实际例子说明。之前做某个县的土地利用现状图更新,手头有一份行政边界图层和一份三调地类图斑图层,需要按行政村边界把地类图斑切出来,方便各个村单独统计面积。操作就是输入要素选地类图斑,分割要素选行政边界,输出要素类命名成“地类图斑_按村分割”,容差保持默认,直接跑。
这个场景里有个隐藏问题:行政边界和地类图斑的边界不一定完全重合。有些图斑跨了两个村,边界处还有几米的缝隙。分割工具会按照切割线把跨界的图斑切成两块,落在缝隙处的极小碎屑也会生成。跑完之后必须用“消除”工具把面积小于阈值的碎屑多边形合并到相邻图斑里,否则汇总数据的时候会出现一堆零点几平方米的无效图斑。
具体到切完怎么检查:把输出图层的面积字段排序,凡是面积小得离谱的都要人工确认。我一般先做一步筛选,面积小于0.5平方米的图斑单独导出检查,确认是碎屑就并入相邻要素。这个过程虽然繁琐,但比事后统计出错再返工要省事得多。
3.2 按属性分割的应用实践
按属性分割(Split By Attributes)是从一个大图层里按字段值拆成多个要素类。它的场景不是几何切割,而是数据整理。
举个例子,有一个全国范围的生态保护红线图层,字段里有省份代码,需要按省拆开,交给各省的负责人去处理。用按属性分割工具,输入图层选红线数据,分割字段选省份代码,输出目录指定一个文件夹,工具会自动生成以字段值命名的多个要素类。
这里有个强迫症友好但新手易懵的细节:输出目录必须已经存在,工具不会自动创建文件夹。如果文件夹路径无效,工具直接报错,而且报错信息不算友好。我习惯在运行前先建好一个空的输出目录,然后让工具在这个目录里生成分省要素类,命名规则是“输入要素名_字段值”,这个后缀在后期整理时非常有用。
按属性分割的输出是多个要素类,不是单个要素类里的多个图层。你要是想在一个要素类里按字段分开显示,不需要用这个工具,直接在符号系统里用唯一值渲染就够了。按属性分割更适合下游工作流需要“一省一库”或者“一区一文件”的交付场景。
实际做自然资源数据汇交的时候,我经常需要把全县数据按乡镇代码拆成十几个图层,用这个工具一条命令搞定,比自己写循环去筛选导出快得多,而且不易出错。唯一要小心的是分割字段里如果存在空值,会生成一个空值命名的要素类,需要提前把空值字段处理掉。
3.3 按要素分割的批量场景
按要素分割(Split By Features)名字上看着和分割面很像,实际上是完全不同的逻辑。它把一个输入要素类按另一个要素类的每个要素拆分成多个输出要素类,输出的数量等于分割要素的要素数量,而不是一个合并的结果。
这种批量按要素切分的场景,典型用途是:有一个地块面图层,每个地块的形状各不相同,需要把每个地块单独输出成一个独立要素类,供后续逐个做专题分析或者格式转换。选择这个工具时,重点搞清楚分割要素和被分割要素的关系。分割要素的每个要素都会被当作一个独立的“提取范围”,输入要素中落入该范围的部分会被输出为一个独立要素类。
按要素分割工具生成的文件命名也有规律:输出文件名是“输入要素名_分割要素的要素编号”。比如输入要素是“lands”,分割要素有5个,输出就是lands_0、lands_1……lands_4这样的文件。知道这个命名规则,后续批量引用就不怕找不到文件对应关系。
有人问能不能用按要素分割工具替代分割面工具,答案是看需求。分割面工具输出的是一份完整的、互相咬合的切割结果;按要素分割输出的是多个独立文件,各个文件间没有拓扑关系,不能直接拼起来用。如果你的下游工作需要跨文件做拓扑检查、拼接统计,建议优先用分割面;如果只是按地块或行政区范围逐个出图、导出,按要素分割更直接。
3.4 编辑器里的切割面工具
上面三个工具箱工具都不修改源数据,但编辑器工具栏里的“切割面工具”是真刀真枪地改原始数据。进入编辑会话,选中一个面要素,点击切割面工具,然后沿着要切割的位置画一条线,双击结束,原面就被划分成两部分。
这个工具在数据修编场景里使用频率非常高。比如做不动产数据整合时,发现某宗地登记范围把隔壁宗地的一角包进来了,需要把重叠的部分切出去。用切割面工具直接手工画线,把宗地面一分为二,再删除不需要的部分,搞定。
用切割面工具有几条硬性要求:
- 数据必须是可编辑的(要素类来源不是只读)
- 必须开启编辑会话
- 画线必须穿过多边形边界,起点和终点都可以在面外部,但线不能完全落在面外
- 每次只能切一个面,不能同时切割多个要素
实际操作中,最常出现的问题是开启编辑会话后忘记选中要切的面。切割面工具默认只切选中的要素,没选中就画线,工具会提示没有可切割的要素,但提示有时候一闪而过,你还在傻傻等结果。我现在的习惯是,选中要素之后先放大看一眼确认高亮显示,再调出切割面工具去画线。
切割面工具还有个进阶用法:用它做“分割并保留两侧”的操作,切完之后两个新要素都保留原要素的所有属性。因为新要素是从原要素分裂出来的,属性自动继承,不需要额外字段计算。这一点和工具箱里的分割面不同,后者虽然也保留属性,但不会修改原始数据。
4. 实操过程:从数据准备到结果检查
不管用哪种分割方式,实操前必须做数据准备工作。我的标准流程是固定五步,少一步都可能在后半程出问题。
第一步,检查坐标系。包含坐标系的要素类才能进行空间叠加分析,没有坐标系或坐标系定义错误的要素类,工具能跑但结果是错的。我遇到过一个极端案例,两个图层的坐标系定义完全相同,但一个是有基准面的地理坐标系,一个是投影坐标系,分割后所有要素面积缩水了几十倍。所以操作前先在图层面板上看“源”选项卡,确认坐标系正确。
第二步,检查属性结构。被分割图层最好唯一标识字段,比如FID或者自定义的编号字段。分割后生成的要素继承了原属性,但如果你没有唯一标识,后续排查问题的时候根本不知道哪个要素是从哪里来的。我一般建议在分割前用“添加字段”加一个“原始ID”,把原要素的OBJECTID拷进去。
第三步,清理拓扑错误。两个输入图层在边界上的微小重叠和缝隙,会导致分割结果产生碎屑。所以操作前用“检查几何”工具跑一遍数据健康度,有问题先修复几何。这一步不要省,很多几何错误不会影响显示,但会影响叠加分析的结果质量。
第四步,备份原始数据。这条是我自己的铁律。凡是可能修改原始数据的操作(例如编辑器里的切割面工具),操作前必须备份。就算是纯生成新数据的工具,我也保留一份原始输入,因为有时候跑出来的结果不对,需要回到最初状态重新来,没有备份就只能找IT恢复数据库了。
第五步,设置输出环境和路径。设置合适的输出坐标系、存储路径、要素类名称。输出路径不要放到系统临时目录,因为临时目录可能被清理,而且团队协作时别人找不到你的中间数据。我习惯在所有分析项目下建“中间数据”和“成果数据”两个独立目录,分割结果统一放“中间数据”,让最终成果数据保持干净。
实际操作时,我通常打开ArcToolbox里的“地理处理选项”,把“覆盖现有数据集”勾上。这样如果反复跑同一路径的输出,重新执行时不用手动删除旧的输出要素类。但这个选项有风险,它会悄悄把之前的输出结果替换掉。如果你上次输出的结果已经被人引用,覆盖之后对方打开的就是新数据,可能会造成版本混乱。所以这个选项只在数据还在自己手里、不被别人共享的阶段才打开。
5. 常见问题与排查技巧实录
分割面这一块我遇到过的问题不少,挑几个高频的、在官方文档里不太容易被注意到的坑写出来。
第一个问题是输出结果图层范围不对。分割面工具跑完,发现输出的要素数量比预期的少了很多,或者边界处缺了一块。这种问题九成是输入图层有拓扑错误。常见诱因是原始数据中存在自相交多边形、空几何,或者两个图层边界共线但节点不在同一位置。排查方法:先用“检查几何”跑一遍,能找出大部分问题。如果还不行,把两个输入要素类的边界全部转成线,用“拓扑”工具做重叠检查,找到问题区域后手工修,再重新分割。
第二个问题是容差设置导致碎屑多边形泛滥。前面提过,默认容差是要素类的XY容差,但不同来源的数据XY容差可能不一样。如果两个图层一个容差是0.001米,另一个是0.01米,分割后可能在边界处产生大量极小多边形。这个问题的排查相对容易:把输出要素类的面积字段排序看一眼,如果发现大量面积小于0.01平方米的多边形,基本就是容差问题。解决办法是重新设置容差为两个输入图层中更严格的一方,然后重新运行工具。
第三个问题是输出要素类无法创建。点击“确定”之后,工具报错说不能创建输出要素类。常见原因不是权限问题,而是你的输出要素类名称已经被占用,或者输入要素类有特殊字符。尤其是中文要素类名称,在有些版本里的兼容性并不好。我踩过一次坑,输出要素类名称叫“分割_地类图斑_2018核实”,里面有下划线有中文,结果报错一堆。改成“DlTb2018Split”之后,一次通过。倒不是说中文名称一定不能用,而是这种边界场景不值得浪费时间,直接用字母数字命名最稳妥。
第四个问题是切割面工具画完线之后没有反应。前面提过,没选中目标要素会导致这种情况。但还有一种情况是图层处于“按属性选择”状态,或者当前编辑的图层面与画线处没有交集。检查方法很简单:看编辑器工具栏里的目标图层是什么,再看画线路径是否穿过目标要素。画线的时候尽量起点、终点都在目标要素外部,整条线完完整整地穿过去,别只切了个边角,那样也会报错。
第五个问题是分割后属性丢失。分割面工具勾了“保持属性”,但输出的某个关键字段值为空。这种情况大概率是字段名冲突或者字段类型不兼容。比如被分割图层里有个字段叫“Shape_Area”,输出要素类里系统会自动生成一个“Shape_Area1”而不是直接用原来的。全程注意字段名的变化,要么在分割前把需要的字段改名,要么分割后根据“原始ID”字段用连接工具把属性补回来。
第六个问题,按属性分割生成的文件名乱码。当分割字段值是中文时,输出文件名直接以中文命名。在Windows上一般没事,但如果你把成果拿到Linux环境跑批处理,文件编码问题就来了。为避免麻烦,我会在分割前先加一个“拼音码”或者“数字码”字段,用这个字段作为分割字段,输出干净的文件名,然后用属性表把原中文名关联回去。这个习惯帮我省去了很多和国际团队协作时的沟通成本。
排查问题时我还有一个习惯:所有工具跑完,不着急看结果,先看工具对话框下方的“消息”窗口,那里会列出警告和错误。很多运行成功的操作其实伴生有警告,比如“部分要素被忽略”“几何未闭合”等,这些警告才是后续问题的真正根源。养成读消息的习惯后,你排查数据问题的速度会快一倍。
6. 分割后处理:面积计算与图形检查
工具跑完不代表工作完成。分割后的处理是容易被人忽略的部分,但这些环节直接影响成果能不能直接用于制图或者统计分析。
分割完成后的第一个动作是添加面积字段。如果你原图斑没有面积字段,用“计算几何”工具批量计算面积,单位根据实际需要选平方米或者公顷。计算几何时注意坐标系,用投影坐标系算出来的是平面面积,用地理坐标系算出来的是球面弧度,后者通常不是你想要的结果。所以务必确认当前数据框坐标系和你设置的面积单位匹配,否则你的面积数据就是错的。
第二个动作是检查有没有零面积要素或者负面积要素。零面积要素通常是因为分割时切割线刚好经过节点,导致生成了一条线而不是一个面,这种要素必须在成果中删除。负面积要素很少见,如果出现,说明数据存在环状方向问题,需要用“修复几何”工具修复后再检查。
第三个动作是图形拓扑检查。分割面的结果如果涉及后续建库,必须做一次拓扑检查,规则包括“不能重叠”“不能有缝隙”。叠加分析的结果经常出现沿着分割线的微小缝隙或者重叠,这些都要提前处理,不然入库之后数据库质检会直接报错。
有用的小工具是“要素转线”,把分割后的面转成线,然后检查线有没有自相交、重复线等错误。这个检查比直接做拓扑快,适合快速排查大面积数据里的局部问题。具体做法是:用“要素转线”工具,把分割结果转成线图层,打开属性表看是否有长度为零的线或者重叠线,有问题就定位到区域检查原始数据。
第四个动作是属性一致性检查。分割会生成新要素,新要素除了继承属性外,需要确认关键字段在分割前后总值不变。比如面积字段,用原始图层的总面积和分割后所有要素的面积总和做对比,误差应该在容差范围内。如果差值过大,说明分割过程中有要素丢失或者几何被改变,必须回溯检查。
第五个动作是符号化渲染检查。用唯一值渲染按原图层的关键字段显示,目视检查有没有异常显示。有时候几何没问题、属性没问题,但图形边界看起来支离破碎,实际上是绘制精度或者显示精度的原因,导出地图的时候就会露馅。这一步虽然主观,但能发现很多程序检查发现不了的问题。
7. 我的几点经验总结
文章最后,把我在实际项目中摸爬滚出来的经验集中写一下,没时间细看全文的直接看这一节。
一是分割前先理清数据亲属关系。同一个数据如果同时要被多个工具处理,先列清楚哪个是底图、哪个是切割工具、哪个是辅助参考,避免把主次颠倒。比如做村界切图斑,行政边界就是切刀,图斑就是被切的料。你要是把图斑当作切刀去切行政边界,输出的结果完全不是你要的东西。
二是做好中间过程的数据管理。分割面这类工具生成的中间产物很多,命名混乱会让人崩溃。我养成的习惯是文件名带“日期 + 版本号”,比如“DlTbHS_20230915_V2”,后面发现问题要回退,先看版本号就知道哪份是当前有效数据。
三是不要盲目相信默认容差。很多人喜欢“保持默认”跑一切工具,但分割面这个工具的容差影响面太大。默认的XY容差是0.001米级别,但你的数据实际精度可能只有0.1米。容差设太小,碎屑满天飞,后面清理消耗的时间远超你手工调整参数节省的几秒钟。反之容差设太大,会把本来独立的要素错误合并,数据精度损失不可逆。
四是用工具前先把目标想明白。“分割”这个动作,不同工具生成了不同层级的结果。有的工具把数据切碎重建一份新的,有的把数据分成多份文件,有的大动干戈直接改源数据。你如果不确认自己的目标是什么,很容易选错工具。花三十秒把目标写下来:“我要按村分割地类图斑,每个村的图斑独立建库”,你自然会选按属性分割而不是分割面。
五是所有几何操作完成后,用“检查几何”再扫一遍质量和几何。这步是最后的兜底防线。因为很多逻辑上没问题的数据,在几何层面仍然存在隐藏异常,可以通过此工具的检查提前发现。
我在做ArcGIS培训的时候,经常对学员说的一句话是:工具本身都不难,难的是你知道在哪个场景下用哪个工具,以及工具跑完之后接下来该做什么。分割面系列工具刚好能说明这一点。
最后一个实用技巧分享给大家,如果遇到一张大范围的复杂图斑要切又不知道从哪下手,先把图斑边界简化掉(用“简化面”工具),切完再把边界细节恢复回去。这个办法看似多此一举,但在处理超大规模数据时能明显减少切割线的锯齿问题,让后续出图看起来更美观。只是要注意简化参数别设太大,否则边界形状失真,反而得不偿失。
分割面的内容到这里就写完了。下一篇文章打算继续写矢量数据编辑里的“合并”类工具,把面要素的合并且说清楚——那又是一个和分割面刚好相反方向的高频操作。