ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DTED高程数据文件详解:从格式原理到QGIS与GDAL的打开转换实操

DTED高程数据文件详解:从格式原理到QGIS与GDAL的打开转换实操 GIS数据处理这块尤其是涉及到高程数据的活儿最绕不开的就是各种奇奇怪怪的二进制格式。今天想聊一个我们经常会在测绘、GIS、甚至是无人机航测数据包里遇到的家伙DTED文件也就是后缀名是.dt0、.dt1、.dt2那一类的东西。很多人第一次接触这些文件时都不知道该拿它怎么办用记事本打开一堆乱码用看图软件也打不开非常头疼。这篇内容我想用自己的实际经验把这个格式彻底讲透从它是什么、到怎么打开、再到怎么把它变成能用的数据一次说清楚。先说个核心概念DTED其实是Digital Terrain Elevation Data的缩写翻译过来就是“数字地形高程数据”。它是一种标准化的、按经纬度格子存储的高程数据格式最初是美国军方为了给各种导航和武器系统提供统一的地形数据而搞出来的标准。后来这个格式被民用领域广泛采用成了全球很多测绘部门、航测公司交换高程数据的一种通用语言。你现在拿到的.dt2文件其实就是DTED Level 2的数据它每一格大概代表30米左右的分辨率而.dt0、.dt1则分别对应Level 0和Level 1分辨率更粗一些。这个文件说到底就是一张表面上看是二维的表格但表格里的每个值都代表那个位置的海拔高度。很多用GIS的人拿到这种文件后第一反应是直接用ArcGIS或者QGIS去拖拽打开但常常会发现打不开或者显示有问题。其实大部分情况下不是文件坏了而是软件选择的方式不对。另外如果你平时经常处理一些海外的高程数据比如SRTM、ASTER GDEM之类的你会发现它们下载下来最终给你的往往就是DTED格式。因为这种格式的全球统一标准特性它在跨平台、跨软件的兼容性上确实做得很好而且分辨率等级明确、文件结构规整非常适合做地形可视化、坡度分析、淹没分析、飞行模拟之类的任务。既然如此这篇文章我们会从几个方面来聊先是DTED格式的核心结构和原理然后是主流软件的打开方式再用一个实际案例来演示从打开到生成的完整流程最后是那些我在实际工作中踩过的坑和解决办法。1. 内容整体设计与思路拆解1.1 为什么DTED格式那么“难搞”很多朋友拿到.dt2文件第一反应是双击打开结果系统提示无法识别。这个其实很正常因为DTED根本不是给普通办公软件用的它不像.txt、.pdf那样有通用的关联程序而是属于专业的地理空间栅格数据。你非要拿记事本去读它它自然给你一堆乱码因为文件的字节流是按照特定的二进制协议排列的。DTED数据在设计之初就考虑了两个核心需求一个是让计算机能方便地读取和处理另一个是让数据的存储体积尽量小。所以它选择了纯二进制存储而不是像GeoTIFF那样带有很多灵活的元数据头。这个特性带来的结果是程序读它非常快但人眼直接看不了需要专门的软件来“翻译”成直观的图像或者高程剖面。这个格式还有一个特点就是它严格遵循1弧度的经纬度网格体系整个地球被划分成很多个1度x1度的图幅Tiles。也就是说你在打开一个.dt2文件时它的数据范围绝不是随便画的而是严格地沿纬度和经度各1度来切分的。这个设计思想如果类比一下就像是把一个巨大的世界地图贴纸裁成了一块块规则的方格每块都有一个固定的经度和纬度起始点。这个特性既方便管理也方便按需调度比如飞行模拟程序可以只加载当前视野范围内的那一个图幅而不用把整个地球的数据都塞进内存。1.2 核心需求与数据精度到底有什么关系在不同的场景下你拿到的DTED文件等级往往不一样。DTED Level 0是老古董了它的网格间距大概是900米左右适合做全球性的概览分析比如大尺度气候建模或者飞行模拟中远距离地形的显示。DTED Level 1的分辨率是3弧秒大约90米间隔这种精度在一些初步的工程规划和飞行路径预判中经常用得到。真正常见的是DTED Level 2它的网格间距是1弧秒对应到地面上大约是30米左右这种分辨率能比较清楚地看到山谷、独立的山丘甚至是一些大型人工建筑的地形影响。我做过一些无人机航线规划的项目一开始不太在意这个精度等级结果到了丘陵地带90米分辨率的数据根本发现不了突如其来的小山包差点让飞机的仿地飞行高度不够后来换成了.dt2级别的高程数据整个地形的起伏就非常清晰了。所以搞清楚你手里的文件是哪个等级往往决定了你接下来用它来做的分析是否靠谱。而.dt2文件之所以比.dt0更吃香原因就是它在存储体积和精度之间找到了一个比较好的平衡点一个1度x1度的.dt2文件的大小可能达到几十MB虽然不小但还在可接受的范围内能给后续的数字地形分析和三维渲染带来非常明显的质量提升。1.3 打开思路的三种路径针对这种专业格式打开它的思路基本上可以分成三条路。第一条路是用专业的GIS软件比如ArcGIS、QGIS、Global Mapper这些直接把它们当成栅格数据图层叠加到地图上第二条路是用专门的DTED浏览器这类小工具启动速度快适合快速预览但基本只能看不能分析第三条路则是用编程的方式比如通过GDAL这个开源库写十几行Python代码把DTED读出来转成常规的TIF或者数据数组这种方式最灵活适合需要批量处理和做深度定制的场景。这三种方案在不同阶段各有优势。对绝大多数从业者和GIS爱好者来说QGIS是完全免费且功能强大的首选。如果你手头的文件不多只是需要看一下地形起伏或者导出成其他格式QGIS完全够用了。但如果你要处理几十上百个.dt2文件把它们拼接成一个完整区域的DEM这时候手工打开每个文件就变成了噩梦你就得认真考虑用GDAL或者专业的批处理工具了。简单说先确定你的目标再选择工具而不是拿到文件就瞎试软件。2. 核心细节解析与实操要点2.1 搞清楚DTED文件的内部存储逻辑DTED文件从结构上看其实分成了几个区段。最开始是文件头Header里面记录了该文件所在图幅的纬度、经度起点、数据等级、格点数量等关键信息。这个头文件的长度是固定的通常是80字节。紧跟着是为后续数据检索服务的用户标识区User Header LabelUHL它可以告诉第三方软件这个文件是否包含其他辅助数据。再往后就是真正的高程数据区了。数据区是整个文件的主体每一条记录代表一条扫描线这个扫描线锁定了某一条纬度线上的所有经度格点。每一个高程值在文件里用两个字节的整数来存储。这里有一个很关键的细节因为DTED数据实际上存储的是相对于某个基准面的高程所以文件里会有“无数据”Void的概念通常用一个极端的负数来表示比如-32767这在处理时一定要记得剔除否则做坡度分析时会计算出一堆离谱的大坑。理解了这个二进制存储逻辑后你就明白为什么编程访问这种格式非常顺畅了。因为每个高程值的字节数固定、位置固定程序可以通过简单的指针偏移直接定位到任何一个经纬度对应的高程而不用像读XML那样一层层解析。但如果你用的是传统的办公软件根本无法识别这种字节流所以才会出现“打不开”的困惑。了解这个底层原理还有一个好处当你手里的文件打不开时你能大概判断是文件头损坏了还是数据区偏移了而不是手足无措。2.2 必须注意的坐标系与单位问题这个是我在实际项目里踩过很多次坑的地方。DTED文件虽然自带经纬度信息但它的坐标系基准是WGS84地理坐标系单位是度。很多人拿Global Mapper打开.dt2文件后直接量测距离结果发现怎么量怎么不对就是因为忽视了坐标系之间的转换。如果只是在地图上叠图看那没问题但如果要进行面积计算、距离测量、或者和投影坐标系的矢量数据进行叠加就要先做投影变换否则结果差出好几倍都是正常的。此外DTED存储的高程单位是米而且是以“平均海平面”为基准的正高。这一点在做相对高差分析时很关键比如你想计算一座山相对周围平原的突出高度可以用文件里读取的高程值直接相减。但如果你想得到的是海拔0米以上某个范围的土方量那就需要结合当地的大地水准面模型来做高程异常改正了。当然对大部分GIS分析来说直接用米为单位的高程值已经足够可靠了。2.3 打开过程中容易忽视的“大小写”与扩展名陷阱文件后缀名在Windows系统里是个非常敏感的东西。我遇到过不止一次的情况是用户从某些FTP服务器上下载下来的数据文件后缀名看起来是.dt2但实际上是中途改了名的甚至有一些文件是.dtO这种注意是字母O而不是数字0。这种文件你在软件里识别不了是因为它的真实格式已经被扩展名掩盖了。拿十六进制工具一看文件头完全不是DTED的标志而是某种压缩包这就难怪软件打不开了。模块化一点说拿到任何高程数据文件最好先用支持内容识别的工具验证一下“真身”而不是只看后缀名。QGIS和Global Mapper在这方面做得比较好它们会根据文件内容自动判断格式即使后缀名不太规范也常常能够识别出来。但如果你的文件被改成了.dt2但实际是一个GeoTIFF或者Zip压缩包直接改后缀名绝对是没有用的必须用格式转换工具转码。类似的场景还有Excel无法打开文件因为文件格式或文件扩展名无效这其实是所有二进制数据处理的一种共通提示不要被这类报错吓退关键还是认清文件本身的格式。3. 实操过程与核心环节实现3.1 方案A用QGIS快速预览并导出高程数据QGIS是我现在处理.dt2文件的主力工具免费、跨平台、插件生态丰富而且对新用户来说也足够友好。打开QGIS后最简单的方式是直接把.dt2文件拖拽到图层区域或者通过“图层 - 添加图层 - 添加栅格图层”来选择文件。正常情况下地图画布上会立刻显示出带有灰色或彩色渲染的地形表面但如果你看到的是全黑或者全白的一片不要急着怀疑文件坏了先右键图层点击“属性”在“符号学”选项卡里将渲染类型修改为“单波段假彩色”或“高程色带”一般就能看到层次分明的山区地形了。想要把DTED转成更通用的GeoTIFF格式操作也很简单。右键点击图层选择“导出 - 另存为”在格式下拉框中选择“GeoTIFF”然后在“CRS”中选择合适的投影坐标系。我个人建议在导出时直接选择你所在区域的投影坐标系比如中国的UTM Zone 49N或者阿尔伯斯等积投影这样后续做面积计算和坡度分析时精度会更高。导出后的GeoTIFF文件体积可能会比DTED稍微大一点但它的兼容性更好用Photoshop都能通过插件打开了可见其通用性好到了什么程度。这里我还得提一嘴如果你只是临时用一下不需要保存成新文件可以使用QGIS内建的“栅格计算器”直接在光栅波段上运行表达式。比如你想把高程都减去200米做相对海平面的变换或者想生成一张坡度图直接使用“地形分析”工具即可。整个过程不需要写一行代码相当于是可视化地对高程数据做了一次“手术”。3.2 方案B用Python GDAL批量读取与处理DTED如果面临的场景是一下子几千个.dt2文件要拼接、裁剪或批量转格式图形界面软件再强大也显得有些力不从心了。这时候就用得上GDAL这个开源库。GDAL是一个专门用于读写各种栅格和矢量地理空间数据格式的C库它提供了Python绑定是地理信息开发者的瑞士军刀。使用它来处理DTED原理其实很简单核心代码不过几十行。首先是安装环境如果你用的是Anaconda环境可以直接在终端执行conda install gdal或者pip install gdal。装好之后读取一个.dt2文件并打印其基本信息的Python代码非常简单用gdal.Open函数打开文件然后调用GetGeoTransform()获得图像的六参数仿射变换关系再用ReadAsArray()读取整个栅格的高程矩阵。只要有了这个NumPy数组你就可以用任何Python科学计算库做后续分析了比如做可视化的Matplotlib、做机器学习的Scikit-learn等。不过需要注意GDAL读取的是原始的二进制数值不会自动帮你剔除无数据值所以在做统计时一定要先检查数组中的极值。批量拼接多个DTED文件这种方式我实测下来稳定性相当不错。可以使用gdal.Warp函数把相邻图幅自动镶嵌成一整块连续的高程模型。在用这个函数的时候设置formatGTiff然后指定输出路径和投影参数即可。我最开始接触这个功能时面对上百个文件有点心里没底生怕内存溢出后来发现只要设置得当比如用options[-co, TILEDYES, -co, COMPRESSLZW]进行分块和压缩处理速度还是可以接受的。这种方式比在ArcGIS里手动一个个拼接要高效太多而且完全可控想中间断了也能断点续跑对做数据处理的人非常友好。3.3 方案C用Global Mapper快速验证与辅助生产除了QGIS和PythonGlobal Mapper这个商业软件在处理DTED方面也是很有优势的。它的打开速度非常快甚至比ArcGIS还快一些而且它自带的“分析”工具非常丰富可以直接生成等高线、坡度坡向图、甚至填挖方计算。如果团队里有非GIS背景的同事需要一个简单、直观、双击就能看地形数据的工具Global Mapper是一个低门槛的选择。用Global Mapper打开.dt2文件的操作傻瓜化到了极致文件 - 打开数据文件选择你的.dt2然后软件会自动按高程值赋予颜色渐变。你还可以通过顶部的“控制中心”调整数据的垂直夸张比例让平坦的平原地区也能显示出微小的起伏。这在查看低等级DTED数据时尤其有用因为Level 0的数据间隔太大直接看会感觉像一块平整的“毛玻璃”略微增加垂直方向上的放大倍数地形轮廓立刻就有了立体感。此外Global Mapper还有一个很好用的功能就是可以直接把高程数据导出为3D模型格式比如导出为OBJ或STL。这个功能在做三维打印的地形沙盘、或者导入到游戏引擎做虚拟地形时非常实用。我帮一个朋友做过一个城市微地形的沙盘模型就是用Global Mapper把一个.dt2文件导出成STL再做了适当的简化处理最终打印出来的模型精度表现非常出色。4. 常见问题与排查技巧实录4.1 打开后显示黑屏或全白是软件坏了还是文件坏了这是最高频的问题之一。很多用户反馈用QGIS和Global Mapper打开.dt2文件后地图画布是黑的或白的第一反应就是文件传输时出了问题。其实绝大多数情况下文件是完好的只是显示范围没有正确拉伸。我个人的排查顺序是这样的右键图层打开属性先看“像素统计”里的最小值和最大值。如果最大值和最小值一致或者相差极小才有可能是文件读取错误如果数值范围正常比如从-200到2000那只是显示设置的问题。这时把“符号学”设置为“单波段假彩色”然后选择“线性”拉伸画面就会恢复正常。如果你用的是Global Mapper直接在“控制中心”找到图层右键选择“着色选项”把默认的灰度色带改成自带的地形色带画面马上就能有所改观。这种黑屏问题本质上和我们平时用Excel打开CSV文件时看到的那一大串长数字没有格式化一样不是数据丢了而是展示方式没跟上。记住这句话能帮你减少大量不必要的焦虑。4.2 数据经纬度是对的但叠加矢量图层时错位严重这种情况也很常见你在QGIS中打开.dt2文件和一份.shp矢量文件按理说它们应该在同一个地方结果一个在太平洋一个在非洲大陆旁边。问题往往出在矢量文件的坐标系和栅格文件不统一。DTED是严格的WGS84地理坐标系而矢量数据可能是某一种投影坐标系的比如Web Mercator或高斯克吕格。解决办法是在QGIS的图层属性里为矢量图层指定正确的投影然后利用“导出 - 另存为”功能将矢量数据重新投影到WGS84坐标系下。经过这一转换再叠加到DTED上就能精准重合了。此外还需要检查一个容易忽略的参数片头的纬度起点和经度起点。有些DTED图幅在生成的时候起始点坐标不是整度数而是带有分钟的这种细微的偏差在叠加高清影像时会被放大导致几公里级别的横向错位。这时候你可以通过左上角的“图层面板”查看栅格范围手动确认一下它是否与你预期的区域一致如果有出入可以使用“平移”工具或通过GDAL的SetGeoTransform做微调。总的来说坐标对不齐的问题八成是投影惹的祸先查投影再查起始点基本都能解决。4.3 转换后的TIF文件在ArcGIS里还是打不开有些朋友通过QGIS或GDAL把.dt2转成了.tif结果在ArcGIS里打开又是报错。这通常是因为ArcGIS对文件路径非常敏感尤其是路径中出现中文、空格或者长得太长的文件夹名它就会拒绝读取。我建议在处理地理数据时尽量把工作路径统一为纯英文、无空格的目录比如D:/GISData/dt2_output能避免很多莫名其妙的问题。同样转换时选择的压缩算法也要注意如果选择了LZMA之类的极限压缩老版本ArcGIS可能不支持最好使用LZW或者ZSTD标准的压缩方式。如果确实碰到打不开的TIF建议先用GDAL的gdalinfo命令查看这个TIF文件的元数据是否完整特别是检查它是否包含了地理参考信息。如果gdalinfo显示没有坐标系统那么问题就回到了原点导出时没有设置投影。在QGIS里另存为时不要只关注文件格式还要在“CRS”选项里明确选择WGS84或者你需要的投影这一点很多人会漏掉导致后续各种软件都认不出它的地理属性。4.4 出现了负值高程或者大片异常空洞在沿海地区、内陆盐湖或者一些有特殊地形的区域DTED文件中会存在负值高程比如低于海平面的盆地。这些值本身是合理的但如果在分析时没有处理好可能会被误认为错误数据。还有一种情况更头疼就是存在大范围的空洞值Void这些在原始数据采集时就没有成功返回信号通常被标记为-32767。处理这类异常值建议先设定一个阈值比如凡是不在-500到9000之间的值都视为无效然后将无效值替换为NoData或者用周围最近的有效高程值做插值填补。做插值填补时我比较推荐使用SciPy的griddata函数它能在局部范围内保持地形的连续性不会产生突兀的“台阶”。另外如果你手里的DTED数据是从不同来源拼接起来的可能在接缝处会出现明显的高程突变这是因为不同时期采集的影像数据存在系统性的误差。处理这种接缝问题最快速的方法是使用GDAL的WarpOptions里的-cutline选项或者用gdal_fillnodata.py脚本平滑一下边界。实测来看只要不是跨越了非常大的区域范围这种接缝消除后的地形模型基本都能满足生产需要。4.5 “文件格式或扩展名无效”是扩展名惹的祸最后还想专门聊聊“文件格式或扩展名无效”这种报错信息。当你把.dt2文件发给别人时对方下载下来却发现扩展名变成了.dt2.txt或者更常见的是从邮件系统下载会因为安全策略改成.dat后缀或者被塞进了压缩包后文件名乱掉这都会让GIS软件不认人。通常我收到类似求助时第一句话就是告诉对方先看文件大小和文件头。如果是.DT2它打开后前几个字节应该是固定的卫星标志字符串如果看到的是PKZip文件头或者很多0xFF那就不用费劲去改后缀了直接用合适工具解压或者换一个正确的文件源。这个报错其实和Excel无法打开文件因为文件格式或文件扩展名无效是同一个底层逻辑都是软件按已知的格式规则尝试解析文件但是发现文件内容与扩展名标记的格式不匹配。所以在处理各类专业格式文件时我劝大家养成一个习惯拿到文件先不要急着双击而是右键查看属性再使用十六进制编辑器或者QGIS的“信息提取工具”验证格式。只有验证通过后续的每一步分析才有保障。经过这么多次在DTED格式上折腾我个人最深的一个感受是这种格式虽然看起来冷门但只要掌握了它背后的存储逻辑和生态工具链在实际项目中反而能帮上大忙。尤其是当你需要大量处理地形数据、或者要给团队里的非技术人员输出一份规范、易用的高程产品时理解.dt2文件的打开与转换流程会成为一项性价比极高的实用技能。最后再分享一个小技巧如果你只是临时看一个DTED文件没必要非得装上全套GIS软件可以找那些免费的在线DTED查看器上传文件直接出图但要注意有大多在线工具不支持大文件而且对数据保密性有一定要求如果你处理的是敏感商业数据还是建议用本地工具来得踏实。
返回列表