地形数据处理:从原始数据到可用模型
做风资源评估这么多年,我有个深刻的体会:地形数据搞不定,后面所有仿真都是白搭。你想想看,CFD 计算再牛,输入的地形是错的,结果能信吗?
这一章,我们就来聊聊地形数据处理的完整流程。从拿到原始数据开始,到最终导出能用的模型,每一步我都会结合自己的项目经验来讲。
核心观点:地形数据处理不是简单的「导入-导出」,而是一个「检查-修复-优化」的迭代过程。我见过太多人直接拿 DEM 数据导入 WT,结果算出来的风图谱偏差 20% 以上。
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 导入步骤
- 打开 WT,点击 File → Import → Terrain
- 选择文件格式(.asc / .tif / .dt0)
- 设置坐标系(UTM / 经纬度)
- 确认范围是否覆盖项目区域
- 点击 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 导出步骤
- 在 WT 中确认地形已保存(File → Save Terrain)
- 选择 File → Export → Terrain
- 选择格式(推荐 .ter)
- 设置导出范围(可选,默认全部)
- 点击 OK 导出
提示:导出前最好做一次「地形质量报告」。WT 的 Tools → Terrain Statistics 会生成一个报告,包含高程范围、坡度分布、粗糙度等信息。我每次导出前都会看一遍,确认数据没问题。
3.4.3 导出后的验证
导出不是终点。我习惯把导出的 .ter 文件重新导入到一个新项目,做一次交叉验证:
- 检查高程值是否与原始数据一致(误差 < 1%)
- 检查边界是否完整(没有裁切)
- 检查坐标系信息是否丢失
有一次,我导出后发现高程整体偏移了 0.5 米。排查了半天,原来是导出时选了「相对高程」而不是「绝对高程」。这种细节,不注意就会出问题。
最后提醒:地形数据是 CFD 仿真的「地基」。地基不稳,楼盖得再高也是危楼。我建议每次处理完地形数据后,都做一次「地形敏感性分析」—— 把地形稍微抬高/降低 5%,看看计算结果变化大不大。如果变化很大,说明地形处理还有问题。
好了,地形数据处理这块就聊到这儿。下一章我们会进入网格划分,那是另一个容易踩坑的地方。到时候再细聊。