ArcGIS Pro地形分析避坑指南:填挖负值与流向异常的根因排查
2026/9/23 10:31:41 网站建设 项目流程

1. 从两个负值报错说起:填挖与流向分析为什么总在同一个坑里翻车

做地形分析的人,几乎都遇到过这两个场景:填挖方计算出来,挖方是正的,填方却是负的,或者两个都是负的,跟手算结果对不上;流向分析跑完,平地上一大片NoData,或者流向箭头指向完全不合理的方向,明明地势是从西向东倾斜,它偏偏给你指到北边去。这两个问题看起来八竿子打不着,但我在实际项目里反复验证过,它们翻车的根因高度重合——坐标系与高程单位不匹配、DEM本身的凹陷与平地没处理干净、并行处理块边界引入的接缝误差,这三条几乎能覆盖八成以上的异常。

ArcGIS Pro在这块比ArcMap时代确实强了不少,尤其是并行处理和栅格函数的整合,但强归强,默认参数并不总是适配你的数据。很多人拿到DEM直接拖进工具就点运行,结果出来一堆负值,第一反应是软件有bug,其实绝大多数情况是数据本身或者环境设置的问题。这篇内容我打算把填挖分析和流向分析这两条线拆开讲,把每个环节容易出问题的地方、背后的原理、以及我实际排查时用的步骤都摊开说清楚。不管你是刚接触ArcGIS Pro的学生,还是做了几年项目的从业者,只要你的工作涉及地形分析,这里面的坑你大概率会踩到至少一个。

先明确一下适用范围:填挖方计算(Cut/Fill)、流向分析(Flow Direction)、汇流累积(Flow Accumulation)、洼地填充(Fill Sinks)这几个工具是重灾区,本文的排查思路对它们通用。数据格式上,栅格DEM、TIN转栅格、点云插值生成的栅格都适用。我不打算只给结论,而是把“为什么会出现这个现象”讲透,这样你下次遇到变体问题也能自己推。

2. 填挖分析出负值:先别怀疑软件,查这三处

2.1 高程单位与坐标系Z值的隐性错配

填挖方计算的核心逻辑很简单:填挖结果 = 后一期DEM - 前一期DEM,正值代表填方(地面升高),负值代表挖方(地面降低)。但这里有个前提——两个DEM的高程单位必须一致,而且Z值的单位要和XY平面单位匹配。我见过最常见的情况是:DEM的XY坐标是投影坐标系,单位是米,但高程值是从经纬度数据插值来的,单位其实是度或者英尺,没做转换。这种情况下算出来的差值数量级完全不对,正负号也可能因为插值过程的偏移而乱掉。

排查方法很直接:在ArcGIS Pro里右键图层 → 属性 → 源,看空间参考的线性单位和高程单位。如果高程单位显示的是“Meter”但实际数据是英尺,或者压根没定义垂直坐标系,那就中招了。修复方式有两种:一是用投影栅格(Project Raster)工具,在环境设置里指定正确的垂直坐标系;二是用栅格计算器手动乘以换算系数,比如英尺转米就乘0.3048。我一般推荐第一种,因为投影栅格会同时处理XY和Z,一步到位,不容易漏。

提示:如果两个DEM来自不同时期、不同来源,垂直基准面可能都不一样。比如一个基于1985国家高程基准,另一个基于当地平均海平面,这种情况下即使单位对了,系统偏差也会让填挖结果整体偏移。处理办法是找一个已知高程点做校正,或者用栅格计算器减去两者的均值差。

2.2 并行处理块边界导致的接缝误差

ArcGIS Pro默认开启并行处理,这对大栅格是好事,速度能快好几倍。但并行处理会把栅格切成若干块分给不同核心计算,块与块之间的边界如果处理不当,就会出现接缝。填挖分析里,这种接缝表现为沿某条线突然出现一条负值带,或者整块区域的值偏移。我实测过一个20000×20000的DEM,并行处理下填挖结果在块边界处出现了约0.3米的系统性偏差,关掉并行之后偏差消失。

关闭并行处理的位置在:分析选项卡 → 环境 → 并行处理,把“并行处理因子”设为0或者取消勾选。代价是计算时间变长,但精度优先的场景下这个代价值得。如果你必须用并行,可以尝试把块大小调大,减少边界数量,但根治还是得关掉。另外,栅格计算器在并行模式下对NoData的处理也可能不一致,导致某些像元被跳过,结果出现空洞或异常值。

