地形数据处理:从原始数据到可用模型

做风资源评估这么多年,我有个深刻的体会:地形数据搞不定,后面所有仿真都是白搭。你想想看,CFD 计算再牛,输入的地形是错的,结果能信吗?

这一章,我们就来聊聊地形数据处理的完整流程。从拿到原始数据开始,到最终导出能用的模型,每一步我都会结合自己的项目经验来讲。

核心观点:地形数据处理不是简单的「导入-导出」,而是一个「检查-修复-优化」的迭代过程。我见过太多人直接拿 DEM 数据导入 WT,结果算出来的风图谱偏差 20% 以上。

地形数据处理流程 格式解析 DEM/DTM/ASCII 导入与检查 坐标/范围/空洞 编辑与平滑 滤波/插值/修复 导出 WT 格式/网格 检查不通过则返回 迭代修正

3.1 地形数据格式解析

地形数据的格式,说白了就是「怎么把地面高度存成文件」。常见的格式有几种,我一个个说。

3.1.1 常见格式一览

格式 特点 适用场景
ASCII Grid (.asc) 文本格式,可读性强,文件较大 小范围、调试用
GeoTIFF (.tif) 二进制,含地理信息,压缩率高 大范围、专业数据
DTED (.dt0/.dt1/.dt2) 军事标准,分辨率固定 国防、航空领域
Shapefile (.shp) 矢量格式,含等高线 已有等高线数据

我个人最常用的是 ASCII Grid 和 GeoTIFF。为什么?因为 WT 对这两种格式支持最好,而且数据源容易获取。

小技巧:如果你拿到的是 GeoTIFF,可以用 GDAL 转成 ASCII Grid。命令很简单:gdal_translate -of AAIGrid input.tif output.asc

3.1.2 格式内部结构

拿 ASCII Grid 举例,它的结构其实很直观:

ncols         1200
nrows         800
xllcorner     500000.0
yllcorner     3000000.0
cellsize      25.0
NODATA_value  -9999
120.5 121.3 119.8 118.9 ...
...

这里要注意几个关键参数:

  • ncols/nrows:网格的列数和行数。我遇到过有人把行列搞反,结果地形直接变形了。
  • xllcorner/yllcorner:左下角坐标。这个最容易出错,尤其是投影坐标系不统一的时候。
  • cellsize:网格分辨率。25米还是50米,直接影响计算精度和速度。
  • NODATA_value:无效值标记。嗯,这里要注意,WT 默认把 -9999 当作无效值,但有些数据源用的是 -32768。

3.2 地形数据导入与检查

数据导入看起来简单,但坑不少。我记得有一次,导入一个 5GB 的 DEM 文件,WT 直接卡死了。后来才发现是坐标系没设对。

3.2.1 导入步骤

  1. 打开 WT,点击 File → Import → Terrain
  2. 选择文件格式(.asc / .tif / .dt0)
  3. 设置坐标系(UTM / 经纬度)
  4. 确认范围是否覆盖项目区域
  5. 点击 OK 导入

警告:导入前一定要确认坐标系!我见过有人用 WGS84 经纬度数据,但 WT 里设成了 UTM 50N,结果地形偏移了 200 多公里。这种错误一旦发生,后面所有工作都白费。

3.2.2 检查清单

导入后,我习惯做以下几项检查:

  • 范围检查:地形范围是否覆盖项目区域 + 至少 5km 缓冲区
  • 高程检查:最高点和最低点是否合理(比如海边项目出现 -500m 就不对)
  • 空洞检查:有没有 NODATA 区域(尤其是山区,雷达阴影区常见)
  • 分辨率检查:网格大小是否满足 CFD 计算要求(一般建议 ≤ 50m)

你可能会问:「空洞怎么检查?」其实 WT 自带的 Terrain Check 工具就能做。它会高亮显示所有无效值区域,一目了然。

3.3 地形数据编辑与平滑

这一步是最考验经验的。原始数据往往有噪声、空洞、或者不合理的突变。我曾经处理过一个山地项目,原始 DEM 里有个 200 米深的「假坑」,后来发现是数据采集时的传感器错误。

3.3.1 空洞填充

空洞填充的方法有几种:

方法 原理 适用场景
最近邻插值 用最近的已知点填充 小空洞(< 5个网格)
双线性插值 用周围4个点加权平均 中等空洞(5-20个网格)
克里金插值 基于统计学的空间插值 大空洞(> 20个网格)

我个人建议:能不用克里金就不用。为什么?因为它会「平滑」掉真实地形特征,尤其是山脊线。我吃过这个亏,后来改用双线性插值 + 手动修正。

3.3.2 地形平滑

平滑的目的是去除高频噪声,但过度平滑会丢失地形细节。WT 提供了几种平滑算法:

  • 均值滤波:简单粗暴,但容易模糊边界
  • 中值滤波:保留边缘,适合去除孤立噪声
  • 高斯滤波:平滑效果最好,但参数难调

经验之谈:我一般先用中值滤波(3x3 窗口)处理一次,然后手动检查山脊和山谷区域。如果发现过度平滑,就用 WT 的「局部修复」工具手动调整。记住:平滑的目的是让 CFD 计算稳定,不是让地形变漂亮

3.3.3 手动编辑

有些问题自动工具搞不定,就得手动上。WT 的 Terrain Editor 支持:

  • 单个网格高度修改
  • 区域高度批量修改
  • 等高线绘制/修改
  • 地形切割/填充

举个例子:风电场场区内的道路、平台等人工构筑物,在 DEM 里可能表现为突兀的凸起或凹陷。这些地方需要手动修正,否则 CFD 计算会在这些位置产生虚假的加速或减速区。

3.4 地形数据导出

处理完的地形数据,最终要导出为 WT 能用的格式。导出时要注意几个关键点:

3.4.1 导出格式选择

导出格式 用途 注意事项
.ter (WT 原生格式) 直接用于 CFD 计算 二进制,不可读,但效率最高
.asc (ASCII Grid) 与其他软件交换数据 文件较大,注意坐标系信息
.stl (3D 模型) 可视化展示 需要设置导出分辨率

3.4.2 导出步骤

  1. 在 WT 中确认地形已保存(File → Save Terrain)
  2. 选择 File → Export → Terrain
  3. 选择格式(推荐 .ter)
  4. 设置导出范围(可选,默认全部)
  5. 点击 OK 导出

提示:导出前最好做一次「地形质量报告」。WT 的 Tools → Terrain Statistics 会生成一个报告,包含高程范围、坡度分布、粗糙度等信息。我每次导出前都会看一遍,确认数据没问题。

3.4.3 导出后的验证

导出不是终点。我习惯把导出的 .ter 文件重新导入到一个新项目,做一次交叉验证:

  • 检查高程值是否与原始数据一致(误差 < 1%)
  • 检查边界是否完整(没有裁切)
  • 检查坐标系信息是否丢失

有一次,我导出后发现高程整体偏移了 0.5 米。排查了半天,原来是导出时选了「相对高程」而不是「绝对高程」。这种细节,不注意就会出问题。

最后提醒:地形数据是 CFD 仿真的「地基」。地基不稳,楼盖得再高也是危楼。我建议每次处理完地形数据后,都做一次「地形敏感性分析」—— 把地形稍微抬高/降低 5%,看看计算结果变化大不大。如果变化很大,说明地形处理还有问题。


好了,地形数据处理这块就聊到这儿。下一章我们会进入网格划分,那是另一个容易踩坑的地方。到时候再细聊。