拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SRTM DEM数据下载与处理全攻略:从获取到坡度坡向提取

做GIS和遥感这行的十有八九都绕不过DEM数据。不管是做地形分析、水文分析、坡度坡向提取还是做淹没模拟、视域分析、三维可视化DEM就是最底层的那块砖。而SRTM几乎是绝大多数人接触到的第一份全球DEM数据——免费、全球覆盖、90米分辨率这三个标签加在一起让它成了很多项目的默认选择。我这几年在项目里反复用过SRTM也帮不少人解决过下载和使用中的各种问题。说实话网上关于SRTM下载的帖子不少但要么是搬运官方说明要么只给个网盘链接然后人就不见了真正能带着你一步步把数据拿到手、拿到手之后知道怎么处理的文章很少。这篇我就把自己常用的下载渠道、完整操作流程、还有处理DEM时容易踩的坑一次性讲清楚希望对你有实际帮助。1. 先用三分钟搞明白SRTM到底是一份什么数据1.1 SRTM任务的背景和原理SRTM全称是Shuttle Radar Topography Mission中文一般叫“航天飞机雷达地形测绘任务”。2000年2月美国“奋进号”航天飞机执行了一次为期11天的任务搭载C波段和X波段两套雷达干涉测量系统对地球北纬60度到南纬56度之间约80%的陆地表面进行了三维测绘。这次任务的核心原理是雷达干涉测量InSAR简单打个比方两只眼睛同时看同一个物体通过两个视角之间的相位差就能算出物体的高度和距离。航天飞机上装了两根天线一根在货舱里一根在60米长的可展开杆上两端同时接收地面回波再结合轨道参数解算出地面每个点的高程。任务结束后科研人员对原始雷达数据进行了复杂的干涉处理、相位解缠和地理编码最终生产出全球DEM产品。SRTM数据最早分两个精度等级公开SRTM-1是1弧秒约30米分辨率SRTM-3是3弧秒约90米分辨率。在早期版本里30米数据只覆盖美国本土其它区域全部用3弧秒数据这就是“SRTM 90米DEM”说法的由来。后来NASA重新处理了全球1弧秒数据并向全球开放所以现在如果去USGS官方平台看SRTM产品实际上是以30米为主。但国内很多平台和旧教程中仍然以90米版本为主尤其是“地理空间数据云”这种平台90米SRTM依旧是下载量最大的数据之一。1.2 90米分辨率这个指标放到今天够用吗这是很多人拿到数据后第一个会问的问题。90米分辨率的意思是每个像元代表地面90米×90米的区域。放在全国或大区域尺度看这个精度做地形宏观分析完全够用但如果做的是一个小流域、城市局部区域的精细地表分析90米确实偏粗。我自己在项目里的使用心得是做大范围山地地形分类、生态分区、气候模拟这类宏观分析90米SRTM性价比极高因为数据量小、处理速度快。但如果你要做淹没模拟、高精度坡度坡向分级、场地平整设计那就得考虑30米甚至更高精度的数据源了。有一点必须提醒90米DEM提取出来的坡度在山区往往会系统性偏小因为地形细节被平滑掉了。这个现象在后续做坡度分析的时候尤其明显后面我会专门展开讲。2. 免费渠道哪家强四个主流下载入口横向对比2.1 各大免费下载平台的优势与局限SRTM数据作为美国政府公开数据本身是免费向全球开放的但不同平台提供的版本、格式、下载方式和访问稳定性差别很大。我把常用的四个渠道整理了一下方便你按需选择。渠道数据版本分辨率是否需要注册主要优势主要局限USGS EarthExplorerSRTM 1弧秒/3弧秒30m/90m需要数据最权威、产品最全可下载原始未投影数据国内访问速度不稳定界面英文批量下载略繁琐地理空间数据云SRTM 90m90m需要中文界面国内访问速度快下载步骤直观数据版本相对固定以90m为主高分辨率数据较少OpenTopographySRTM、Copernicus、ALOS等多种需要在线处理能力强可按多边形裁剪后直接下载对新手来说功能入口有点多需要一个熟悉过程NASA EarthdataSRTM及衍生产品30m为主需要数据体系完整支持API和批量下载平台加载较慢账号体系独立常被导航绕晕除了这四个还有阿里云DataV.GeoAtlas和AWS的Terrain Tiles这类面向开发者的渠道不需要注册账号直接用URL就能拉到瓦片数据。这类渠道的优势是方便程序化调用适合做Web可视化但对需要原始tif文件做分析的来说不太合适这里就不重点展开了。2.2 我的渠道选型建议如果只让我推荐一个平台给新手我会选地理空间数据云。原因很现实它全中文界面、无需特殊网络环境就能稳定访问注册之后跟着提示点就能下载这对很多人来说至关重要。数据云平台上的SRTM 90m DEM是GeoTIFF格式国内科研和工程场景里用得最广泛。但如果你需要的是30米SRTM或者想拿到较新的处理版本例如SRTM Void Filled即空洞填充版本那就必须去USGS EarthExplorer。我自己平时下载数据的习惯是先想清楚研究区大小和精度需求再决定去哪个平台。如果只是临时拿一份90米数据做全国尺度的示意分析数据云就够了如果要做正式研究或工程项目我会首选USGS拿原始数据自己处理这样数据来源、版本、处理步骤都清清楚楚写报告时也好交代。3. 一步一步实操从注册账号到拿到tif文件3.1 USGS EarthExplorer的注册与登录不管你去哪个平台注册这一步都省不了。以USGS EarthExplorer为例打开earthexplorer.usgs.gov页面上方会看到“Login”按钮点击后进入USGS的统一认证系统。第一次使用需要创建账号流程和普通网站注册差不多填邮箱、设密码、同意用户协议。需要注意的坑是USGS的密码要求比较严格至少8位并且必须包含大小写字母、数字和特殊字符。我见过不少人在这一步就卡住了建议直接生成一个强密码存在密码管理器里省得折腾。登录成功后页面主体就是地图选区和数据筛选界面。界面虽然全英文但核心操作其实就三步划定范围、选择数据集、下单下载。3.2 划定下载范围三种方式任选在EarthExplorer的“Search Criteria”面板里有三种方式划定你需要的区域第一种按经纬度坐标范围框选。点击地图左上角的矩形工具在地图上直接拉框适合知道坐标范围的场景。第二种按行政区名称搜索。在“Address/Place”输入框里输入地名比如“Sichuan, China”地图会自动定位到四川省范围但这种方式定位的是整体范围下载时一般还要手动微调。第三种按坐标精确输入。点击多边形工具或点工具在文本框中粘贴坐标点列适合研究区边界明确的用户。这个方法最精准比如我知道研究区是东经102°到103°、北纬30°到31°之间的区域直接填进去就能框住。无论用哪种方式划定范围之后地图底部的数据显示区会提示该范围内有几个可下载的产品方便后续筛选。3.3 筛选数据集找到SRTM产品是关键划定范围后点击“Data Sets”按钮进入数据集合选择面板。这里的数据分类树比较深很多新手容易迷路。我的操作路径是点击“Digital Elevation”目录展开后找到“SRTM”文件夹再点击“SRTM 1-ArcSecond Global”子项。如果找不到这个选项可以用页面上方的搜索框直接输入“SRTM 1-ArcSecond”快速定位。注意这里提供的是30米分辨率全球版本如果你确实需要90米旧版可以找“SRTM 3-ArcSecond”选项但覆盖范围和版本可能跟预期有出入这一点我在下一节会详细说。选中数据集后点击“Results”按钮页面会列出研究区内所有可下载的图幅。每个结果都标注了文件名、经纬度范围、采集时间、云量DEM数据无云量概念但有些衍生产品会有和信息来源。你需要做的就是从列表里找到覆盖研究区的图幅勾选它然后点击右下角的“Download Options”按钮。3.4 真正点击下载格式选项与载入问题在Download Options里一般会看到多种下载格式最常见的是GeoTIFF.tif和BIL.bil。GeoTIFF是最通用的格式ArcGIS、QGIS、Global Mapper、Python的rasterio库都能直接读写建议无脑选它。点击文件链接浏览器就会开始下载。USGS的下载高峰期速度不稳定文件一直没反应时别急着刷新页面等一两分钟是常有的事。这里有一个实际经验USGS的单张SRTM数据大概是25MB到50MB如果一次要下载几十个图幅一个个点会怀疑人生。这时候建议用USGS的Bulk Download Application批量下载工具。在Download Options页面的右上角有一个“Bulk Download”按钮点击后会生成一个下载任务文件然后用官方工具加载这个文件就能实现批量排队下载。我第一次用这个工具时还踩了个坑它需要Java环境如果本机没有安装Java会直接闪退所以用之前先把Java装好。如果是在地理空间数据云上下载流程就简单得多注册登录后在首页导航找到“DEM数字高程数据”选择SRTM 90m产品然后在页面上方的地图中画矩形选定范围点击“下载”后系统会自动列出所需图幅确认后提交订单就能在“我的下载”里看到数据链接。中文界面操作起来毫无压力整个过程不到两分钟。4. 数据到手别急着算拼接、坡度坡向提取与DSM/DEM那点事4.1 多景数据拼接先建VRT还是直接合并SRTM数据是一景一景分发的每个文件覆盖大约1经度×1纬度的范围。如果你的研究区跨了两个以上图幅第一件事就是拼接。拼接之前先把所有tif文件放在同一个文件夹里然后用GDAL命令或桌面软件处理。我最推荐的命令是GDAL自带的两个工具gdalbuildvrt和gdal_merge.py。两者的区别是gdalbuildvrt不会生成一个真正合并后的文件而是生成一个指向原始文件的虚拟目录VRT这样几乎不占用额外磁盘空间打开速度快适合先用VRT做快速预览。gdal_merge.py则是真正把多个栅格合并成一个新tif文件适合最终出图和后续分析。以拼接全部SRTM图幅为例命令是这样# 先用VRT做快速预览 gdalbuildvrt merged.vrt *.tif # 确认范围无误后再真正合并 gdal_merge.py -o SRTM_merged.tif -co COMPRESSLZW *.tif合并时一个很容易被忽略的点是坐标参考系。相邻图幅本身都是WGS84经纬度坐标直接拼接没问题但如果你之前对某些图幅做过投影转换拼接出来就会“错位”。所以我一般建议所有图幅保持原始WGS84坐标先拼接统一转换成需要的投影如UTM之后再做坡度、坡向分析。4.2 坡度坡向提取先试试gdaldem再上Python拿到完整的DEM后坡度Slope和坡向Aspect是使用频率最高的两个衍生地形因子。实现方法有两种一条路是用GDAL自带的gdaldem工具几乎零成本另一条路是用Python基于numpy从零计算适合需要深度定制或者做批处理的场景。gdaldem的使用非常简单# 提取坡度默认角度制单位度 gdaldem slope SRTM_merged.tif slope.tif # 提取坡向0-360度北为0度顺时针 gdaldem aspect SRTM_merged.tif aspect.tif如果想得到百分比坡度的结果需要加一个-p参数gdaldem slope -p SRTM_merged.tif slope_pct.tif百分比坡度和角度坡度之间的关系是百分比 tan(角度) × 100。比如45度对应的百分比就是100%这个参数在道路工程、土地利用分类中经常遇到需要留意。如果你想用Python自己实现坡度坡向计算原理是从3x3邻域窗口内的高程值求偏导数。我写了一个简化但准确的版本核心思想是使用中心差分法计算东西方向和南北方向的变化率再合成坡度角并计算坡向角import numpy as np import rasterio def calc_slope_aspect(dem_path, out_slope, out_aspect): with rasterio.open(dem_path) as src: dem src.read(1).astype(np.float64) profile src.profile # 将无效值设为NaN防止参与计算 dem[dem src.nodata] np.nan cell_size abs(src.transform.a) # 像元大小单位与DEM一致 rows, cols dem.shape # 使用padding保持边缘尺寸一致 dem_pad np.pad(dem, 1, modeedge) # 中心差分东西方向 dz/dx南北方向 dz/dy dz_dx (dem_pad[1:-1, 2:] - dem_pad[1:-1, :-2]) / (2 * cell_size) dz_dy (dem_pad[2:, 1:-1] - dem_pad[:-2, 1:-1]) / (2 * cell_size) # 坡度度 slope np.arctan(np.sqrt(dz_dx**2 dz_dy**2)) * 180.0 / np.pi # 坡向度从北顺时针 aspect np.arctan2(dz_dy, -dz_dx) * 180.0 / np.pi aspect np.where(aspect 0, 90.0 - aspect, 450.0 - aspect) aspect np.where(aspect 360.0, aspect - 360.0, aspect) aspect[np.isnan(slope)] np.nan # 写出结果 profile.update(dtyperasterio.float32, nodata-9999.0) with rasterio.open(out_slope, w, **profile) as dst: dst.write(slope.astype(np.float32), 1) with rasterio.open(out_aspect, w, **profile) as dst: dst.write(aspect.astype(np.float32), 1) print(f坡度结果已保存: {out_slope}) print(f坡向结果已保存: {out_aspect})这段代码的关键点在于对边缘像元的处理我用了np.pad和edge模式填充让最外圈也能参与计算不会像某些算法那样把边缘裁掉一圈。如果你不需要边缘数据可以改成填充NaN但那样边缘一圈的坡度值也会是NaN我实际用过之后觉得不如edge模式实用。这个细节往往就是你自己算出来的结果和ArcGIS默认结果有差异的原因之一。4.3 SRTM、Copernicus DEM和DSM别再把它们混为一谈写到这里不得不提一个近期特别火的数据源Copernicus DEM GLO-30。它由欧空局发布空间分辨率30米包含全球陆地区域2022年起对全球免费开放下载。相比SRTMCopernicus DEM整体上噪声更少、空洞更少、精度更高尤其是平坦地区的高程表现明显更好。但这里有一个容易混淆的概念SRTM和Copernicus DEM虽然常被叫做DEM但严格来说它们都是从雷达或光学传感器获得的“地表模型”DSMDigital Surface Model也就是说它们记录的是“地物顶面”的高程包含树冠和建筑物屋顶。而真正的DEMDigital Elevation Model通常指“裸地面”高程。这两个模型的差异在城市和森林区域非常明显。比如在一栋30米的建筑旁边SRTM的高程值反映的是楼顶高度而不是地面高度。如果用它做地表径流分析结果会差很多。之所以提到这点是因为现在很多热词搜索里都有“dsm生成dem”的需求大家都想知道怎么把树和建筑“去掉”。最常用的手段包括形态学开运算先用最小值滤波再最大值滤波可以去掉突出的地物局部高差过滤通过对比邻近像元的高差识别和剔除地物渐进式形态学滤波在多个尺度的窗口内反复执行形态学操作适合大面积森林区域。这些方法各有适用场景如果你只是快速获得一个近似裸地高程形态学开运算是效率最高、最容易实现的from scipy.ndimage import minimum_filter, maximum_filter # 先做最小值滤波去掉地物凸起再做最大值滤波还原地面趋势 dem_filtered minimum_filter(dem, size7) dem_ground_approx maximum_filter(dem_filtered, size7)需要注意这个结果只是一个近似值尺寸参数size要根据地物大小调整城区树木和建筑密集时建议size大一些如11或15但size过大会让地形变得过分平坦。我们做过对比size设7在多数丘陵地区效果最好仅供参考。5. 踩坑实录五个高频问题的排查与解决5.1 下载的DEM打开后是全黑的这是新手最常问的问题之一。DEM不像普通影像打开后如果拉伸方式和显示范围不对就会呈现一片黑。原因是SRTM数据本身高程值范围较大从海平面0米到几千米但16位整型的波段最大值远超实际高程某些软件默认显示时把整个0-65535的范围都映射到灰度上了实际值只占了很小一段看起来就全黑了。解决办法非常简单在ArcGIS里用“Stretch”工具选择“Percent Clip”或“Standard Deviations”拉伸显示在QGIS里右键图层属性选择“渲染类型→单波段假彩色”并设置最小最大值裁剪就能正常显示了。这个坑不是数据问题而是显示设置问题别把数据删了重新下载。5.2 拼接后有明显的条带或接缝相邻两景SRTM数据之间有时会出现视觉可见的拼接缝这通常不是因为数据坏了而是两景之间的高程值存在较小的系统性偏差可能是数据处理时不同轨道之间的误差。最简单的处理办法是拼接时使用gdal_merge加上-blend和-blend_weight参数做一个羽化过渡。如果不追求像素级精度也可以用QGIS的“镶嵌”工具勾选“重叠区域使用最小/最大值”。更严谨的做法是把相邻图幅作为整体做一次低通滤波不过一般很少需要做到这一步。5.3 提取的坡度和坡向值明显错误这个问题往往和坐标参考系有关。SRTM下载时默认是WGS84经纬度如果直接在这个坐标系下用中心差分计算坡度东西方向的实际距离和南北方向的实际距离会随着纬度变化导致坡度值被高估或低估。正确的做法是先把DEM投影到适合的等面积投影如UTM保证X和Y方向的分辨率都是米制再计算坡度坡向。我遇到过不少用户直接拿经纬度坐标的DEM算坡度算出来的结果偏差30%以上问题根源就在这。5.4 填洼时内存不足或计算超慢填洼Fill Sinks是水文分析的第一道工序但SRTM 90米数据虽然单个文件不大范围一大计算量仍然可观。如果直接在ArcGIS里运行“Fill”工具40万平方公里的范围就可能跑几十分钟甚至卡死。我的经验是先用“Reconditioning”工具或人工判读排除大坝、桥梁等伪洼地再做填洼同时把分析范围裁剪到研究区边界不要拿着全球数据去算。另一个取巧的方法是先用低分辨率如重采样到270米做一个快速预览确认结果合理后再用全分辨率跑正式计算这样至少能避免数据跑了很久才发现方向错了。5.5 网上找到的“免费下载链接”不靠谱搜SRTM下载前面几屏经常出现各种网盘分享帖给你一个百度网盘链接下载下来可能是一个压缩包。这里必须提醒不要轻易使用来路不明的数据分享链接。一来这些数据往往缺少完整的meta信息你不知道它是不是经过重投影、重采样甚至拼接过精度和来源完全没有保证。二来SRTM数据本身是公开免费数据USGS、地理空间数据云等正规渠道都能拿到完全没有必要去冒用盗版或来路不明数据的风险。做工程和科研数据的可追溯性很重要所有原始数据应当从正规途径获取这个习惯值得养成。最后分享几个我自己的使用习惯数据没有好坏只有合不合适。我在实际项目中遇到不少人一上来就找高分辨率数据结果数据量太大、处理流程复杂反而拖慢了进度。个人经验是先在需求层面想清楚精度要求再做数据选型。做全国尺度的地形分类和制图90米SRTM足够做流域尺度的水文分析建议用30米SRTM或Copernicus DEM等到做工程单体、小范围精细分析时再考虑更高精度的无人机和LiDAR数据。另外一个小技巧无论从哪个平台下载的数据第一时间把元数据文件保存好。SRTM数据包里的README文件、.hdr文件里记录着坐标系、像元尺寸、无效值等关键信息这些信息在数据处理和写报告时随时用得上别给删了。希望这篇内容对你有帮助。赶紧去下载你要的数据吧下载完之后如果遇到拼接、填洼、坡度提取方面的问题欢迎回来翻翻这篇文章没准就能找到答案。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门