2.3 前后期DEM的像元对齐与范围不一致

填挖分析要求两个DEM的像元大小、行列数、范围完全一致,否则ArcGIS Pro会自动重采样,而重采样方法默认是最近邻,这对连续型高程数据来说精度损失很大。更麻烦的是,如果两个DEM的范围只是部分重叠,不重叠区域会被赋为NoData,但某些版本下NoData参与计算会变成0或者极大值,导致结果出现莫名其妙的负值。

检查方法:用栅格属性看两个DEM的像元大小和行列数,用裁剪工具统一范围。如果像元大小不同,用重采样工具,方法选双线性或三次卷积,别用最近邻。我通常会在填挖之前先跑一遍栅格计算器,表达式写Con(IsNull("dem1"), 0, "dem1")把NoData转成0,虽然会引入微小误差,但能避免NoData引发的计算异常。更好的做法是用掩膜提取共同区域,确保两个DEM完全对齐。

3. 流向分析的“平地陷阱”:为什么你的水流向了错误的方向

3.1 洼地与平地:流向算法的天然克星

D8算法是ArcGIS Pro流向分析的默认算法,它的逻辑是:每个像元的水流方向指向周围8个邻域中坡度最陡的那个。这个逻辑在自然坡面上没问题,但遇到洼地(四周高中间低)和平地(周围高程相同)就失效了。洼地里,水应该蓄积,但D8会强行找一个出口,导致流向指向不合理的方向;平地上,所有邻域坡度都是0,D8无法判断,ArcGIS Pro的处理方式是给平地一个默认流向,通常是向东或向南,这就解释了为什么你看到平地上流向全部指向同一个方向。

解决洼地和平地的标准流程是:先填洼(Fill),再流向(Flow Direction)。填洼工具会把洼地填平到最低出口的高度,这样水流就能正常流出了。但填洼有个副作用——它会改变原始地形,填掉一些真实的洼地(比如喀斯特地貌的落水洞)。所以填洼之前要评估:你的研究区有没有真实的洼地?如果有,填洼的阈值要设小一点,或者用洼地深度工具先识别出哪些是真实洼地,哪些是数据噪声造成的假洼地。

平地的处理更微妙。填洼之后,原来的洼地变成了平地,这些平地仍然没有坡度,D8还是无法处理。ArcGIS Pro的流向工具内部有一个平地处理机制,会给平地分配一个微小的坡度,让水流能流出去。但这个机制在复杂地形下可能失效,尤其是大面积平地。我的经验是:如果研究区有大面积平原,填洼之后再用栅格计算器给平地加一个极小的随机扰动(比如0.0001米),打破平地的对称性,流向就能正常计算了。

3.2 边缘效应与NoData的连锁反应

流向分析对边缘像元特别敏感。栅格边缘的像元邻域不完整,D8算法无法正常判断流向,ArcGIS Pro的处理方式是把边缘像元标记为NoData或者赋予一个默认方向。如果你发现流向结果的边缘有一圈异常值,这是正常现象,但如果你发现异常值向内延伸了好几圈,那可能是DEM边缘本身有NoData,导致连锁反应。

处理办法:在流向分析之前,用栅格计算器把DEM边缘的NoData填补上,或者用裁剪工具把研究区向内缩几个像元,避开边缘效应。我通常会在DEM外围加一圈缓冲,缓冲区内的高程用最近邻插值填充,这样流向分析时边缘像元也有完整的邻域,结果更可靠。

3.3 并行处理在流向分析中的“暗坑”

和填挖分析一样,流向分析在并行处理下也可能出问题。流向计算是迭代的,每个像元的流向依赖于邻域像元的高程,并行处理时块边界处的像元可能拿到的是未更新的邻域值,导致流向计算错误。这种错误在视觉上表现为:沿块边界出现一条流向突变带,或者某些区域的流向整体偏移。

