关于 verde
Verde 是用于散点空间数据网格化的 Python 技能,面向地球科学家和数据分析人员。它结合多种网格算法、数据缩减、趋势处理、处理流水线与交叉验证。
主要功能
- 01样条、线性和三次网格化
- 02密集数据的分块缩减
- 03多项式趋势拟合与移除
- 04可组合的处理流水线
- 05用于选择网格算法的交叉验证
- 06基于距离的掩膜
适用场景
- 01插值离散高程测量值
- 02网格化投影后的地理坐标
- 03网格化前缩减聚集样本
- 04验证插值方案
- 05屏蔽远离观测点的网格单元
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill verde安装后在 Claude Code 中输入/verde确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/cross_validation.mdgridders.mdscripts/grid_data.py详细介绍
Verde - 空间数据网格化
快速参考
import verde as vd
# Basic gridding
spline = vd.Spline()
spline.fit(coordinates, values) # coordinates = (lon, lat) tuple
grid = spline.grid(spacing=0.1) # Returns xarray Dataset
# Access result
elevation = grid.elevation.values
# Save output
grid.to_netcdf('output.nc')
主要类
| 类 | 用途 |
|---|---|
Spline | 双调和样条插值(平滑,外推效果好) |
Linear | Delaunay 三角剖分(速度快,不支持外推) |
Cubic | 三次插值(平滑度适中) |
Chain | 处理步骤流水线 |
BlockReduce | 将数据降采样为分块均值/中位数 |
Trend | 多项式趋势拟合与去除 |
Vector | 对 2 分量矢量数据进行网格化 |
基本操作
对离散数据进行网格化
coordinates = (longitude, latitude) # Tuple of 1D arrays
values = elevation # 1D array
spline = vd.Spline()
spline.fit(coordinates, values)
grid = spline.grid(spacing=0.1, data_names=['elevation'])
投影到笛卡尔坐标系
import pyproj
projection = pyproj.Proj(proj='merc', lat_ts=data_lat.mean())
proj_coords = projection(longitude, latitude)
spline = vd.Spline()
spline.fit(proj_coords, values)
grid = spline.grid(spacing=1000) # 1000m spacing
对大型数据集进行分块降采样
import numpy as np
reducer = vd.BlockReduce(reduction=np.median, spacing=0.1)
coords_reduced, values_reduced = reducer.filter(coordinates, values)
网格化前去除趋势
trend = vd.Trend(degree=2) # Quadratic
trend.fit(coordinates, values)
residuals = values - trend.predict(coordinates)
# Grid residuals, then add trend back
处理流水线
chain = vd.Chain([
('trend', vd.Trend(degree=1)),
('reduce', vd.BlockReduce(np.median, spacing=0.05)),
('spline', vd.Spline())
])
chain.fit(coordinates, values)
grid = chain.grid(spacing=0.01)
交叉验证
spline = vd.Spline()
scores = vd.cross_val_score(spline, coordinates, values, cv=5)
print(f"Mean R2: {scores.mean():.3f}")
屏蔽远离数据的区域
grid = spline.grid(spacing=0.1)
mask = vd.distance_mask(coordinates, maxdist=0.2, grid=grid)
grid_masked = grid.where(mask)
网格参数
| 参数 | 描述 |
|---|---|
spacing | 网格单元大小(与坐标使用相同单位) |
region | (西、东、南、北) 边界 |
shape | (n_north, n_east) 网格尺寸 |
adjust | 'spacing' 或 'region'——为精确匹配调整哪一项 |
网格器比较
| 网格器 | 速度 | 平滑度 | 外推 |
|---|---|---|---|
Spline | 中等 | 高 | 良好 |
Linear | 快 | 低 | 无 |
Cubic | 快 | 中等 | 无 |
何时选择 Verde 或其他方案
| 使用场景 | 工具 | 原因 |
|---|---|---|
| 通用空间网格化 | Verde | 类似 ML 的 API、流水线和交叉验证 |
| 基础 1D/2D 插值 | scipy.interpolate | API 更简单,不专注于空间数据 |
| 势场网格化 | Harmonica | 等效源专为重力/磁力数据设计 |
| 命令行批量网格化 | GMT | 功能强大的 CLI,适用于自动化脚本 |
| 地统计插值 | scikit-gstat / pykrige | 基于变异函数,并提供不确定性 |
| 超大型数据集(1000 万个点以上) | GMT / GDAL | 大规模数据下的内存处理能力更好 |
| 矢量数据(GPS 速度) | Verde (Vector) | 内置 2 分量矢量网格化 |
| 去除趋势并网格化 | Verde (Chain) | 通过流水线简洁地组合多个步骤 |
选择 Verde 的情况:需要使用 Python 风格、类似 scikit-learn 的 API,对 离散空间数据进行网格化,并且需要内置的交叉验证、趋势去除和流水线功能。 非常适合探索性分析和可复现工作流。
选择 scipy.interpolate 的情况:只需进行简单插值,不涉及空间坐标、投影或验证。
选择 GMT 的情况:需要通过命令行批量处理大型数据集,或需要集成基于 shell 的工作流并使用 surface 或 nearneighbor。
常见工作流
对离散空间数据进行网格化并验证
- 加载离散点数据(坐标 + 数值)
- 如有需要,将地理坐标投影到笛卡尔坐标系
- 检查数据分布并识别聚集区或空缺
- 使用
BlockReduce对密集聚集区进行降采样 - 使用
Trend(degree=1)或Trend(degree=2)去除区域趋势 - 使用
cross_val_score()对网格器参数进行交叉验证 - 根据 CV 分数调整
Spline(damping=...)或Spline(mindist=...) - 在残差上拟合选定的网格器(Spline、Linear 或 Cubic)
- 使用
.grid()按规则间距生成网格 - 将趋势加回网格化残差
- 使用
distance_mask()裁剪外推伪影 - 使用 xarray 绘图功能可视化网格:
grid.elevation.plot() - 使用
grid.to_netcdf()将结果保存为 NetCDF
常见问题
| 问题 | 解决方案 |
|---|---|
| 外推效果差 | 使用 distance_mask() 屏蔽远离数据的区域 |
| 处理大型数据时速度慢 | 先使用 BlockReduce |
| 存在区域趋势 | 网格化前使用 Trend 去除趋势 |
| 间距错误 | 检查坐标单位(度还是米) |
参考资料
脚本
- scripts/grid_data.py - 将网格离散数据转换为 NetCDF
评论
支持 Markdown