地形湿度指数TWI计算全流程:从DEM预处理到栅格计算的避坑指南
2026/9/18 13:22:15 网站建设 项目流程

地形湿度指数(Topographic Wetness Index,TWI)这个东西,在水文分析、土壤侵蚀评估、植被适宜性建模里出现的频率非常高。但我在实际带项目和帮人看数据的过程中发现一个挺普遍的现象:很多人拿到DEM之后,直接打开栅格计算器敲一个公式,出来的图看着花花绿绿挺像回事,可一旦拿去和实地情况对照,或者换个分辨率重跑一遍,结果就完全对不上了。问题出在哪?不是公式写错了,而是从DEM预处理到流向算法选择再到汇流累积量的口径,中间有一连串容易被忽略的细节。

这篇内容我打算把TWI从原始DEM到最终栅格的全流程拆开讲一遍,重点不是复述工具按钮在哪,而是把每一步背后的逻辑、参数选择的依据、以及我自己踩过的坑说清楚。适合已经会用ArcGIS基本操作、但想把手头水文分析结果做得更靠谱的人看。如果你刚接触GIS,也能跟着走下来,因为我会把关键概念用生活化的方式解释一遍。

1. 先搞清楚TWI到底在算什么

1.1 公式背后的物理含义

TWI的经典表达式是:

TWI = ln(a / tanβ)

其中a是单位等高线长度上的汇流累积量(specific catchment area),β是局部坡度。这个公式最早来自Beven和Kirkby在1979年提出的TOPMODEL框架,核心思想是:一个地方越容易积水,要么是因为它上游汇水面积大(a大),要么是因为它地势平缓、水不容易流走(tanβ小)。两者一除再取对数,就把"汇水能力"和"排水能力"的比值压缩到了一个相对温和的数值区间里。

你可以把它想象成屋顶排水。同样一场雨,屋顶面积大(a大)且坡度小(tanβ小)的位置,积水概率就高;反之屋顶面积小、坡度陡的地方,水很快就流走了。TWI做的就是给每个栅格算一个"积水倾向分"。

这里有个容易混淆的点:公式里的a不是简单的汇流累积量(flow accumulation),而是单位宽度上的汇流面积。在ArcGIS的默认输出里,Flow Accumulation给出的是上游汇入的栅格数量,要转成a,需要乘以栅格面积再除以等高线宽度(通常近似为栅格边长)。很多人直接拿Flow Accumulation的结果往公式里代,量纲就错了,结果虽然能出图,但数值没有可比性。

1.2 为什么不同人算出来的TWI不一样

我见过同一个研究区、同一份DEM,两个人算出来的TWI范围能差出一倍。原因通常集中在三个地方:

  • 流向算法不同:D8、D-Infinity、MFD(多流向)对水流分配的处理方式完全不同,D8会把所有水流分配给一个方向,在平缓区域容易产生平行流线,而MFD会分散到多个低洼方向。
  • 汇流累积量的单位处理不同:有没有乘以栅格面积、有没有除以栅格边长,直接决定a的量级。
  • 坡度单位不同:tanβ里的β必须是弧度还是角度?ArcGIS的Slope工具默认输出是角度,如果直接取tan,结果会偏小。正确做法是先把角度转弧度再取tan,或者直接用Slope工具的输出乘以π/180后再算。

这三个点任意一个出问题,TWI的绝对值就会漂移。所以我在做任何TWI项目之前,都会先把这三件事在笔记里写清楚,避免中途换参数导致前后结果不可比。

2. DEM预处理:TWI精度的第一道关口

2.1 原始DEM里的"坑"必须先填掉

拿到的DEM,不管是5米、12.5米还是30米分辨率,几乎不可能是"干净"的。最常见的两类问题是洼地(sink)平坦区(flat area)

洼地是指那些周围都比它高、水流不出去的栅格。自然地形里确实存在真实的洼地(比如喀斯特地区的落水洞),但更多时候是DEM采集误差造成的假洼地。如果不填,Flow Direction算到这些地方就会断掉,下游的汇流累积量全部为0,TWI图上一大片异常低值。