我做过对比测试:同一个DEM,并行处理下流向结果在块边界处有约5%的像元流向与串行结果不一致,这些不一致的像元后续汇流累积会放大误差,导致河网位置偏移。所以流向分析我强烈建议关闭并行处理,虽然慢,但结果可靠。如果数据量实在太大,可以分块处理,但块与块之间要留足够的重叠区,最后再拼接。

4. 一套可复现的排查流程:从DEM到可靠结果

4.1 数据预处理:统一坐标系、单位与范围

在跑任何地形分析之前,我会先做一轮数据体检。具体步骤:

  1. 检查空间参考:两个DEM的XY坐标系和垂直坐标系是否一致?如果不一致,用投影栅格统一。垂直坐标系尤其容易被忽略,ArcGIS Pro默认不检查垂直基准,需要手动确认。
  2. 检查像元大小与行列数:用栅格属性查看,如果不一致,用重采样统一到较细的像元大小,方法选双线性。
  3. 检查范围:用裁剪工具取共同区域,或者用掩膜提取。确保两个DEM完全对齐。
  4. 检查NoData:用栅格计算器统计NoData比例,如果超过5%,需要评估是否影响分析结果。必要时用插值方法填补。

这一步看起来繁琐,但能避免后面80%的异常。我见过太多人跳过这一步,结果在填挖和流向之间反复折腾,最后发现是坐标系没统一。

4.2 填挖分析的标准操作与参数设置

数据体检通过后,填挖分析的流程如下:

  1. 关闭并行处理:环境设置 → 并行处理因子设为0。
  2. 运行填挖工具:输入前一期DEM和后一期DEM,输出结果。注意工具里的“Z因子”参数,如果XY单位和Z单位不同,需要设置Z因子进行换算。比如XY是米,Z是英尺,Z因子设为0.3048。
  3. 验证结果:用栅格计算器算一下填挖结果 = 后一期 - 前一期,和工具输出对比,确认一致。然后统计正负值比例,如果负值比例异常高,回到4.1检查数据。
  4. 可视化检查:用符号系统把正值和负值用不同颜色显示,看是否有沿块边界的异常带。如果有,确认并行处理是否真的关闭了。

4.3 流向分析的完整链路:填洼、平地处理、流向、汇流累积

流向分析不是单独一个工具,而是一条链路:

  1. 填洼:用Fill工具,输入DEM,输出填洼后的DEM。如果研究区有真实洼地,先用洼地深度工具识别,把深度小于阈值的假洼地填掉,真实洼地保留。
  2. 平地处理:填洼后,用栅格计算器给平地加微小扰动。表达式可以写Con("filled_dem" == "filled_dem", "filled_dem" + Rand() * 0.0001, "filled_dem"),这样平地上每个像元有微小的高程差异,D8能正常判断流向。
  3. 流向分析:关闭并行处理,运行Flow Direction工具。输出结果用流向符号可视化,检查是否有大面积同向的异常区域。
  4. 汇流累积:用Flow Accumulation工具,输入流向结果,输出汇流累积栅格。用栅格计算器提取累积量大于阈值的像元,得到河网。如果河网位置明显偏移,回到第3步检查流向。
  5. 验证:用流域分割工具生成子流域,和已知水系对比,确认流向和汇流结果合理。

4.4 并行处理的取舍:什么时候必须关,什么时候可以开

并行处理不是洪水猛兽,关键看场景。我的经验是:

场景并行处理建议理由
填挖分析(大栅格)关闭块边界误差会导致负值异常
流向分析关闭迭代计算依赖邻域,并行会引入不一致
汇流累积可开启累积计算对块边界不敏感,但需验证
栅格计算器(简单运算)可开启逐像元运算,无邻域依赖
重采样、投影可开启无邻域依赖,并行安全

如果必须用并行,建议把块大小调大,减少边界数量,并且跑完之后用焦点统计做一次平滑,消除接缝。但精度要求高的项目,我还是建议关掉并行,用时间换质量。

5. 那些文档里不会写的实操心得

5.1 Z因子的坑:不是所有场景都需要设

Z因子在填挖和流向分析里都有,但很多人搞不清楚什么时候该设。简单说:如果XY单位和Z单位相同(比如都是米),Z因子设为1;如果不同,Z因子是换算系数。但有个例外——如果DEM的高程值本身已经是经过换算的(比如从英尺转成了米),那Z因子还是1。我见过有人重复换算,结果高程整体偏移了几十米。判断方法:看DEM的统计信息,最大值最小值是否和实际地形吻合。如果明显偏大或偏小,检查Z因子。

