当前位置:首页>python>用 Python 从 DEM 数据中提取河网与流域:一份完整的水文分析指南

用 Python 从 DEM 数据中提取河网与流域:一份完整的水文分析指南

  • 2026-10-11 06:41:50
用 Python 从 DEM 数据中提取河网与流域:一份完整的水文分析指南

用 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:地形分析

生成三种基础地形图:

产品
说明
用途
山体阴影
模拟太阳光照,灰度渲染
增强地形立体感,作为底图
坡度
地表倾斜程度(度或百分比)
水土流失分析、土地利用规划
坡向
地表朝向(0-360°)
光照分析、植被分布研究

步骤 3-4:水流方向与累积量

使用经典的 D8 算法——每个栅格单元检查周围 8 个邻居,水流流向坡度下降最快的方向。

水流累积量则统计每个栅格上游有多少个单元的水流经此处。这个值是河网提取的关键依据:

  • • 山脊处值接近 0
  • • 河道处值较大
  • • 主河道处值最大

步骤 5:河网提取

设定一个阈值,水流累积量超过该值的栅格被判定为河道:

  • • 阈值越小 → 河网越密集(包含细小支流)
  • • 阈值越大 → 河网越稀疏(只保留主干河道)

脚本会自动用多个阈值(如 500、1000、2000、5000)同时提取,方便对比选择最合适的阈值。

步骤 6:河网矢量化

将栅格河网转换为 Shapefile 矢量线,可以在 QGIS、ArcGIS 中打开编辑,也可以计算河流长度、分级等属性。

步骤 7-8:流域划分

自动识别所有子流域,同时支持指定出口点提取特定流域。脚本会自动寻找水流累积量最大的点作为流域出口,并完成倾泻点捕捉和流域提取。

步骤 9:可视化

自动生成三张专业图表:

  1. 1. 地形分析图(DEM、山体阴影、坡度、坡向)
  2. 2. 水文分析图(水流累积量、河网、子流域、指定流域)
  3. 3. 阈值对比图(不同阈值下的河网密度对比)

四、使用方法

环境准备

pip install whitebox rasterio matplotlib numpy geopandas

运行

  1. 1. 将 DEM 文件(dem1.tif)放到脚本同级目录
  2. 2. 直接运行:
python whitebox_test.py

参数说明

所有核心参数集中在 Config 类中,可根据需求调整:

参数
说明
默认值
DEM_FILE
输入的 DEM 路径
dem.tif
DEPRESSION_METHOD
洼地处理方法
fill
STREAM_THRESHOLDS
多阈值对比列表
[500, 1000, 2000, 5000]
DEFAULT_THRESHOLD
最终使用的阈值
1000
SNAP_DISTANCE
倾泻点捕捉距离(像素)
50

五、运行结果

脚本运行完成后,hydro_output 目录中会生成:

  • • 栅格文件(.tif):预处理后的 DEM、地形因子、水流方向、累积量、河网、子流域
  • • 矢量文件(.shp):矢量化的河网
  • • 图表文件(.png):三张专业可视化图

六、适用场景

  • • 水文与水资源研究:快速提取流域水系,计算汇水面积
  • • 地质灾害评估:分析地形坡度、坡向与滑坡的关系
  • • 环境规划:划分汇水区,评估污染物扩散路径
  • • GIS 教学:用开源工具完成水文分析教学演示
  • • 遥感与地理分析:自动化处理批量 DEM 数据

七、总结

相比 ArcGIS 的手动操作流程,这套脚本的优势在于:

  1. 1. 全自动化:从 DEM 到成果图件一键完成
  2. 2. 开源免费:基于 WhiteboxTools,无需商业许可
  3. 3. 可复现:所有参数集中配置,方便批量处理和方案对比
  4. 4. 结果专业:自动生成阈值对比图和综合分析图

如果你手头有 DEM 数据,不妨试试这个流程 —— 用 9 步自动完成水文分析,让 GIS 工作流更高效。


项目资源

完整脚本及说明文档可在评论区留言留言「水文分析」获取下载链接。

如有疑问,欢迎在评论区留言交流。


本文由 3S&ML 原创,欢迎转发分享。

最新文章

随机文章