SuperAPI AI 工具集

landlab

数据与分析

查看项目

更新于 10-16 02:02

技能介绍

用途

Landlab 是一个基于 Python 的地表过程与地貌演化数值建模框架,用于构建二维数值模型,模拟侵蚀、水文、土壤搬运和地貌演化等过程。它采用模块化组件设计,可将多种地表过程组合在同一个模拟中运行。

主要能力

网格类型

Landlab 提供多种网格类型,适用于不同场景:

网格 用途
RasterModelGrid 规则矩形网格(最常用)
HexModelGrid 六边形网格(各向同性流动)
VoronoiDelaunayGrid 不规则点分布
NetworkModelGrid 仅河道网络

字段与边界

字段(fields)是存储在网格元素(节点、链接、单元)上的数据。例如:

z = grid.add_zeros('topographic__elevation', at='node')
grid.at_node['drainage_area']  # 访问已有字段

边界条件可设置网格边缘的开闭状态,例如关闭三条边、保留一条作为出口:

grid.set_closed_boundaries_at_grid_edges(True, True, True, False)
z[grid.core_nodes] += uplift * dt  # 核心节点排除边界节点

核心组件

水流路径(Flow Routing)

from landlab.components import FlowAccumulator
fa = FlowAccumulator(grid, flow_director='D8')  # 或 'Steepest'、'MFD'
fa.run_one_step()
drainage_area = grid.at_node['drainage_area']

河流功率侵蚀(Stream Power Erosion)

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 单位为年

坡面扩散(Hillslope Diffusion)

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)  # 保存所有字段

使用方式

多组件模型示例

from landlab import RasterModelGrid
from landlab.components import FlowAccumulator, StreamPowerEroder, LinearDiffuser
import numpy as np

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

典型工作流

  1. 创建具有合适尺寸和间距的 RasterModelGrid
  2. 初始化 topographic__elevation 字段(平坦加噪声,或加载 DEM)
  3. 设置边界条件(开放一条边作为出口,关闭其余边)
  4. 创建 FlowAccumulator,选择水流方向算法(D8 或 MFD)
  5. 创建 StreamPowerEroder,设置侵蚀系数 K_sp
  6. 创建 LinearDiffuser 处理坡面过程
  7. 定义时间步 dt 和总运行时长,选择抬升速率
  8. 运行时间循环:水流路径、侵蚀、扩散,然后抬升
  9. 按间隔用 write_netcdf() 或 write_esri_ascii() 保存快照
  10. 用 grid.imshow() 可视化最终地形
  11. 分析汇水面积和河道剖面
  12. 提取河流纵剖面用于陡峭度分析

适用场景

  • 地貌演化模拟:需要模块化、基于组件的框架,在单次模拟中组合多种地表过程(侵蚀、扩散、水流路径、风化)
  • 地表-地下水耦合:包含水文与地貌组件
  • 河道网络提取:Landlab 或 pysheds 均可较好处理水流路径
  • 土壤生成与搬运:提供专门的 weathering 和 soil 组件
  • 地貌学教学:组件 API 清晰,教程完善

与其他工具的对比:

场景 工具 原因
地貌演化模拟 Landlab 模块化组件,Python 原生
流域尺度地层学 Badlands 侧重沉积物沉积与盆地充填
地形分析(MATLAB) TopoToolbox 成熟的 MATLAB DEM 分析工具包
简单扩散/侵蚀 自定义 numpy 基础模型依赖更少
地表-地下水耦合 Landlab 包含水文与地貌组件
河道网络提取 Landlab 或 pysheds 两者都能较好处理水流路径
土壤生成与搬运 Landlab 专门的 weathering 和 soil 组件
地貌学教学 Landlab 组件 API 清晰,教程完善

限制与常见问题

问题 解决方案
平坦区域阻断水流 在初始地形中加入小的随机噪声
边界效应 确保至少有一条开放边界边用于排水
侵蚀不稳定 减小 dt 或 K_sp;检查 Courant 条件
字段名错误 使用 Landlab 精确名称:'topographic__elevation'、'drainage_area'
大网格内存问题 降低网格分辨率,或仅对河道使用 NetworkModelGrid

使用提示

  • 先设置边界——在添加组件之前完成
  • 使用 core_nodes——排除边界节点进行操作
  • 检查字段名——组件期望特定名称(如 'topographic__elevation')
  • 从简单开始——逐步添加组件并逐一验证

参考资料

  • Components Reference - 按类别列出的可用组件
  • Grids Reference - 网格类型与配置

脚本

  • scripts/erosion_model.py - 基础侵蚀模型模板