5.2 填挖结果的符号约定:正负到底代表什么

ArcGIS Pro的填挖工具默认:正值代表填方(后一期高于前一期),负值代表挖方。但有些项目要求反过来,或者用绝对值。我建议在工具里直接输出原始差值,然后在符号系统里用双色渐变显示,正负一目了然。如果要在报告里用,用栅格计算器取绝对值或者乘以-1,别在工具里改,保留原始结果方便追溯。

5.3 流向分析的“假平地”:数据噪声的识别与处理

有时候DEM看起来是平地,其实是数据噪声造成的——比如LiDAR点云插值时,水面或者建筑物顶部被插成了平地。这种假平地填洼处理不了,因为填洼只处理洼地,不处理平地。识别方法:用坡度工具算一下,如果坡度接近0但高程有微小波动,那就是噪声。处理办法:用焦点统计做一次均值滤波,或者用栅格计算器加随机扰动。但要注意,滤波会平滑真实地形,所以只对确认是噪声的区域做。

5.4 结果验证:用已知点或水系做交叉检查

跑完填挖和流向,别急着出图。找几个已知高程点,用提取值至点工具把结果提取出来,和实测值对比。流向结果可以用已知水系验证:把河网和流向叠加,看流向是否指向河网方向。如果偏差大,回到数据预处理阶段重新检查。我通常会用混淆矩阵的思路,统计正确流向的比例,低于90%就说明有问题。

6. 当标准流程失效时:几个变体问题的处理思路

6.1 大范围平原区的流向分析:分区处理策略

平原区流向分析是老大难。填洼加扰动的方法在小范围有效,但大范围平原上,扰动可能被地形起伏淹没,流向还是乱。我的做法是分区处理:用流域分割或者地形分区把平原切成若干子区,每个子区单独填洼、加扰动、算流向,最后拼接。拼接时注意子区边界要重叠几个像元,避免接缝。另一个思路是用多流向算法(如MFD)替代D8,ArcGIS Pro里没有直接工具,但可以用Python调用richdem库实现,对平原区更友好。

6.2 填挖分析中的体积计算:从栅格到报表

填挖工具输出的是栅格,但项目报告通常要体积。体积计算:体积 = 像元面积 × 高程差 × 像元数量。用栅格计算器先算体积栅格 = 填挖结果 × 像元面积,然后用分区统计按区域汇总。注意单位:像元面积是平方米,高程差是米,体积是立方米。如果高程差是英尺,先换算。我见过有人忘了换算,体积差了3倍多。

6.3 并行处理关闭后的性能补偿:分块与缓存优化

关掉并行后,大栅格计算会变慢。补偿方法:一是用金字塔加速显示,二是用缓存把中间结果存到本地,三是分块处理,每块单独跑,最后拼接。分块时块大小建议不小于5000×5000,太小了边界效应反而更明显。另外,ArcGIS Pro的地理处理缓存可以开启,重复运行时能省不少时间。

7. 我个人的几条硬核经验

做了这么多年地形分析,我总结了几条铁律,基本能帮你避开90%的坑。第一,任何地形分析之前,先做数据体检,坐标系、单位、范围、NoData,四项缺一不可。第二,并行处理在邻域依赖的工具里默认关闭,别图快,快出来的结果不可靠。第三,填挖和流向的异常,先查数据,再查参数,最后查软件,软件出bug的概率远低于数据问题。第四,结果一定要交叉验证,已知点、水系、坡度,随便找一个能对上的参照物,对不上就回头查。

还有一个小技巧:ArcGIS Pro的历史记录功能会记录每次工具运行的参数,出问题时可以回溯,看看是哪一步的参数变了。我习惯在项目文件夹里建一个_logs目录,把每次运行的参数截图存进去,后面复现或者排查都方便。这个习惯帮我省了无数次重跑的时间。

最后说一句,地形分析没有“一键出结果”的捷径,每个研究区的地形特征不同,参数需要微调。但只要你理解了填挖和流向的底层逻辑,知道每个参数在干什么,遇到异常就不会慌,按流程一步步排查,总能找到根因。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询