前阵子做项目需要把一片山区划分为一个个相对独立的汇水单元,本来想直接用现成的子流域边界数据,结果要么精度太粗、要么覆盖范围对不上,折腾半天还是决定自己从DEM算一遍。用ArcGIS基于DEM提取微流域单元这套流程跑通之后,回头整理了一下,发现核心逻辑其实就一句话:让水流在栅格DEM上“走”一遍,然后把每条水流路径上游的集水区切出来。
这篇文章就把完整流程拆开讲清楚,从填洼、流向、汇流累积、河网提取到最终的微流域矢量面,每一步我都会说明“为什么这么做”“参数怎么定”“踩过什么坑”,并给出练习数据的准备方式。适合GIS相关专业的学生、做水文分析或面源污染估算的从业者,以及所有想把一片复杂地形快速切成一个个“小流域管理单元”的人。
1. 先搞清楚:微流域单元到底是什么,为什么要自己做
1.1 三个概念怎么分:流域、子流域、微流域
流域这个概念大家都不陌生,简单说就是降水落到地面后,顺着地形汇流,最终都流向同一个出水口的整个区域。子流域则是在大流域内部,沿着次级水系、支沟继续划分出来的相对独立的汇水区。而微流域是更往下一级的空间单元,往往以某条小支沟或者某个小汇水洼地为边界,面积可以从几公顷到几十平方公里不等。
在实际项目中,微流域单元之所以好用,是因为它足够小、足够完整。比如做面源污染估算时,如果拿整个大流域来统计,上游和下游的土地利用差异太大,污染物负荷被平均掉了,结果根本没参考意义。但切成一个个微流域单元后,每个单元内部的土地利用、坡度、土壤类型相对均一,统计出来的数据才真正能支撑决策。水土保持规划、生态水文模拟、山地灾害评价等领域也都有类似需求。
1.2 从DEM到微流域的原理:一条水流走出来的逻辑链
DEM,也就是数字高程模型,本质上是一张每个栅格都带有高程值的“数字地形沙盘”。ArcGIS提取微流域的整套逻辑,就是在这张沙盘上模拟水流运动。
首先,需要确定每个栅格的水往哪个方向流,这就是流向计算。ArcGIS默认使用D8算法,也就是把每个栅格周围8个相邻栅格中坡度最陡的方向作为水流方向。水流方向确定后,再统计每个栅格到底“接收”了多少上游栅格汇入的水,这就是汇流累积。汇流累积值大的栅格,往往就是沟道、河谷的位置。基于这些沟道位置,可以提取出河网,再以每条独立河段作为出水口,把上游所有汇入该河段的区域划出来,就得到了一个个微流域单元。
可以这样理解:把整个流域看成一座教学楼,微流域单元就是一间间独立教室。雨水落在每间教室的屋顶,通过各自的排水沟汇入走廊,最后从大门排出。水流路径就是“屋顶—排水沟—走廊—大门”的层级关系,ArcGIS要做的就是把每一间教室的范围精确圈出来。
1.3 哪些场景非用微流域单元不可
我自己接触过的项目里,微流域单元主要用在三类场景。
第一类是面源污染估算。上游是农田还是林地、施肥量多少、坡度多大,这些因素直接影响污染物入河量。把研究区切成微流域单元后,可以按单元聚合土地利用和污染源数据,再结合降雨径流系数算各单元的污染负荷。
第二类是水文模型的汇水区准备。SWAT、HEC-HMS这类模型需要先把流域划分成子汇水区。虽然模型自带划分工具,但直接用ArcGIS提取好的微流域单元导入,往往更可控,尤其是当你对单元大小和边界有特定要求时。
第三类是水土保持和生态评价中的“小单元治理”。每条小支沟就是一个治理单元,治理前后做对比监测,也需要以微流域为统计口径。这时候如果手头没有现成边界,基于DEM自己提取是成本最低、周期最短的方案。
2. 开工前准备:DEM数据源、坐标系与练习数据
2.1 常见公开DEM数据源怎么选
提取微流域单元之前,得先有一份可靠的DEM。不同数据源的空间分辨率直接决定了微流域划分的精细程度,选数据时不能只看“能用”,还得看“够不够用”。下面是我用过的几个公开DEM数据源对比:
| 数据源 | 空间分辨率 | 覆盖范围 | 获取途径 | 适用场景 |
|---|---|---|---|---|
| SRTM 1弧秒 | 30米 | 全球60°N~56°S | 地理空间数据云、USGS EarthExplorer | 中小流域、区域级分析 |
| ASTER GDEM V3 | 30米 | 全球83°N~83°S | 地理空间数据云 | 高纬度补充、无SRTM区域 |
| ALOS PALSAR | 12.5米 | 全球 | ASF DAAC | 小流域精细分析 |
| Copernicus GLO-30 | 30米 | 全球 | Copernicus官网、AWS | 欧洲及全球通用 |
| 无人机LiDAR点云生成的DEM | 0.5~2米 | 局部 | 自有航测或测绘单位 | 精细微流域、小地块 |
做微流域单元,我个人建议优先选12.5米或更高精度的DEM。分辨率越低,地形细节丢失越多,原本清晰的小支沟可能直接“消失”在栅格里,划分出来的微流域边界也会比较粗糙。如果只是练手或者做大区域的初步分析,30米SRTM也够用,后面实操步骤完全一致。
这里顺便提一句,DEM和DSM不是一个东西。DSM是地物表面模型,包含了建筑、树木的高度,做水文分析时会造成虚假的阻挡和水流中断,所以一定不要用DSM代替DEM。从开源数据里下载时注意看清产品类型。
2.2 坐标系这个坑,别等算面积时才后悔
这是整个流程里最容易被忽略、但后果最严重的一步。绝大多数公开DEM原始数据都是WGS84经纬度坐标系,单位是度,直接用这种数据做水文分析,流程能跑通,但到了最后计算面积、长度时结果全是错的,因为经度1度在不同纬度代表的实际距离不同,栅格像元根本不是正方形。
正确的做法是先做投影。用ArcGIS的Project Raster工具,把DEM从WGS84投影到适合研究区的投影坐标系。中国地区我常用UTM分区坐标系,比如UTM 50N覆盖东经117°至123°区域,做省级以上大范围分析则建议用Albers等积投影。判断标准只有一个:投影后栅格像元的单位必须是米,而且研究区内面积变形要尽量小。
这个坑我在刚接触水文分析时踩过,当时提取完微流域后顺手算面积,结果一个明显几千亩的小流域,属性表里面积却只有几百,检查了半天才发现是坐标系惹的祸。所以现在每次拿到DEM,第一件事就是看属性里的坐标系,绝不嫌麻烦。
2.3 练习数据准备与软件版本说明
这篇实操使用的练习数据,我建议你从“地理空间数据云”免费下载,网站提供SRTM和ASTER GDEM两种常用DEM,注册后按区域框选下载即可。练习区选一块地形起伏明显的山地,面积大约20km×20km,内部包含山脊、沟谷、坡面,这样提取出来的微流域单元层次分明,方便对比效果。
软件部分,ArcMap 10.2到10.8都可以,ArcGIS Pro同样适用,水文分析工具组的位置和参数基本一致。我用的是ArcMap 10.8版本,整个流程在ArcGIS Pro 3.x里也跑通过,区别只是界面布局略有不同,工具名称和参数含义没变化。
下载好DEM后,先在ArcMap里加载,打开图层属性确认坐标系。如果是WGS84经纬度坐标,先执行Project Raster投影到UTM。如果已经是投影坐标系,且单位是米,就可以直接进入下一步了。
3. ArcGIS基于DEM提取微流域单元完整实操
3.1 填洼:最容易被忽略却影响全局的第一步
在开始水文分析之前,几乎所有教程都会强调先做填洼处理,但很多人只是机械执行,并不理解为什么要填。DEM虽然是数字地形模型,但受数据采集精度和地表真实形态影响,里面往往存在一些“伪洼地”——也就是周围栅格都比它高、水流进去就出不来的低洼格。如果不把这些洼地填平,水流方向计算到这里就会中断,提取出的河网会支离破碎,后面的微流域划分自然一塌糊涂。
操作路径是ArcToolbox → Spatial Analyst Tools → Hydrology → Fill。输入DEM,输出结果命名Fill_DEM,关键参数Z limit可以留空,也可以自己设定。留空代表把所有洼地全部填平,是最省事的做法;设定Z limit则代表只填深度小于该值的洼地,保留真实的自然洼地。
我个人的经验是,在喀斯特地貌或者有明显人工水库、天然湖泊的区域,不能无脑全填。有一次我在喀斯特区域做分析,溶蚀洼地本身就是真实地形的一部分,全填之后地形几乎被“磨平”了,微流域边界完全偏离实际。后来设置Z limit为50米,只填掉小于50米的伪洼地,结果才合理。普通山地练习数据一般不会遇到这个问题,直接用默认全填即可,不影响学习流程。
3.2 流向计算与汇流累积,搞懂数据在“算”什么
填洼完成后,接下来就是流向计算。运行Flow Direction工具,输入Fill_DEM,输出方向栅格。这个栅格每个像元的值是一个数字编码,对应D8算法确定的8个方向之一,比如1代表向东流,128代表向西流,等等。ArcGIS默认使用D8算法,也是水文分析最经典的算法,它假设每个栅格的水只流向周围8个邻域中坡度最陡的那一个。
方向栅格出来后,接着做汇流累积。运行Flow Accumulation工具,输入方向栅格,输出结果里,每个像元的值代表有多少个上游像元的水汇流经过这个位置。可以这么理解:在分水岭附近的山脊线上,汇流累积值往往是0或者很小的数字,因为那里是水流的起点;而在沟道和河谷里,汇流累积值会非常大。
实操中我习惯在得到汇流累积结果后,先右键查看符号系统,做一次拉伸显示或者分位数分类,大致了解数值分布区间。如果最大汇流累积值只有几百,说明研究区不大;如果有几万甚至几十万,说明这是一个比较大的流域。这个数值能直接帮你判断下一步河网提取的阈值范围,不用靠猜。
3.3 河网提取阈值怎么定,直接影响微流域大小
河网提取是整条流程中最需要“手感”的一步。ArcGIS并没有单独一个“抽取河网”的按钮,而是用栅格计算器对汇流累积结果做条件筛选:当像元值大于某个阈值时,就认为是河道,赋值为1,否则为NoData。
具体操作是打开Spatial Analyst工具里的栅格计算器,输入表达式,以我常用的图层名为例:
Con("FlowAcc" > 500, 1)这里的500就是阈值。阈值越小,被判定为河道的像元越多,提取出的河网越密集,最终划分出的微流域单元也越多、越小;阈值越大,河网越稀疏,微流域单元越少、越大。到底选多少,取决于你想要的微流域尺度。
我一般会做2~3组对比测试。比如在约50平方公里的山地小流域里,阈值500提取出来的是主沟道和几条大支沟,微流域单元面积相对较大;阈值100时,细小的坡面沟道也进来了,微流域数量陡增,单元会非常碎。练习阶段建议从较小的阈值开始试,比如200或300,然后叠加卫星影像或者地形图对比,看提取的河网是否与真实沟道吻合。这个调整过程没有标准答案,完全是基于研究目的和对地形判断的经验活。
这里有一个小技巧:栅格计算器里的图层名如果包含空格或特殊字符,必须用双引号引起来。很多新手在这里报错,多半就是图层名没加引号或者引号用成了中文全角。
3.4 用河网链接当倾泻点,切出微流域单元
河网提取完成后,下面这一步才是微流域单元划分的核心。这里要用到两个工具:Stream Link和Watershed。
先运行Stream Link工具,输入河网栅格和流向栅格,输出“河网链接”栅格。这个栅格给每条独立的河段分配了一个唯一编号,每条河段代表一段连续的河道。接着运行Watershed工具,输入流向栅格,倾泻点数据选择上一步得到的河网链接栅格,输出结果就是微流域栅格。
为什么用河网链接而不是直接用河网栅格作为倾泻点?我最早做的时候图省事,直接拿河网栅格去划分流域,结果每个河道像元都被当成了出水口,划出来的区域碎得像马赛克,完全没法用。而河网链接把每条河段作为整体单元,划分出的每个区域正好是这条河段的直接汇水区,这才是“微流域单元”的意义所在。
这一步得到的流域栅格,值就是河段编号。同一编号的区域,就是对应河段上游的集水区。栅格里每个独立区域代表一个微流域单元,单元数量等于河段数量,相互之间不会重叠,边界沿着分水岭走,效果非常直观。
3.5 栅格转矢量与后处理,让结果能直接用
微流域栅格虽然已经能看出划分效果,但实际项目中通常需要矢量面用于制图和空间分析,所以还要把栅格转为面要素。运行Raster to Polygon工具,输入微流域栅格,不要勾选简化面选项,输出得到一个矢量面图层,属性表里带一个Gridcode字段,代表每个微流域单元的编号。
栅格转矢量只是第一步,后处理才是让结果能真正交付的关键。我一般会做以下几步:
第一,用Dissolve工具,以Gridcode字段为融合字段,把相邻的同编号图斑合并成一个完整面。有时候栅格转面会把一个单元拆成多个碎片,融合能解决这个问题。
第二,在属性表里新增Area字段,右键Calculate Geometry计算每个微流域单元的面积。注意,这一步之前必须确保图层是投影坐标系,单位是米,否则面积就是错的。这也是我在2.2节反复强调坐标系的原因。
第三,筛选删除边缘碎片。研究区边界处会出现一些面积特别小、形状不完整的图斑,用Select By Attributes选出面积小于某个阈值的图斑,根据实际情况删除或者合并到相邻单元中。
第四,如果对边界平滑度有要求,可以用Simplify Polygon或Smooth工具做轻度平滑。但不要平滑太狠,否则边界偏移会导致面积失真。对于绝大多数分析场景,不平滑也完全可以接受。
4. 实操避坑:常见问题与排查方法
4.1 填洼填过头,地形全“平”了怎么办
症状:填洼后的DEM在三维显示或山体阴影下看着特别“平”,真实谷地、盆地特征消失了,提取的微流域边界也跟实际地形对不上。
原因:Z limit设置过大,或者把真实的自然洼地也一并填掉了。
解决办法:查看原始DEM中洼地的深度分布。可以在填洼前先用Zonal Fill或焦点统计对比原DEM与填洼结果的差值栅格,找出哪些区域被填得最深。如果这些区域恰好是真实的喀斯特洼地、采石坑或者水库库区,就需要重新执行Fill工具,设置一个合理的Z limit,只填掉浅层噪声造成的伪洼地。
4.2 提取的河网断断续续、不连贯
症状:河网栅格里有大量断点,河道不连续,划分出来的微流域也是七零八落。
原因:最常见的原因是原始DEM存在NoData区域,或者填洼步骤没有执行。NoData会把流向计算“截断”,水流到无效值边界就停了,后面的河网自然不连续。
解决办法:填洼前先检查DEM是否有NoData区域,有的话先用栅格计算器把NoData替换成周围有效高程值,或者用按掩膜提取裁掉无效边界。然后确保填洼步骤执行成功,再重新计算流向和汇流累积。另外一个容易被忽略的原因是DEM范围太小,流路还没汇成河就出了边界,这种情况需要扩大DEM范围。
4.3 微流域碎片太多、面积忽大忽小
症状:划分出来的微流域单元数量巨大,很多单元面积只有几百平方米,有些又有几十平方公里,两级分化严重。
原因:河网提取阈值太小,把坡面细沟都当成了河道;或者直接用河网栅格而不是河网链接作为倾泻点;又或者栅格转矢量后没有做融合和碎片筛选。
解决办法:调大河网提取阈值,重新提取河网;确认Watershed工具用的是Stream Link的结果;转矢量后执行Dissolve融合,并按面积筛选删除边缘碎片。如果希望单元更均匀,可以考虑用Stream Order工具对河网分级,只保留特定级别的河段作为划分依据,这样可以人为控制微流域的尺度。
4.4 倾泻点跑偏,出水口不在河道上
症状:自定义倾泻点做流域提取时,得到的流域面积特别小,甚至只有一个栅格。
原因:倾泻点位置没有落在河道像元上,而是落在坡面上。水流方向从坡面汇入河道需要一段距离,如果倾泻点本身不在河道内,Watershed工具只能找到该点正上方极小的汇水区域。
解决办法:使用Snap Pour Point工具,把倾泻点捕捉到指定范围内汇流累积值最大的像元上。设置合适的捕捉距离,比如100米或200米,确保点被吸到河道中心。实操中我习惯在捕捉前先加载汇流累积栅格,目视确认点的位置是否与高值沟道吻合。
4.5 面积计算结果不对,先查坐标系
症状:计算出的面积数值明显偏小或者偏大,和常识对不上。
原因:图层坐标系是WGS84经纬度,或者栅格转矢量后坐标系信息丢失。
解决办法:查看图层属性里的源坐标系。如果是地理坐标系,需要投影变换后再计算面积;如果坐标系信息显示为Unknown,需要用Define Projection工具重新定义坐标系,再做面积计算。这类问题排查顺序永远是坐标系优先,不要先怀疑工具出了问题。
5. 微流域单元做完之后还能干什么
5.1 水文模型汇水区准备
微流域单元最常见的后续应用是水文模型的汇水区输入。SWAT模型导入子流域边界时,可以直接使用ArcGIS提取的微流域矢量面,每个面作为一个水文响应单元的基础。配合坡度、土地利用、土壤类型数据,就可以构建完整的产汇流模拟框架。
我实际做过的一个项目里,把研究区划分出127个微流域单元,导入HEC-HMS后按单元设置降雨参数和糙率系数,模拟精度明显好于直接用单一流域出口做总量计算。原因很简单,微流域单元能体现空间异质性,把降雨和地表条件差异保留在模型里,而不是平均掉。
5.2 叠加统计分析:把“地形单元”变成“管理单元”
提取完微流域单元,下一步通常是叠加其他专题数据做统计。比如把土地利用类型和微流域边界做相交分析,计算每个单元内部的耕地占比、林地占比;把坡度数据按微流域做分区统计,算出每个单元的平均坡度和最大坡度;或者把降雨量插值结果按微流域聚合,得到每个单元的面雨量。
这些统计结果会自动成为微流域属性表里的字段,后续做生态评价、污染负荷估算、治理优先级排序时,直接按字段筛选排序就可以了。这时候你会真正感觉到,微流域单元已经从“地形产物”变成了“管理工具”。
5.3 进阶:结合ArcGIS Pro与自动化批处理
如果你用的是ArcGIS Pro,水文分析工具组里还有不少增强功能,比如可以更方便地做参数设置和结果符号化。更进阶的用法是使用ArcGIS Pro的模型构建器或者Python地理处理脚本,把填洼、流向、汇流累积、河网提取、流域划分这条链路封装成一个自动化流程。这样不同区域、不同DEM数据只要更换输入文件就能一键跑完,批量处理效率会高出很多。
我后来在处理多个县区的微流域划分时,就是写好一个Python脚本,循环处理每个区域的DEM,输出矢量微流域边界。整个过程从手工一个个点工具,变成了自动化批量运行,不仅省时间,还避免手动操作导致的参数不一致问题。
最后说一点个人体会。微流域提取这套流程本身并不复杂,难的是每一步都要知道自己在做什么。填洼时要知道填的是伪洼地还是真实洼地,调阈值时要知道阈值控制的是河网密度和单元尺度,选坐标系时要知道它直接影响面积计算的正确性。我见过不少朋友把默认参数从头跑到尾,做出来的结果支离破碎,回头怪数据不好,其实多半是没理解流向和汇流累积这两步到底在算什么。把这些原理吃透,换任何软件、任何数据源,你都能快速上手。