Go 语言实现的 DEM (Digital Elevation Model) 生成与处理引擎
提供完整的 DEM 生产管线:数据获取 → 数据堆栈 → 格网化插值 → 后处理滤波 → 不确定性评估 → 可视化输出。
- KDTree 空间索引 — 所有空间搜索算法 (IDW/CUBE/StepGrid/NaturalNeighbor) 使用 KDTree 替代暴力搜索,查询复杂度从 O(n) 优化到 O(log n)
- NoData 安全处理 —
NoData使用*float64指针类型,配合CoalesceNoData()和IsNoDataValue()消除零值歧义
| 方法 | 说明 |
|---|---|
| IDW | 反距离加权插值,KDTree 加速,支持 PointsToGrid (C++) 和内存 IDW |
| Kriging | 高斯/指数/球状变差函数模型的普通克里金插值 |
| Linear | 基于 Delaunay 三角剖分的线性插值 (含网格空间索引) |
| Cubic | 基于 Delaunay 三角剖分的三次插值 |
| Nearest | 最近邻插值 |
| Natural Neighbor | Laplace (non-Sibsonian) 自然邻域插值 |
| Inpaint | Fast Marching Method (Telea 2004) 影像修复填充 |
| CUBE | TVU/THU 逐点不确定性建模 + 密度模式聚类 + 信息准则 (AIC-like) 假设选择 + 邻域假设传播 |
| Step Grid | 多分辨率 step-down: 局部点密度分位数动态层级选择 + KDTree 空间索引 + 不确定性加权跨层级融合 |
| 滤镜 | 说明 |
|---|---|
| Gaussian | 可分离高斯模糊 |
| Median | 中值滤波去噪 |
| Clip | 矢量多边形裁剪 (Ray-Casting 算法) |
| Fill | 空洞填充 (边缘扩散 + IDW + GDAL FillNodata) |
| Blend | 重叠区域线性距离融合 |
| Morphology | 腐蚀/膨胀/开/闭运算 |
| Hydro | 水文 sink 填充 + 平坦区域梯度化 |
| Diff | DEM 差异检测 (支持重采样对齐) |
| Weights | 质量权重缓冲区 (Manhattan 距离变换) |
| Rivers | D8 流向 + 汇流累计 + 河网阈值提取 |
| Slope Filter | 坡度滤波 (Horn 二阶差分) |
- EGM84 / EGM96 / EGM2008 椭球高与正高互转
- VDatum 网格生成与 DEM 应用
- 统计异常值过滤 (Statistical Outlier)
- 半径异常值过滤 (Radius Outlier)
- 体素/随机/径向降采样
- 山体阴影 (Hillshade)
- 坡度/坡向 (Slope/Aspect)
- 彩色晕渲 (Color Relief)
- 叠合渲染 (Shaded Relief)
- Split-Sample 交叉验证不确定性
- Proximity 距离基不确定性
- Combined 组合不确定性
- SRTM / GEBCO / Copernicus / NOAA Multibeam / USGS TNM / EMODNet / ArcticDEM
- 5 波段数据堆栈 (Elevation/Count/Weight/Uncertainty/SourceID)
- XYZ 点文件解析
- LAS 文件封装
- GeoTIFF / COG
- 多波段 RGB
- 灵活的数据类型 / 压缩 / tiling 配置
输入数据 (GeoTIFF/LAS/XYZ/...)
↓
datalist/ 数据堆栈 → 5 波段 (Z/Count/Weight/Uncertainty/SourceID)
↓
waffle/ 格网化插值 → IDW/Kriging/TIN/NaturalNeighbor/CUBE...
↓
grits/ 后处理滤波 → 平滑/裁剪/填充/融合/形态学...
↓
datum/ 垂向基准变换 → EGM84/96/2008
↓
uncertainty/ 不确定性评估 → Split-Sample/Proximity
↓
perspecto/ 可视化 → Hillshade/Slope/ColorRelief
↓
output.go 输出 → GeoTIFF/COG
package main
import (
"github.com/flywave/go-dem"
"github.com/flywave/go-dem/waffle"
"github.com/flywave/go-geo"
)
func main() {
srs := geo.NewProj("EPSG:4326")
region := dem.NewRegionFromBBox(-125, 40, -122, 43, srs, 0.0005, 0.0005)
w, _ := waffle.New(dem.MethodIDW)
result, _ := w.Run([]string{"input.tif"}, &waffle.Options{
Region: region,
})
dem.CreateDEM(result.DEM, region, "output.tif", -9999)
}| 库 | 用途 |
|---|---|
| flywave-gdal | GDAL 栅格 I/O |
| flywave-pointcloud | 点云处理 |
| go-proj | 坐标参考系统变换 |
| go-geoid | EGM 垂向基准 |
| go-geo | 地理空间类型 (Proj/Extent/Grid) |
| go-kriging | Kriging 插值 |
| go-delaunay | Delaunay 三角剖分 |
| go-geom | 几何类型 |
| go-geos | GEOS 空间操作 |
# 运行所有纯 Go 算法测试
go test ./dem ./grits/ ./perspecto/ ./uncertainty/ ./datalist/ ./waffle/
# 运行包含 CGo 的完整测试 (可能需要较长时间)
go test -timeout 120s ./...MIT