公司动态
1公里全球DEM拼接影像:获取、预处理与坡度坡向提取实战
简介覆盖全球范围的一公里分辨率数字高程模型拼接影像文件采用地理标记影像格式存储面向地理信息系统分析、地形制图和三维场景构建等用户。数据含有完整的地理参考信息可直接加载到主流地理信息软件中使用无需额外配准或投影转换开箱即用。资源包一共九个文件压缩包大小约为四百零六兆核心为全球数字高程模型影像另附地理参考文件、金字塔文件、元数据以及辅助文件便于软件高效读取与索引同时提供说明文本和查看脚本方便快速浏览。目前已有七十人学习下载适合需要全球尺度地形数据又不想自行拼接处理的科研与工程人员。这份数据可用于坡度坡向分析、流域提取、基础底图制作以及三维地形可视化尤其适合教学演示和区域对比研究。相比零散下载分幅数据拼合完整的全球影像可省去大量预处理时间配合金字塔与辅助脚本使用门槛更低。 接触过全球DEM数据的朋友应该知道高分辨率高程数据虽然精细但真要覆盖全球范围下载、存储、预处理这些环节就够折腾一阵子了。我在做宏观地形分析和区域气候模拟时最喜欢用的一套底图就是1公里分辨率全球数字高程模型DEM拼接影像文件——这套数据把全球陆地地形统一用约l公里格网表达并且预先拼接成大幅面的影像文件拿来就能用省去了自己从分幅数据里重新拼接的麻烦。这篇文章我想从数据认知、获取预处理、坡度坡向提取到DSM转DEM这几个方向结合我自己的实操经历把关键步骤和一些坑都摊开讲一遍希望能给刚接触或者准备用这套数据的读者省下一些探索的时间。1. 数据认知1公里分辨率的全球DEM到底是什么水平1.1 “1公里分辨率”在DEM家族里意味着什么市面上的DEM分辨率跨度非常大从0.5米的机载LiDAR激光雷达点云产品到30米的SRTM航天飞机雷达地形测绘任务、12米的TanDEM-X再到1公里级别的全球格网。1公里分辨率听起来不算“精细”但它对标的是全球尺度分析——格网大小约30弧秒约927米到1100米随纬度变化覆盖范围是整张地球陆地表面。为什么选择1公里而不是更高分辨率体积和计算体量是关键。以SRTM 30米数据为例全球范围要拆成上万幅动辄几百GB普通个人电脑拿到手基本是“存得下、跑不动”。1公里分辨率全球拼接图通常只有几百MB到几GB在常规GIS软件里可以顺利打开、切片、渲染。加上海拔、坡度、坡向这些衍生地形因子在这种尺度下已经有足够统计学意义所以它特别适合做宏观地貌区划、流域水文概算、气候模式地形边界条件这类工作。1.2 拼接影像文件的结构与存储方式这个标题里“拼接影像文件”是关键。它不是一张全球平面图塞进单文件而是按经纬度分块后统一镶嵌好的栅格集常见格式是GeoTIFF或IMG单幅覆盖范围例如0度到60度经度、0度到30度纬度等。这样设计的目的是兼顾数据可读取性和体积均衡避免单个文件过大导致GIS软件卡死。高程存储通常是16位有符号整型单位是米需要特别留意NoData值的设定。不同来源的数据NoData值可能不一样有的是-32768有的是-9999如果直接叠加分析这些“假高程”会把坡度和地形起伏算得离谱。另外一个常见问题是投影坐标系。这类全球数据通常以WGS84经纬度存储但拿到手后若要计算面积或距离需要先投影到目标区域的合适坐标系否则在高纬度地区会出现严重变形。这部分我在后面“预处理”里会专门说。2. 数据获取与预处理把全球地形握在手里2.1 免费下载渠道与数据选型我自己常用的免费渠道主要有三个分别适用于不同场景。第一个是USGS EarthExplorer这是老牌平台数据源最全但操作界面比较老派注册后输入经纬度范围即可检索手感一般但稳。第二个是GEBCO它的全球栅格测深/高程数据更新较勤而且自带一个打包下载界面适合一次性拉取大范围数据。第三个是AWS的开源数据集合里面存放了大量地理空间公开数据可以直接用命令行下载适合需要脚本化批量获取数据的人。实际操作中如果你要做纯陆地分析我更推荐优先选择GTOPO30这是USGS发布的全球1公里DEM经过多年校验质量稳定配套文档也全。如果你更关心海岸带和海底地形衔接那GEBCO系列更合适它把陆地高程和海洋测深统一到了同一个格网。顺便说一句网络上有不少整理好的“1公里分辨率全球DEM拼接影像文件”网盘包用起来确实省事但下载后务必校验文件大小和坐标范围防止别人处理时丢了有效信息。2.2 投影、坐标系与裁剪的预检清单我拿到数据后不会直接开干而是按顺序先做一套“预检”避免问题积累到后面更难排查。第一步在GIS软件里加载数据全局浏览高程值范围正常情况下陆地高程应该在-400米到8848米之间如果出现几万米的正负数值几乎可以确定NoData值没有正确识别。第二步确认坐标系。通常全球数据会标注“GCS_WGS_1984”如果没有坐标系信息后续投影变换会直接报错或者结果错位。第三步用栅格信息工具查看像元大小确保它确实是0.008333度约1公里左右避免被数据源内部重采样蒙混过去。裁剪操作也要选对顺序。我一般先做范围裁剪再做投影转换最后重采样。理由很直接先裁剪可以减少投影计算的数据量效率更高重采样放在最后一步是为了避免无谓的插值叠加导致地形精度损失。常见错误是直接在原始数据上做“投影重采样裁剪”三合一这样会造成投影转换中的边缘条纹效应后续无论做流域分析还是坡度计算误差都会被放大。2.3 用ArcMap快速镶嵌全球拼接文件如果你的数据是分块形式第一步肯定是要把它们镶嵌成一个完整的DEM。ArcMap里我用的是“Mosaic to New Raster”镶嵌至新栅格工具这里有几个参数值得注意。首先是像素类型务必选择16_Bit_Signed或与原始数据一致的位深否则高程精度会损失。其次是NoData值设置必须明确填入数据源所用的空值比如-32768系统才会在输出栅格中把无效区域设置为NoData而不是当作真实高程值参与计算。最后是镶嵌方法常见有FIRST、LAST、BLEND、MAX、MIN等。若相邻数据块来源相同且重叠区很小选FIRST或LAST就够若重叠区较大且可能存在云层或无效值建议用BLEND让过渡更平滑但要注意BLEND在重叠区会做加权平均对高程突变区域可能产生轻微模糊。还有一个小细节ArcMap在镶嵌时很容易出现颜色不均衡尤其是来自不同轨道或不同时期的数据块。解决思路是镶嵌前先统一各分幅的直方图或者在镶嵌完成后用“拉伸”渲染方式查看这不影响高程数据本身但能让你更快发现接缝问题。3. 坡度坡向提取与DEM衍生品生产3.1 用Python批量提取坡度坡向的完整思路热搜词里有一个“dem影像提取坡度坡向python代码”这说明很多读者已经不满足于点鼠标操作想用脚本批处理。这里我分享一套基于rasterio和numpy的实现方式思路比代码本身更重要。给定一个DEM栅格坡度本质上是高程在水平方向上的变化率坡向则是变化率最大的方向。常见的计算方法有三种简单差分、有限差分如Horn算法、多项式拟合。ArcGIS的Slope工具用的是Horn算法它对相邻八个像元做加权差分平滑效果好对噪声不敏感。用Python实现Horn算法也不复杂关键在于把栅格读成numpy数组后用卷积核做滤波。import numpy as np import rasterio from rasterio.transform import xy, from_origin with rasterio.open(dem_1km.tif) as src: dem src.read(1).astype(np.float64) transform src.transform nodata src.nodata if nodata is not None: dem[dem nodata] np.nan # 计算像元分辨率单位米需根据纬度近似 res_x abs(transform[0]) * 111320.0 res_y abs(transform[4]) * 111320.0 # 用有限差分计算高程梯度dz/dx和dz/dy dzdx np.zeros_like(dem) dzdy np.zeros_like(dem) # 核心计算对内部点取中心差分边界点采用前向/后向差分实际写代码时还有几个细节要处理。第一是边缘像元的梯度处理最外层像元没有完整邻域通常会直接赋值为相邻像元值或者设NoData否则梯度阵列会出现明显的边框假象。第二是分辨率单位转换如果数据仍保留经纬度坐标计算前必须用当地纬度把度数换算成米否则坡度误差会随纬度增大而越来越离谱。第三是无效值掩膜如果DEM里有空洞梯度计算会把空洞边缘当成巨大陡坡所以要先统一填充或掩膜。坡向提取相对简单直接在梯度基础上求反正切再把角度按方位分成九类平坦、北、东北、东、东南、南、西南、西、西北。注意平坦区域坡度小于某个阈值比如0.1度的坡向通常没有意义要单独赋NoData这也是一般软件会用“Flat”区分的原因。3.2 DSM转DEM将地表地物从高程中剥离另一个热搜词“dsm生成dem”也属于DEM衍生品生产的高频需求。DSM数字表面模型记录的是地表“最高层”的高程包含建筑物、树冠DEM则代表裸地面。在1公里分辨率全球数据里DSM和DEM的差异看起来不大因为格网太大楼宇和树冠的贡献被平均掉了。但在局部应用场景中比如城市地形分析或者植被覆盖区的洪水模拟残留的地物高度误差仍然会造成问题。DSM转DEM有几种常见做法取决于数据本身。第一个是形态学滤波用开运算先腐蚀后膨胀去除细小地物帽在重采样到1公里格网前使用效果较好。第二个是基于辅助数据例如全球地表覆盖产品把森林和不透水面像元识别出来用邻域最小值或插值替换这类像元高程。第三个是点云分类法但1公里分辨率数据基本不走这条路那是针对激光雷达点云的处理思路。我的经验是即便你用现成软件一键转换也必须做“去噪验证”。简单做法是把转换后的DEM和原始DSM做差值生成“地物高度层”然后统计该层在裸土、水体区的数值正常情况下应接近0。如果水体区域出现明显正高度说明滤波过度如果森林区域仍保留几十米高度说明地物移除不彻底。这一步不复杂但能避免后续水文分析系统性地偏高或偏低。4. 常见问题与排查技巧实录4.1 拼接后重叠区颜色不一致或出现明显条带这是我最常被问的问题现象是两幅数据镶嵌后原本高程应该是连续过渡的结果形成一条清晰的“贴片”边界。原因通常是数据源版本不同或相邻影像的获取时间不同导致同一区域高程基准不一致。排查时先在同一位置检查多幅原数据的高程值如果确实存在系统偏差建议用“统计校正”而不是硬性颜色调整。办法是用ArcGIS的“Cell Statistics”功能计算重叠区两幅栅格的均值差然后把校正值应用到其中一幅上再做镶嵌。注意不要用遥感图像处理里那套“色彩平衡”来校正DEM那是针对RGB影像的高程数据一旦被修改数值会直接影响后续所有地形分析结果。4.2 NoData空洞导致坡度坡向计算异常全球1公里数据整体质量较高但个别区域如极地、高山区还是可能出现局部空洞表现是坡度坡向图上出现白色的“洞”或者极端值。处理顺序建议是先做空洞填充再算坡度坡向。填充方法里最省事是用邻域均值插值但注意不要用太大的邻域窗口否则会把真实地形平滑得过于平坦。我更推荐先用“Focal Statistics”焦点统计算一个3x3或5x5均值然后只把填好的值覆盖到NoData区域这样既能补洞又不影响原本有效的高程值。还有一类隐蔽问题Some数据文件表面看没有NoData空洞但边界处有整行整列写为0的情况这是数据封存时裁剪掉边缘导致的。如果你发现海岸线附近出现海拔0米但实际地形是山地的现象多半不是真实情况需要对照更高分辨率数据来确认。4.3 坐标漂移与边缘裂缝的快速定位坐标漂移表现为两次下载的数据在同一位置整体偏移几百米到一公里在1公里分辨率下这个误差刚好接近一个像元会直接导致坡度计算时出现“正负交替”的噪声。排查思路很简单在地图上叠放两个数据源设定透明渲染观察河流或山脊是否对齐也可以用矢量控制点提取同一位置的高程值看差值是否在合理范围。边缘裂缝多发生在WGS84坐标系和投影坐标系的转换过程中。ArcMap默认的重采样方法对Web Mercator这类投影会出现边缘扭曲所以处理全球数据时我会强制指定重采样方法为“Bilinear”双线性或“Cubic”三次卷积而不是用默认的“Nearest”最邻近。虽然处理时间稍微增加但能有效减少投影后边缘像元的“锯齿”和“裂缝”。下面按经验整理了一张问题速查表方便日常排查症状常见原因排查方法拼接边界明显数据版本冲突或基准不一致统计重叠区均值差做偏移校正后再镶嵌坡度图出现极端值NoData未识别或空洞先填充NoData再做梯度计算高程边缘条带状突变重采样方法不合适改用双线性或三次卷积重采样坐标错位一像元左右不同数据源投影基准不一致用控制点检验并做位置校正水体区域高程非零DSM残留地物或填充错误用DSM-DEM差值层验证水体区域4.4 内存不足导致大范围镶嵌失败怎么办全球数据即便只有几百MB在ArcMap或QGIS里做大范围镶嵌也经常遇到内存溢出尤其是当你在操作时同时开启了多个渲染视图。我的习惯是先用命令行工具处理比如GDAL的gdalbuildvrt先把所有分幅构建成虚拟栅格VRT不复制数据再做裁剪和重投影最后才生成实际输出文件。这样内存占用会低很多。gdalbuildvrt global_dem.vrt tile_01.tif tile_02.tif tile_03.tif gdalwarp -t_srs EPSG:3857 -tr 927.0 927.0 -r bilinear -dstnodata -32768 -co COMPRESSDEFLATE global_dem.vrt global_dem_mercator.tif这段命令的作用是先合并多个分幅为虚拟文件然后统一投影到Web Mercator重采样到约927米分辨率并输出带压缩的GeoTIFF。压缩格式选DEFLATE能减小相当一部分体积处理速度的影响在可接受范围内。如果你是Python用户也可以直接用rasterio.warp.reproject实现相同操作两种方式没本质差别选自己顺手的那条路就行。5. 实操阶段的一点额外经验最后说说我自己在使用这套数据时积累的几个心得。第一个是“保留中间产物”。我在做1公里DEM处理时一定会保留裁剪前和裁剪后两个版本的栅格而不是只留最终结果。因为后面的分析一旦发现问题重新回去下载、拼接、投影会浪费大量时间尤其是全球数据的分幅下载本身就比较耗时。本地磁盘空间现在通常不是问题但重跑流程的时间成本真的很高。第二个是善用金字塔与概览。全球DEM文件如果直接加载进ArcGIS显示和缩放都会卡顿。我会在影像文件旁边生成.ovr金字塔文件QGIS里则是在图层面板右键“Build Pyramids”这样缩放和平移响应会快很多。这个小动作对1公里全球数据来说几乎是一键提升体验的操作非常值得养成习惯。第三个是数据验证不能省。不管是下载来的原始数据还是自己处理后的中间结果都建议在统一的控制点文件上做一次高程对比。控制点不需要太多几十个点足够重点看山地、洼地、海岸带三类地形。通过这个检查你能在分析早期发现系统性的数据问题避免等到出图阶段才痛苦返工。1公里分辨率全球DEM拼接影像文件本身不复杂但隐藏的细节很多。如果你只是拿来做宏观演示或示意可能半小时就能搞定但真要用于科研分析或工程预研数据处理环节每一步都值得认真对待。希望这篇文章能帮你把这个流程走得稳一些、快一些。本文还有配套的精品资源点击获取