3. DEM数据获取与预处理:数据下载渠道、格式转换、投影变换、重采样与裁剪

各位同学,今天咱们来聊聊DEM数据获取与预处理。说实话,这部分工作看着基础,但坑特别多。我当年刚入行时,就因为投影没处理好,导致整个导航系统跑偏了十几公里——嗯,那滋味可不好受。

DEM数据,说白了就是数字高程模型。它记录的是地表每个点的高度信息。地形辅助导航靠的就是它。你想想看,飞机或者导弹飞过一片区域,雷达测一下高度,再跟DEM一比对,位置就出来了。所以DEM的质量,直接决定了导航的精度。

核心要点:DEM数据获取与预处理,是整个地形辅助导航数据库构建的基石。数据源选不对、格式转不好、投影搞错了、重采样精度丢了、裁剪范围偏了——任何一个环节出问题,后面全白搭。

3.1 数据下载渠道

DEM数据从哪来?我常用的渠道有这么几个:

  • SRTM(航天飞机雷达地形测绘任务):全球覆盖,分辨率90米(3弧秒)和30米(1弧秒)。我个人习惯用30米的,精度够用,数据量也适中。
  • ASTER GDEM(先进星载热发射和反射辐射计全球数字高程模型):分辨率也是30米,但覆盖范围比SRTM更广,高纬度地区也能用。
  • ALOS World 3D(日本ALOS卫星数据):分辨率30米,精度比SRTM和ASTER都好一些。我在项目中遇到过,ALOS在山区表现特别棒,沟壑细节保留得很好。
  • 国内数据源:比如地理空间数据云、国家基础地理信息中心。这些平台提供国产卫星的DEM数据,像高分系列、资源系列。国内项目我建议优先用这个,坐标系直接就是CGCS2000,省去投影转换的麻烦。

下载时要注意什么?嗯,这里有个坑:很多平台的数据是分幅存储的,一个文件覆盖一个经纬度格子。如果你的项目区域跨了多个格子,就得下载多个文件,后面再拼接。我曾经一次性下载了16个分幅文件,拼接时差点没把自己绕晕。

小技巧:下载前先确认数据版本。SRTM有V2.1、V3.0等版本,V3.0修复了V2.1中的一些空洞问题。我建议直接用最新版,省得后面还要做空洞填充。

3.2 格式转换:GeoTIFF与ASCII

DEM数据常见的格式有两种:GeoTIFF和ASCII。GeoTIFF是二进制格式,带地理坐标信息,文件小、读取快。ASCII是文本格式,每个格网点的高度值用数字表示,可读性强,但文件巨大。

我一般用GDAL做格式转换。GDAL是开源的地理数据转换库,几乎所有GIS工具都在用它。来看看具体怎么操作:

# 将GeoTIFF转换为ASCII
gdal_translate -of AAIGrid input.tif output.asc

# 将ASCII转换为GeoTIFF
gdal_translate -of GTiff input.asc output.tif

# 批量转换(我常用的方式)
for f in *.tif; do
  gdal_translate -of AAIGrid "$f" "${f%.tif}.asc"
done

为什么需要ASCII格式?因为很多导航算法库只认ASCII。但ASCII文件太大了,一个30米分辨率的1度×1度格网文件,可能有几百兆。所以我建议:开发调试阶段用ASCII,方便查看数据;正式部署时用GeoTIFF,节省存储和读取时间。

注意:ASCII格式的DEM文件,第一行通常是ncols、nrows、xllcorner、yllcorner、cellsize、NODATA_value这些头信息。如果你手动编辑过这个文件,一定要保证头信息跟数据一致。我曾经手贱改了一个数字,结果整个DEM偏移了半个像素——排查了整整两天。

3.3 投影变换

投影变换,说白了就是把地球这个椭球体上的坐标,映射到平面上。DEM数据原始坐标通常是经纬度(WGS84),但导航系统需要的是平面坐标(比如UTM、高斯-克吕格)。

为什么一定要做投影变换?你想想看,经纬度坐标下,一个像素代表的实际距离,在不同纬度是不一样的。赤道附近1度约111公里,到了北极可能只有几十公里。导航系统需要等距或等角的平面坐标,否则算出来的位置会偏差很大。

我常用的投影方式:

  • UTM投影:全球通用,分带(6度一个带)。适合中低纬度地区。
  • 高斯-克吕格投影:国内常用,分带(3度或6度)。适合中国区域。
  • 兰勃特等角投影:适合中纬度东西走向的区域,比如美国本土。