ArcGIS里用Fill工具处理,位于Spatial Analyst Tools → Hydrology → Fill。这里有个参数叫Z Limit,默认是空。它的作用是:只填充深度小于这个值的洼地,超过的保留。我一般会先不设Z Limit跑一遍,看看填了多少;如果填出来的面积大得离谱,再回头检查DEM是不是有系统性问题。对于大多数中小流域项目,直接全填(Z Limit留空)是稳妥的选择。

注意:Fill之后一定要用Flow Direction重新算一遍流向,不能拿填之前的流向数据接着用。

2.2 平坦区的处理逻辑

填完洼地之后会出现新的问题:大片被填平的区域变成了"平地",这些地方没有坡度,Flow Direction算不出来方向,会输出一堆-1或者随机方向。ArcGIS的Flow Direction工具内置了一个选项叫"Force all edge cells to flow outward",但这对内部平坦区没用。

标准做法是:Fill → Flow Direction →Sink(检查是否还有残留洼地)→ 如果有平坦区问题,用Flow Direction配合Fill迭代,或者直接用ArcGIS Pro里改进过的Flow Direction算法。在ArcGIS 10.x时代,我习惯用Fill之后再跑一次Flow Direction,然后用Basin工具检查有没有异常的小碎斑。如果碎斑很多,说明平坦区处理不干净,需要回到DEM检查是否有大面积同高程值。

一个实操技巧:在Fill之前,先对DEM做一次Focal Statistics(邻域均值,3×3窗口),可以平滑掉一些微小的采集噪声,减少假洼地的数量。但这会轻微改变地形,所以只建议在DEM质量确实差的时候用,且要在报告里注明。

2.3 投影和分辨率的隐性影响

TWI对投影非常敏感,因为a的计算涉及面积。如果DEM用的是地理坐标系(经纬度),栅格面积会随纬度变化,直接算出来的a没有物理意义。必须先把DEM投影到等面积投影或至少是局部投影坐标系,比如UTM或Albers。

分辨率的影响更微妙。5米DEM和30米DEM算出来的TWI,空间格局可能相似,但绝对值分布会差很多。高分辨率DEM能捕捉到微地形对水分再分配的影响,TWI的局部变化更剧烈;低分辨率DEM则趋于平滑。所以如果你的研究涉及不同分辨率的对比,千万不要把两套TWI数值直接放在一起做统计检验,要先做标准化或者分位数映射。

3. 流向与汇流累积量:TWI计算的核心引擎

3.1 D8还是MFD:一个必须做的选择

ArcGIS的Flow Direction工具默认使用D8算法,每个栅格的水流全部流向8个邻域中坡度最陡的那个。这个算法简单、计算快,但在实际地形中有一个致命弱点:在坡度差异不大的区域,水流会呈现明显的平行线状,这在TWI图上表现为条带状异常。

如果你的研究区是山区,坡度变化剧烈,D8通常够用。但如果是缓坡、平原或者湿地,我强烈建议考虑D-InfinityMFD。ArcGIS原生工具箱里没有直接的MFD,但可以通过Flow Accumulation的"Flow Direction Type"参数选择D8、D-Infinity或MFD(在ArcGIS Pro的 Hydrology 工具集中)。D-Infinity会把水流按角度分配到两个相邻栅格,MFD则分配到所有低洼方向,结果更符合实际的水流扩散。

代价是计算量增加,而且MFD的汇流累积量数值会比D8小(因为水流被分散了),所以TWI的绝对值也会变。这不是错误,是算法差异。关键是在同一个项目里保持一致。

3.2 汇流累积量到比汇水面积的转换

这是最容易出错的一步。ArcGIS的Flow Accumulation输出的是上游栅格数量(如果输入是栅格)。要得到公式里的a,需要:

a = (FlowAccumulation × 栅格面积) / 栅格边长

因为栅格面积 = 边长²,所以简化后:

a = FlowAccumulation × 栅格边长

举个例子:如果DEM分辨率是30米,某个栅格的Flow Accumulation值是100,那么a = 100 × 30 = 3000平方米/米。这个数值的单位是长度,符合比汇水面积的定义。

