用 Python 从 DEM 数据中提取河网与流域:一份完整的水文分析指南
只需一个 DEM 文件,就能自动提取河网、划分流域、生成专业图表。
一、背景
在 GIS 水文分析中,DEM(数字高程模型) 是基础数据源。我们往往需要基于 DEM 完成以下工作:
传统做法是使用 ArcGIS 的 Hydrology 工具箱或 QGIS 的插件,步骤繁琐且需要手动操作。今天介绍一个开源 Python 工具——WhiteboxTools,结合一套完整的自动化脚本,能够一键完成上述全部流程。
二、工具简介
WhiteboxTools 是加拿大圭尔夫大学开发的开源地理空间分析平台,支持 500 多种栅格和矢量分析工具。它没有图形界面,但提供了 Python 绑定(whitebox 包),可以方便地集成到自动化流程中。
我们基于 whitebox、rasterio、matplotlib、geopandas 等库,编写了一个完整的水文分析脚本,实现了从原始 DEM 到成果图件的全自动处理。
三、分析流程
整个流程分为 9 个步骤,环环相扣:
DEM 原始数据 ↓① DEM 预处理(洼地处理) ↓② 地形分析(山体阴影、坡度、坡向) ↓③ 水流方向计算(D8 算法) ↓④ 水流累积量计算 ↓⑤ 河网提取(多阈值对比) ↓⑥ 河网矢量化 ↓⑦ 子流域自动划分 ↓⑧ 指定出口的流域提取 ↓⑨ 结果可视化
步骤 1:DEM 预处理
DEM 数据通常含有虚假洼地(sink)——由于测量误差或插值算法导致的不真实低点。这些洼地会使水流"困住",无法正确计算流向。
脚本支持两种处理方法:
- • 冲沟法(Breach):在洼地边缘"挖"一条通道让水流出,对原始 DEM 改动最小
- • 填洼法(Fill):将洼地填平到溢出高程,更常用但会抬高局部高程
默认使用填洼法,可以通过修改 DEPRESSION_METHOD 参数切换。
步骤 2:地形分析
生成三种基础地形图:
步骤 3-4:水流方向与累积量
使用经典的 D8 算法——每个栅格单元检查周围 8 个邻居,水流流向坡度下降最快的方向。
水流累积量则统计每个栅格上游有多少个单元的水流经此处。这个值是河网提取的关键依据:
步骤 5:河网提取
设定一个阈值,水流累积量超过该值的栅格被判定为河道:
脚本会自动用多个阈值(如 500、1000、2000、5000)同时提取,方便对比选择最合适的阈值。
步骤 6:河网矢量化
将栅格河网转换为 Shapefile 矢量线,可以在 QGIS、ArcGIS 中打开编辑,也可以计算河流长度、分级等属性。
步骤 7-8:流域划分
自动识别所有子流域,同时支持指定出口点提取特定流域。脚本会自动寻找水流累积量最大的点作为流域出口,并完成倾泻点捕捉和流域提取。
步骤 9:可视化
自动生成三张专业图表:
- 2. 水文分析图(水流累积量、河网、子流域、指定流域)
四、使用方法
环境准备
pip install whitebox rasterio matplotlib numpy geopandas
运行
- 1. 将 DEM 文件(dem1.tif)放到脚本同级目录
python whitebox_test.py
参数说明
所有核心参数集中在 Config 类中,可根据需求调整:
| | |
|---|
DEM_FILE | | |
DEPRESSION_METHOD | | |
STREAM_THRESHOLDS | | |
DEFAULT_THRESHOLD | | |
SNAP_DISTANCE | | |
五、运行结果
脚本运行完成后,hydro_output 目录中会生成:
- • 栅格文件(.tif):预处理后的 DEM、地形因子、水流方向、累积量、河网、子流域
六、适用场景
- • 水文与水资源研究:快速提取流域水系,计算汇水面积
七、总结
相比 ArcGIS 的手动操作流程,这套脚本的优势在于:
- 2. 开源免费:基于 WhiteboxTools,无需商业许可
- 3. 可复现:所有参数集中配置,方便批量处理和方案对比
如果你手头有 DEM 数据,不妨试试这个流程 —— 用 9 步自动完成水文分析,让 GIS 工作流更高效。
项目资源
完整脚本及说明文档可在评论区留言留言「水文分析」获取下载链接。
如有疑问,欢迎在评论区留言交流。
本文由 3S&ML 原创,欢迎转发分享。