关于 landlab
Landlab 是用于地貌演化建模的 Python 框架,适合研究人员和教学场景。它以可组合的网格与过程组件模拟水流、侵蚀和坡面扩散。
主要功能
- 01多种网格类型
- 02水流路径与汇流面积计算
- 03河流侵蚀和坡面扩散
- 04地形数据读写
- 05组合地貌过程组件
适用场景
- 01构建含侵蚀和抬升的地貌模型
- 02分析流域汇流面积与河道剖面
- 03读取和保存 DEM 数据
- 04教学演示地貌过程建模
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill landlab安装后在 Claude Code 中输入/landlab确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/components.mdgrids.mdscripts/erosion_model.py详细介绍
Landlab - 地表过程建模
快速参考
from landlab import RasterModelGrid
from landlab.components import FlowAccumulator, StreamPowerEroder
import numpy as np
# Create grid
grid = RasterModelGrid((100, 100), xy_spacing=10.0)
z = grid.add_zeros('topographic__elevation', at='node')
z += np.random.rand(grid.number_of_nodes) * 0.1
# Set boundaries (open bottom edge)
grid.set_closed_boundaries_at_grid_edges(True, True, True, False)
# Create and run components
fa = FlowAccumulator(grid, flow_director='D8')
sp = StreamPowerEroder(grid, K_sp=1e-5)
for _ in range(100):
fa.run_one_step()
sp.run_one_step(dt=1000)
z[grid.core_nodes] += 0.001 * 1000 # Uplift
grid.imshow('topographic__elevation', cmap='terrain')
网格类型
| 网格 | 用例 |
|---|---|
RasterModelGrid | 规则矩形网格(最常见) |
HexModelGrid | 六边形网格(各向同性流动) |
VoronoiDelaunayGrid | 不规则点分布 |
NetworkModelGrid | 仅用于河道网络 |
核心概念
字段和边界
# Fields: data stored at grid elements (nodes, links, cells)
z = grid.add_zeros('topographic__elevation', at='node')
grid.at_node['drainage_area'] # Access existing field
# Boundaries: close all edges except outlet
grid.set_closed_boundaries_at_grid_edges(True, True, True, False)
z[grid.core_nodes] += uplift * dt # Core nodes exclude boundaries
基本操作
流向追踪
from landlab.components import FlowAccumulator
fa = FlowAccumulator(grid, flow_director='D8') # or 'Steepest', 'MFD'
fa.run_one_step()
drainage_area = grid.at_node['drainage_area']
河流功率侵蚀
from landlab.components import StreamPowerEroder
sp = StreamPowerEroder(grid, K_sp=1e-5, m_sp=0.5, n_sp=1.0)
sp.run_one_step(dt=1000) # dt in years
坡面扩散
from landlab.components import LinearDiffuser
ld = LinearDiffuser(grid, linear_diffusivity=0.01) # m^2/yr
ld.run_one_step(dt=100)
加载/保存 DEM 数据
from landlab.io import read_esri_ascii, write_esri_ascii
from landlab.io.netcdf import read_netcdf, write_netcdf
grid, z = read_esri_ascii('dem.asc', name='topographic__elevation')
write_esri_ascii('output.asc', grid, names='topographic__elevation')
write_netcdf('output.nc', grid) # Save all fields
多组件模型
from landlab import RasterModelGrid
from landlab.components import FlowAccumulator, StreamPowerEroder, LinearDiffuser
grid = RasterModelGrid((100, 100), xy_spacing=100.0)
z = grid.add_zeros('topographic__elevation', at='node')
z += grid.node_y / 1000 + np.random.rand(grid.number_of_nodes) * 0.1
grid.set_closed_boundaries_at_grid_edges(True, True, True, False)
fa = FlowAccumulator(grid, flow_director='D8')
sp = StreamPowerEroder(grid, K_sp=1e-5)
ld = LinearDiffuser(grid, linear_diffusivity=0.01)
dt, uplift_rate = 1000, 0.001
for _ in range(500):
fa.run_one_step()
sp.run_one_step(dt)
ld.run_one_step(dt)
z[grid.core_nodes] += uplift_rate * dt
何时使用及替代方案
| 用例 | 工具 | 原因 |
|---|---|---|
| 景观演变建模 | Landlab | 模块化组件,原生支持 Python |
| 流域尺度地层建模 | Badlands | 专注于沉积物沉积和盆地充填 |
| 地形分析(MATLAB) | TopoToolbox | 成熟的 MATLAB DEM 分析工具包 |
| 简单扩散/侵蚀 | Custom numpy | 基本模型所需依赖更少 |
| 地表-地下耦合 | Landlab | 提供水文学和地貌学组件 |
| 河道网络提取 | Landlab 或 pysheds | 两者都能很好地处理流向追踪 |
| 土壤生成和输运 | Landlab | 提供专用的风化和土壤组件 |
| 地貌学教学 | Landlab | 组件 API 清晰,教程丰富 |
选择 Landlab 的情况:你需要一个模块化、基于组件的框架,用于景观演变建模,并在单次模拟中整合多种地表过程(侵蚀、扩散、流向追踪、风化)。
选择 Badlands 的情况:你的重点是流域尺度的景观演变,尤其关注沉积物输运和地层结构。
选择 custom numpy 的情况:你只需要简单的二维扩散或河流功率模型,不需要完整组件框架带来的额外开销。
常见工作流
含侵蚀和隆升的景观演变模型
- 创建具有适当尺寸和间距的
RasterModelGrid - 初始化
topographic__elevation字段(平坦地形加噪声,或加载 DEM) - 设置边界条件(将一条边设为出口开放,其余边关闭)
- 创建
FlowAccumulator,并选择流向算法(D8 或 MFD) - 创建
StreamPowerEroder,并设置侵蚀系数 K_sp - 创建用于坡面过程的
LinearDiffuser - 定义时间步长
dt和总运行时间;选择隆升速率 - 运行时间循环:流向追踪、侵蚀、扩散,然后隆升
- 使用
write_netcdf()或write_esri_ascii()按间隔保存快照 - 使用
grid.imshow()可视化最终地形 - 分析汇水面积和河道剖面
- 提取河流纵剖面,用于坡度指数分析
常见问题
| 问题 | 解决方案 |
|---|---|
| 平坦区域阻碍水流 | 为初始地形添加少量随机噪声 |
| 边界效应 | 确保至少有一条开放边界用于排水 |
| 侵蚀不稳定 | 减小 dt 或 K_sp;检查 Courant 条件 |
| 字段名称错误 | 使用准确的 Landlab 名称:'topographic__elevation'、'drainage_area' |
| 大型网格的内存问题 | 降低网格分辨率,或仅对河道使用 NetworkModelGrid |
提示
- 先设置边界——再添加组件
- 使用 core_nodes——操作时排除边界节点
- 检查字段名称——组件需要特定名称(例如,'topographic__elevation')
- 从简单开始——逐步添加组件,并逐一验证
参考资料
脚本
- scripts/erosion_model.py - 基本侵蚀模型模板
评论
支持 Markdown