在栅格计算器里,如果DEM是投影坐标系且单位是米,可以直接写:

a = FlowAcc_30m * 30

但如果DEM是地理坐标系,栅格边长不是常数,这个简化就不成立了。所以再次强调:先投影,再计算

3.3 坡度计算的单位陷阱

ArcGIS的Slope工具输出默认是角度(0-90)。TWI公式里的tanβ要求β是弧度。转换方法有两种:

  • 在栅格计算器里写:Tan(Slope_deg * 3.1415926 / 180)
  • 或者先用Raster Calculator把Slope转成弧度:Slope_rad = Slope_deg * 0.0174533

我习惯用第一种,直接在最终公式里一步到位,减少中间数据。但要注意,如果坡度接近0(平坦区),tanβ会趋近于0,a/tanβ会爆炸,TWI出现极大值。这是TWI的固有特性,不是bug。处理办法通常是对坡度设一个下限,比如tanβ最小取0.001,或者在出图时对TWI做截断(比如取1%和99%分位数之外的做极值处理)。

4. 栅格计算器里的完整实现与参数调优

4.1 一步步搭建计算公式

假设你已经有了:

  • Fill_DEM:填洼后的DEM
  • FlowDir:流向栅格
  • FlowAcc:汇流累积量栅格
  • Slope_deg:坡度(角度)

在ArcGIS的Raster Calculator里,完整公式可以写成:

Ln((FlowAcc * 30) / Tan(Slope_deg * 3.1415926 / 180))

这里的30是DEM分辨率(米),需要根据你的实际数据替换。如果坡度有0值,Tan会返回0,导致除零错误。稳妥的写法是:

Ln((FlowAcc * 30) / (Tan(Slope_deg * 3.1415926 / 180) + 0.001))

加一个极小的偏置量,避免除零,同时不影响正常坡度的计算结果。

4.2 结果验证:怎么判断TWI算得对不对

算完之后不要急着出图,先做三个检查:

第一,数值范围检查。正常的TWI范围一般在3到30之间,极端情况下可能到40以上。如果最小值是负的,说明a/tanβ小于1,可能是FlowAcc有0值或者坡度异常大。如果最大值超过100,检查是不是有除零或者坡度接近0的栅格。

第二,空间格局检查。把TWI图和DEM叠加,看看高TWI值是不是出现在河谷、洼地、缓坡底部,低值是不是在山脊、陡坡。如果高值出现在山顶,那肯定是哪里反了。

第三,与已知地物对照。如果有河流、湖泊或者湿地分布数据,叠加看看TWI高值区是否吻合。我一般会随机选20个点,用Google Earth或者实地照片对照,确认TWI的排序合理。

4.3 不同分辨率下的参数适配

5米DEM和30米DEM在计算TWI时,除了分辨率数值要替换,还有几个参数需要调整:

参数5米DEM30米DEM说明
栅格边长530用于a的计算
填洼Z Limit建议设1-2米建议留空高分辨率DEM噪声多,限制填洼深度可保留真实洼地
坡度偏置量0.00050.001高分辨率下坡度变化剧烈,偏置量可更小
流向算法D8或D-InfinityD8高分辨率下D8的平行流线问题更明显,建议D-Infinity

这个表是我自己在多个项目里总结的经验值,不是绝对标准,但可以作为起点。

5. 那些让我返工过的典型问题

5.1 填洼之后流向还是断的

有一次做南方某丘陵区的项目,Fill跑完,Flow Direction也跑了,但Flow Accumulation出来之后,下游河道位置还是有一大段0值。排查了半天,发现是DEM边缘有NoData区域,水流到边缘就断了。解决办法是在Fill之前,先用Con工具或者IsNull把NoData区域用一个大值填充,或者用Mosaic把相邻图幅拼进来,保证流域完整。

这个坑的教训是:TWI计算的范围必须大于研究区,至少要把上游汇水区完整包含进来。如果只裁剪了研究区边界,边界上的汇流累积量会严重偏低,TWI也跟着偏低。

5.2 坡度图层和流向图层分辨率不一致

