mcpField
L
landlab

landlab

github.com/steadfastasart数据与数据库7357 次安装6 周前更新
代码仓库

关于 landlab

Landlab 是用于地貌演化建模的 Python 框架,适合研究人员和教学场景。它以可组合的网格与过程组件模拟水流、侵蚀和坡面扩散。

主要功能

  1. 01多种网格类型
  2. 02水流路径与汇流面积计算
  3. 03河流侵蚀和坡面扩散
  4. 04地形数据读写
  5. 05组合地貌过程组件

适用场景

  1. 01构建含侵蚀和抬升的地貌模型
  2. 02分析流域汇流面积与河道剖面
  3. 03读取和保存 DEM 数据
  4. 04教学演示地貌过程建模

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill landlab

安装后在 Claude Code 中输入/landlab确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
components.md
grids.md
scripts/
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

提示

  1. 先设置边界——再添加组件
  2. 使用 core_nodes——操作时排除边界节点
  3. 检查字段名称——组件需要特定名称(例如,'topographic__elevation')
  4. 从简单开始——逐步添加组件,并逐一验证

参考资料

脚本

评论

支持 Markdown