用GDAL做投影变换的代码:

# 将WGS84经纬度转换为UTM 50N(北京地区)
gdalwarp -t_srs "+proj=utm +zone=50 +datum=WGS84" input.tif output_utm.tif

# 转换为CGCS2000高斯-克吕格3度带
gdalwarp -t_srs "+proj=gauss +ellps=CGCS2000 +zone=38" input.tif output_gk.tif

避坑指南:我曾经在项目中直接用了WGS84的DEM数据做导航,结果在东北地区偏差了将近500米。原因就是没做投影变换,直接用经纬度算距离,纬度越高误差越大。所以记住:导航系统里,永远用平面坐标,别偷懒。

3.4 重采样

重采样,就是把DEM数据从一个分辨率调整到另一个分辨率。比如你下载的是30米分辨率的SRTM数据,但导航系统只需要90米分辨率,那就得降采样。反过来,如果系统需要10米分辨率,就得升采样。

重采样的方法有几种:

方法 适用场景 特点
最近邻法 分类数据、快速处理 速度快,但锯齿明显
双线性插值 DEM数据降采样 平滑,精度适中
三次卷积 DEM数据升采样 平滑度高,细节保留好
平均值法 降采样(聚合) 保留整体趋势,适合导航

我个人习惯:降采样用平均值法,升采样用三次卷积。为什么?降采样时,平均值法能保留每个像素块的整体高度信息,不会丢失地形趋势。升采样时,三次卷积能生成更平滑的过渡,避免出现阶梯状伪影。

GDAL重采样代码:

# 降采样:从30米重采样到90米(平均值法)
gdalwarp -tr 90 90 -r average input_30m.tif output_90m.tif

# 升采样:从30米重采样到10米(三次卷积)
gdalwarp -tr 10 10 -r cubic input_30m.tif output_10m.tif

注意:重采样会引入误差。降采样时,地形细节会丢失;升采样时,会生成原本不存在的数据。我建议:尽量使用原始分辨率,不要随意重采样。如果必须重采样,一定要评估误差对导航精度的影响。

3.5 裁剪

裁剪,就是把DEM数据切出你需要的区域。导航系统不需要全球DEM,只需要飞行路径周围几十公里的数据。裁剪能大幅减少数据量,提高处理速度。

裁剪有两种方式:

  • 按经纬度范围裁剪:指定左上角和右下角的经纬度坐标。
  • 按矢量边界裁剪:用Shapefile或GeoJSON文件作为裁剪边界。

GDAL裁剪代码:

# 按经纬度范围裁剪(北京区域)
gdal_translate -projwin 115.5 40.5 117.5 39.5 input.tif output_crop.tif

# 按矢量边界裁剪
gdalwarp -cutline boundary.shp -crop_to_cutline input.tif output_crop.tif

这里有个细节:按经纬度范围裁剪时,-projwin参数的顺序是ulx uly lrx lry(左上角x,左上角y,右下角x,右下角y)。很多人搞反了顺序,结果裁剪出来的区域完全不对。嗯,我刚开始也犯过这个错。

小技巧:裁剪前先检查一下DEM的边界。有时候下载的数据范围比你需要的略大,裁剪后记得用gdalinfo查看一下新文件的信息,确认范围正确。我每次裁剪完都会跑一遍gdalinfo,养成习惯了。

3.6 本章知识体系

下面这张图展示了DEM数据获取与预处理的完整流程:

DEM数据获取与预处理流程 数据下载渠道 SRTM / ASTER / ALOS 格式转换 GeoTIFF ↔ ASCII 投影变换 WGS84 → UTM/高斯 重采样 降采样 / 升采样 裁剪 范围裁剪 / 矢量裁剪 预处理完成 可用于导航数据库 关键注意事项: • 数据源选择:根据项目区域和精度要求选择合适的DEM数据源 • 格式转换:注意ASCII头信息与数据的一致性 • 投影变换:导航系统必须使用平面坐标,避免经纬度直接计算 • 重采样:降采样用平均值法,升采样用三次卷积,评估误差影响 • 裁剪:确认裁剪范围正确,使用gdalinfo验证

好了,DEM数据获取与预处理就讲到这里。这些步骤看着多,但每一步都有它的道理。你只要按流程走,基本不会出大问题。记住:数据质量决定了导航精度,预处理环节千万别马虎。

专注资料整理