ArcGIS里不同工具输出的栅格,如果环境设置里的Cell Size不一致,会导致后续计算时自动重采样,引入误差。我习惯在每次操作前,打开EnvironmentsRaster AnalysisCell Size,设为与DEM一致,并且Mask设为研究区边界。这样所有中间产物都在同一网格上,避免对齐问题。

5.3 TWI图上的"条纹"从哪来

如果你用的是D8算法,在缓坡区域看到明显的平行条纹,这是正常的算法伪影。缓解办法有三个:一是换D-Infinity或MFD;二是对DEM先做一次轻微的平滑(Focal Statistics,3×3均值);三是在出图时用Focal Statistics对TWI结果做一次3×3中值滤波,视觉上会好很多,但会损失一些细节。我通常只在最终制图时做滤波,分析时用原始结果。

5.4 投影转换后TWI全变了

有人把DEM从地理坐标系转到投影坐标系后,发现TWI的数值范围完全变了。这太正常了,因为栅格边长从"度"变成了"米",a的计算结果完全不同。正确的流程是:先投影,再做所有水文分析。如果已经用地理坐标系算了一遍,不要试图通过数学变换去修正,直接重跑。

6. 从TWI到实际应用:几个延伸方向

TWI本身只是一个中间指标,真正有价值的是它在下游分析里的应用。我做过和见过的典型用法包括:

土壤水分制图。TWI和实测土壤含水量之间有较强的相关性,可以用TWI作为协变量,结合少量实测点做回归克里金,生成连续土壤水分图。这里要注意,TWI和土壤水分的关系在不同季节、不同土层深度下不一样,模型要分季节标定。

植被适宜性评价。很多植物对水分条件敏感,TWI可以作为生境适宜性模型的一个环境变量。我一般会把TWI分成5到7个等级,而不是直接用连续值,因为植被响应往往是阈值型的。

洪水风险初筛。TWI高值区在暴雨条件下更容易积水,可以作为洪水风险图的辅助图层。但TWI是静态的,不包含降雨强度、土壤渗透性等信息,只能做初筛,不能替代水文模型。

侵蚀潜力评估。TWI和坡度、土地利用结合,可以估算饱和地表径流产生的概率,进而评估侵蚀风险。常用的组合是TWI + 坡度 + 植被覆盖度。

这些应用里,TWI的精度直接影响最终结论。所以回到最开始说的:不要小看DEM预处理和参数选择,它们决定了你的TWI是"能用"还是"好用"。

7. 我个人的几条实操建议

第一,建立可复现的模型流程。在ArcGIS ModelBuilder里把Fill → Flow Direction → Flow Accumulation → Slope → Raster Calculator串成一个工具链,每次换数据只需要改输入路径和分辨率参数。这样既省时间,又避免手动操作漏步骤。

第二,保存中间数据。Flow Direction和Flow Accumulation的栅格文件不大,但重算很耗时。我习惯把这两个中间结果单独存一个文件夹,后续调参时直接调用,不用从头跑。

第三,记录参数日志。每次计算TWI时,在文本文件里记下:DEM来源和分辨率、投影信息、填洼Z Limit、流向算法、坡度偏置量、计算公式。这个习惯帮我省了很多次"这个图当时怎么算的"的麻烦。

第四,出图时注意配色。TWI的直方图通常右偏,高值少但重要。用分位数分类(比如自然断点或分位数)比等间距分类更能突出空间差异。色带建议用蓝-绿-黄-红,低值冷色、高值暖色,符合水文直觉。

第五,不要迷信绝对值。TWI的绝对值受算法和参数影响很大,跨研究区比较时,用相对排名或分位数更可靠。如果一定要比较绝对值,确保两套数据的DEM分辨率、投影、流向算法、汇流累积量单位完全一致。

最后说一个我最近才注意到的细节:ArcGIS Pro 3.x版本的 Hydrology 工具集里,Flow Accumulation的默认输出类型和10.x有些差异,如果你是从旧版本迁移过来的,建议先跑一个小测试区对比一下,确认数值口径一致再批量处理。这个差异不大,但在做长时间序列对比时会被放大。

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

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

立即咨询