ARTICLE DETAIL

资讯详情

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

ArcGIS Pro地形分析避坑指南:填挖负值与流向异常的根因排查

ArcGIS Pro地形分析避坑指南:填挖负值与流向异常的根因排查 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会强行找一个出口导致流向指向不合理的方向平地上所有邻域坡度都是0D8无法判断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 数据预处理统一坐标系、单位与范围在跑任何地形分析之前我会先做一轮数据体检。具体步骤检查空间参考两个DEM的XY坐标系和垂直坐标系是否一致如果不一致用投影栅格统一。垂直坐标系尤其容易被忽略ArcGIS Pro默认不检查垂直基准需要手动确认。检查像元大小与行列数用栅格属性查看如果不一致用重采样统一到较细的像元大小方法选双线性。检查范围用裁剪工具取共同区域或者用掩膜提取。确保两个DEM完全对齐。检查NoData用栅格计算器统计NoData比例如果超过5%需要评估是否影响分析结果。必要时用插值方法填补。这一步看起来繁琐但能避免后面80%的异常。我见过太多人跳过这一步结果在填挖和流向之间反复折腾最后发现是坐标系没统一。4.2 填挖分析的标准操作与参数设置数据体检通过后填挖分析的流程如下关闭并行处理环境设置 → 并行处理因子设为0。运行填挖工具输入前一期DEM和后一期DEM输出结果。注意工具里的“Z因子”参数如果XY单位和Z单位不同需要设置Z因子进行换算。比如XY是米Z是英尺Z因子设为0.3048。验证结果用栅格计算器算一下填挖结果 后一期 - 前一期和工具输出对比确认一致。然后统计正负值比例如果负值比例异常高回到4.1检查数据。可视化检查用符号系统把正值和负值用不同颜色显示看是否有沿块边界的异常带。如果有确认并行处理是否真的关闭了。4.3 流向分析的完整链路填洼、平地处理、流向、汇流累积流向分析不是单独一个工具而是一条链路填洼用Fill工具输入DEM输出填洼后的DEM。如果研究区有真实洼地先用洼地深度工具识别把深度小于阈值的假洼地填掉真实洼地保留。平地处理填洼后用栅格计算器给平地加微小扰动。表达式可以写Con(filled_dem filled_dem, filled_dem Rand() * 0.0001, filled_dem)这样平地上每个像元有微小的高程差异D8能正常判断流向。流向分析关闭并行处理运行Flow Direction工具。输出结果用流向符号可视化检查是否有大面积同向的异常区域。汇流累积用Flow Accumulation工具输入流向结果输出汇流累积栅格。用栅格计算器提取累积量大于阈值的像元得到河网。如果河网位置明显偏移回到第3步检查流向。验证用流域分割工具生成子流域和已知水系对比确认流向和汇流结果合理。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替代D8ArcGIS Pro里没有直接工具但可以用Python调用richdem库实现对平原区更友好。6.2 填挖分析中的体积计算从栅格到报表填挖工具输出的是栅格但项目报告通常要体积。体积计算体积 像元面积 × 高程差 × 像元数量。用栅格计算器先算体积栅格 填挖结果 × 像元面积然后用分区统计按区域汇总。注意单位像元面积是平方米高程差是米体积是立方米。如果高程差是英尺先换算。我见过有人忘了换算体积差了3倍多。6.3 并行处理关闭后的性能补偿分块与缓存优化关掉并行后大栅格计算会变慢。补偿方法一是用金字塔加速显示二是用缓存把中间结果存到本地三是分块处理每块单独跑最后拼接。分块时块大小建议不小于5000×5000太小了边界效应反而更明显。另外ArcGIS Pro的地理处理缓存可以开启重复运行时能省不少时间。7. 我个人的几条硬核经验做了这么多年地形分析我总结了几条铁律基本能帮你避开90%的坑。第一任何地形分析之前先做数据体检坐标系、单位、范围、NoData四项缺一不可。第二并行处理在邻域依赖的工具里默认关闭别图快快出来的结果不可靠。第三填挖和流向的异常先查数据再查参数最后查软件软件出bug的概率远低于数据问题。第四结果一定要交叉验证已知点、水系、坡度随便找一个能对上的参照物对不上就回头查。还有一个小技巧ArcGIS Pro的历史记录功能会记录每次工具运行的参数出问题时可以回溯看看是哪一步的参数变了。我习惯在项目文件夹里建一个_logs目录把每次运行的参数截图存进去后面复现或者排查都方便。这个习惯帮我省了无数次重跑的时间。最后说一句地形分析没有“一键出结果”的捷径每个研究区的地形特征不同参数需要微调。但只要你理解了填挖和流向的底层逻辑知道每个参数在干什么遇到异常就不会慌按流程一步步排查总能找到根因。
返回列表