简介:一份覆盖全国范围的1km分辨率DEM栅格数据,源自SRTM 30m高程数据,经ArcGIS镶嵌拼接、重采样后得到,坐标系为WGS-84,格式为TIFF,可直接在ArcGIS中打开,适用于地形分析、栅格计算、空间分析等场景,如坡度坡向提取、水文分析、可视域分析,适合地理信息专业学生、科研人员及需要全国尺度高程数据的开发者作为基础数据使用。资源包共7个文件,以主TIFF栅格文件为核心,另含金字塔文件、地理配准文件、属性表及元数据等辅助文件,压缩后约26.51MB,文件结构清晰,便于直接加载。目前已有695人学习下载。数据完整正确,在保留宏观地形特征的同时大幅减小了数据体积,可用于课程设计、区域地形研究或作为其他分析的底图数据,能够节省数据预处理时间,也便于直接用于制图与初步建模。
1. 中国范围的DEM栅格数据:先弄清楚你拿到的到底是什么
做区域水文分析、日照模拟或者变电站选址时,很多人第一步就卡在数据上。网上下载的“中国范围的DEM栅格数据”,可能是30米分辨率的ASTER,也可能是90米的SRTM,甚至可能是经过拼接但坐标系乱掉的tiff。打开ArcMap一加载,要么位置跑到海里,要么值域全黑,这时候才意识到:DEM不是一张普通图片,它每个像元的值代表高程,栅格的组织形式、投影、无效值编码直接决定后续所有分析能不能跑通。这篇文章就围绕中国范围的DEM栅格数据,从获取渠道、预处理、踩坑到实际应用,给你一条能照着走的落地路径。适合要用DEM做坡度、坡向、等高线提取,或者做流域划分的从业者,新手能跟步骤,熟手可以跳过基础看避坑。
2. 获取中国范围DEM的可靠渠道:从省级30米到全国12.5米怎么选
2.1 主流数据源对比:分辨率、覆盖范围和坐标系差异
中国范围的DEM栅格数据,最常见的选择是这四类:SRTM(90米/30米)、ASTER GDEM(30米)、ALOS AW3D30(30米)和Copernicus GLO-30(30米)。另外国内还有12.5米的ALOS PALSAR衍生DEM,以及测绘部门生产的省级30米DEM,比如“山东省dem数据30米”这类按省分发的成果。
我的选择习惯是:做全国尺度宏观分析,用SRTM或ASTER都行,SRTM在平坦地区表现更稳;做省市级的精细项目,优先Copernicus GLO-30或国内省级30米成果;要提取微小地形特征,才考虑12.5米。分辨率不是越高越好,高分辨率数据量成倍增长,处理时间也长,先想清楚分析的最小单元是什么。
坐标系是另一个容易翻车的点。SRTM和ASTER原始数据多为WGS84经纬度,Copernicus也是WGS84,但有些省级成果可能用西安80或CGCS2000高斯投影。拿到数据第一件事,就是打开属性表看坐标系,别等投影到GIS里才发现错位。
2.2 下载与组织:用脚本批量拉取并按分幅管理
常见的下载渠道是USGS EarthExplorer、地理空间数据云、NASA Earthdata,以及各省级地理信息公共服务平台。这些网站大都支持按范围检索,但直接点鼠标下载几十个分幅很痛苦。我一般用Python脚本批量下载,以USGS的SRTM为例,先通过Scene List获取数据ID,再拼接下载链接。
# 批量下载SRTM分幅示例,使用requests和retry机制 import requests import time # scenes.csv包含要下载的分幅名称和URL with open('scenes.csv', 'r') as f: for line in f: name, url = line.strip().split(',') try: r = requests.get(url, timeout=30) r.raise_for_status() with open(f'{name}.tif', 'wb') as out: out.write(r.content) print(f'{name} 下载完成') time.sleep(1) # 避免请求过快被限流 except Exception as e: print(f'{name} 失败: {e}') # 失败后记录到retry.txt,稍后重试这段逻辑很简单:从CSV读取分幅名和URL,逐条下载,失败就记下来。参数注意点:timeout设30秒,防止网络卡死导致脚本挂起;sleep(1)是给服务器喘息时间,批量下载时很关键。下载完一定要检查文件大小,SRTM单幅30米tif通常在10-30MB,如果只有几KB,大概率是错误页面。
2.3 数据完整性检查:先看一眼值域和范围
下载几十个分幅后,不要急着拼接。先写个脚本遍历所有文件,检查每个栅格的像元类型、无效值、最小最大值。这一步能提前发现损坏文件或坐标系不一致的分幅。
from osgeo import gdal def check_dem(path): ds = gdal.Open(path) band = ds.GetRasterBand(1) stats = band.ComputeStatistics(0) print(f'{path}: min={stats[0]}, max={stats[1]}, noData={band.GetNoDataValue()}') print(f' 尺寸={ds.RasterXSize}x{ds.RasterYSize}, 投影={ds.GetProjection()[:50]}...') ds = None # 遍历目录下所有tif import glob for f in glob.glob(r'E:/dem_data/**/*.tif', recursive=True): check_dem(f)这里用GDAL读取,关键是检查NoDataValue。SRTM默认无效值是-32768,ASTER是-9999,Copernicus则可能是0或负值。如果你拿到的DEM没有设置NoDataValue,后面算坡度时会把无效值当真实高程,产生一堆异常值。这一步虽然简单,却能省下后面好几个小时的排查时间。
3. 把原始DEM整理成可用栅格:投影、裁剪、镶嵌与格式转换
3.1 投影与坐标系统一:先转成目标投影再做后续
中国范围横跨多个分带,如果你的分析范围在省市级,通常需要一个统一投影。常见做法是转换为CGCS2000或WGS84的UTM分带投影,或者用Albers等积投影做全国分析。我一般用GDAL的gdalwarp命令来重投影,它支持重采样方法选择。
# 将WGS84经纬度的DEM重投影到UTM 50N,并重采样为30米像元 gdalwarp -t_srs "EPSG:32650" -tr 30 30 -r bilinear -ot Int16 \ input_wgs84.tif output_utm50n.tif参数说明:-t_srs指定目标投影;-tr设置像元大小,这里强制为30米;-r bilinear是双线性重采样,对DEM这种连续表面比较合适,不要用最邻近法,否则地形会有明显锯齿;-ot Int16设置输出为整型,DEM一般用整型米就够了。注意,重采样会改变原始高程值,尤其在坡度变化大的山区,双线性会平滑掉一些细节,如果后续要做高精度坡长因子,建议保持原始像元大小,只做投影转换。
3.2 按行政区或研究区裁剪:用矢量边界裁出正好大小的栅格
拿到中国范围的DEM后,经常只需要某个省或某个流域。这时用矢量边界裁剪,能大幅减少数据量。ArcMap里的Extract by Mask工具能做,但批量处理效率低。我更习惯用gdalwarp加-cutline参数,一步完成裁剪和重投影。
# 用山东省边界裁剪DEM,并设置裁剪范围外的值为无效 gdalwarp -cutline shandong.shp -crop_to_cutline -dstnodata -32768 \ china_dem.tif shandong_dem_30m.tif-crop_to_cutline让输出严格贴合矢量边界,边界外的像元不保留,而是变小;-dstnodata把边界外的值设为-32768,这样后续统计不会把无数据区域算进去。注意,如果矢量边界坐标系和DEM不一致,一定要先统一,gdalwarp会尝试自动转换,但最好自己先检查,避免边界错位导致裁剪出空白。
3.3 多幅镶嵌:解决重叠区和无效值条带
中国范围DEM由多幅分幅镶嵌而成,相邻图幅间常有重叠,且在接边处可能出现高程不一致。直接用ArcGIS的Mosaic工具,如果重叠区处理策略不对,会产生明显的接缝线。
我一般用gdal_merge.py或gdalbuildvrt先构建虚拟栅格,再转成tiff。gdalbuildvrt不会真正拼接,只创建一个索引文件,后续处理时按需读取,速度很快。
# 构建VRT虚拟栅格,然后转成正式tiff gdalbuildvrt -srcnodata -32768 -vrtnodata -32768 all_dem.vrt *.tif gdal_translate -co COMPRESS=DEFLATE -co TILED=YES all_dem.vrt china_dem_merged.tif注意-srcnodata和-vrtnodata都是-32768,保持无效值一致。转tiff时开启DEFLATE压缩和TILED分块,能显著减少磁盘占用,同时提高ArcGIS读取速度。如果镶嵌后边缘仍有黑边,说明部分分幅的无效值没被识别,需要回到第2.3节检查NoDataValue。
3.4 格式转换:tiff转dem文件与栅格数据组织形式
ArcGIS用户常遇到“arcgis将tiff转dem文件”的需求。本质上,ArcGIS的DEM文件就是ESRI GRID格式,是一个文件夹,里面存放着dblbnd.adf、hdr.adf等一系列文件,不是单个文件。用ArcToolbox的“Raster to Float”或“Copy Raster”都能转。
但更通用的做法是直接用GDAL转成GeoTIFF,几乎所有软件都认。如果你非要ESRI GRID,可以用gdal_translate加上of选项:
# 将任意格式DEM转为ESRI GRID格式 gdal_translate -of EHdr -ot Int16 china_dem_merged.tif china_dem_merged生成的是china_dem_merged文件夹,里面有.hdr和.raw文件,这就是ESRI的DEM文件。不过现代GIS完全支持直接读tiff,没必要特意转。真正需要关心的是栅格数据的组织形式:是整幅单文件,还是分幅瓦片?对于中国范围这种大数据量,我建议采用TPK或Mosaic Dataset组织方式,ArcGIS Pro里创建镶嵌数据集,或者用GeoTIFF分幅文件夹配合VRT,这样后续加载小范围时不会卡死。
4. DEM栅格数据的常见预处理坑与排查:黑匣子里的血泪经验
处理中国范围DEM,最大的问题不是算法,而是数据本身的坑。下面这几条是我实际踩过的,每条都按现象—原因—解决来写。
4.1 下载的dem文件加载后一片黑
现象:在ArcMap加载DEM tiff,图像全黑,拉伸显示也没用。打开属性表,最小值和最大值都是0或者相同。
原因:最常见的是下载的文件不是DEM,而是别的栅格产品。另一个可能是,数据是16位有符号整型,在ArcMap中默认按8位显示,导致拉伸失效。也可能是数据本身全是无效值。
解决:先右键图层属性,在符号化里选择“拉伸”,设置拉伸类型为“最小-最大”。如果还是黑,用GDAL读一下最小值和最大值,判断是否真的全为无效值。如果没问题,再检查数据是否被加密或转换成其他编码。
4.2 坐标范围飘到海里或者完全对不上
现象:把中国范围的DEM和已有的矢量边界叠加,DEM跑到太平洋中间,或者偏移几十公里。
原因:坐标系不一致。最典型的是SRTM原始数据是WGS84经纬度,而边界用的是CGCS2000高斯投影。
解决:第一步,在ArcMap中查看DEM属性里的“Extent”和“投影坐标系”,如果显示“GCS_WGS_1984”,而经纬度范围超过360或负值,说明数据本身有问题;如果范围正常但位置不对,那就是投影定义错误。用“定义投影”工具重新指定坐标系,然后“投影栅格”转成目标坐标系。切记,先“定义”再“投影”,顺序反了会二次偏移。
4.3 镶嵌后接边处出现明显的高程诡异条带
现象:两幅相邻DEM拼接后,沿接缝线有一道深色或亮色条纹,高程值突变几十米。
原因:两幅数据来源于不同传感器或不同处理版本,比如一幅是SRTM 3.0,另一幅是SRTM 4.1,且没有做接边匀色。
解决:如果两幅数据重叠,可以用gdalwarp的-blenddist选项,设置一个缓冲距离进行羽化。我一般用100到200米。如果完全没有重叠,就得手动编辑。另一种做法是重采样到同一起始原点,再镶嵌,但最省事的还是统一数据源,下载时尽量选择同一批次生成的数据。
4.4 DSM和DEM混淆,建筑树冠被当成地面
现象:拿着12.5米的ALOS数据做坡度分析,结果城市区域坡度异常大,房屋位置出现高坡。
原因:ALOS PALSAR有DSM和DEM两个产品。DSM是表面模型,包含建筑物和树冠高度;DEM是去除地表物体后的高程。很多人下载时没区分,把DSM当DEM用了。
解决:下载时看清产品名。ALOS AW3D30是DSM,不是纯DEM。如果你需要真正的地面高程,优先用SRTM或Copernicus GLO-30,这些是经过处理的DEM。如果一定要用ALOS,需要自己滤波去除地物,这属于另一套流程,不如直接换数据源。
4.5 山东省dem数据30米:省级数据和全球数据精度对不上
现象:下载了山东省的官方30米DEM,和全球SRTM 30米做对比,同一个点高程差几十米。
原因:省级DEM往往是基于1:1万或1:5万地形图生产,高程基准可能使用1985国家高程基准,而SRTM使用EGM96大地水准面,两种基准之间存在系统性的高程差异,在山区可达几十米。
解决:项目要求高精度时,以省级数据为准,不要强行混合使用全球数据。如果必须混用,做一个局部回归校正。在ArcGIS中,用“栅格计算器”对两块重叠区域做差值分析,生成一个差值表面,然后把全球数据整体加上这个差值场。
5. 让DEM栅格真正派上用场:坡度、坡向、等高线与导出Excel
5.1 从DEM提取坡度和坡向:参数怎么设
这是DEM最基础的应用。ArcGIS的“坡度”工具会计算每个像元的最大变化率,输出单位默认是度。坡向则是每个像元最陡坡度的方向,范围0到360度。
操作上,直接用工具即可,但要注意:如果你之前把DEM重投影了,坡度结果会受投影影响。一般建议在投影坐标系下做坡度,因为经纬度坐标的南北和东西方向实际距离不同,算出的坡度会有扭曲。
# 使用Python脚本来做坡度计算 from osgeo import gdal dem = gdal.Open('shandong_dem_30m.tif') slope_grid = gdal.DEMProcessing('slope.tif', dem, 'slope', format='GTiff', slopeFormat='degrees') slope_grid = Nonegdal.DEMProcessing的slopeFormat参数有两种:degrees和percent。如果后续要做水土流失因子计算,一般用percent;做坡向分类则用degrees。还有一点,坡度工具会在边缘产生一圈低值像元,因为计算窗口无法覆盖。如果边缘区域对你重要,先对DEM做一点外扩缓冲区。
5.2 提取等高线:从栅格到矢量线
等高线是DEM最直观的成果。ArcGIS的“等高线”工具需要设置等值线间距。对于30米DEM,山区用50米或100米间距,平原用10米或20米。间距太小会生成大量短线,导致文件巨大且不好看。
# 通过GDAL提取等高线,间距100米 gdal_contour -a elev -i 100 shandong_dem_30m.tif contours.shp-a elev给属性表增加一个高程字段,后续可以按高程值做标注。注意,gdAL生成的等高线可能会在平坦区域产生密集的短弧线,最好先对DEM做低通滤波,或者平滑后再提取。如果你只是为了出图,可以直接在ArcGIS中拉伸显示,不必强行提取等高线。
5.3 arcmap栅格数据转化导出为excel:把高程采样点变成表格
很多从业者问“arcmap栅格数据转化导出为excel”,这本质是两次转化:先栅格转点,再点转表。
第一步用“栅格转点”工具,把每个像元变成一个点,属性表里就有X、Y和高程值。但如果整个省30米分辨率有上千万个点,Excel根本装不下。所以常规做法是先按范围或条件筛选。比如只提取坡度大于25度的像元。
# 用GDAL将特定区域的DEM转为文本,再导入Excel gdal_translate -of XYZ -srcwin 5000 5000 1000 1000 shandong_dem_30m.tif dem_sample.xyz-srcwin参数依次是起始列、起始行、列数、行数,这里提取了1000x1000的窗口。输出的XYZ文件前两列是坐标,第三列是高程值,直接导入Excel或csv。这种方法比ArcGIS的“导出至Excel”更省内存,也不容易崩溃。
5.4 用剖面工具做地形起伏分析
剖面分析对线路工程很有用。ArcGIS的“剖面图”功能需要先画一条线要素,然后工具会沿线采样高程并生成图表。但我常用一个更简单方式:把线转为多个点,用“多值提取到点”获取每个点的高程,然后导成表格做曲线。
import geopandas as gpd import numpy as np from osgeo import gdal # 在线要素上按等距生成采样点 line = gpd.read_file('route.shp').iloc[0] distances = np.arange(0, line.geometry.length, 250) # 每250米采一个点 points = [line.geometry.interpolate(d) for d in distances] # 创建点要素DataFrame并导出 gdf = gpd.GeoDataFrame({'dist': distances}, geometry=points) gdf.to_file('route_points.shp')采样间距根据你需要的精度设定,一般取DEM分辨率的5到10倍。比如30米DEM,间距150到300米就够。导出的shp在ArcGIS里用“多值提取到点”加上高程,生成表格后就能画剖面线。
6. 进阶:构建一个中国范围DEM本地数据库的小方案
做了多次区域项目后,我总结出一套适合中国范围的本地数据组织方式,既能应付快速加载,也方便重复使用。
方案核心是:按省或流域分块存储,使用GeoTIFF格式,文件名统一为“省名_分辨率_来源_版本.tif”,比如“Shandong_30m_copernicus_v3.tif”。每个分块旁边放一个同名.qmd文件记录元数据,内容包含坐标系、无效值、高程范围、生产日期。通过DataStore或GDAL的VRT把所有分块串联,但不生成物理拼接文件。
# 创建虚拟栅格,将所有省级分块纳入一个VRT gdalbuildvrt -srcnodata -32768 -vrtnodata -32768 ChinaDEM.vrt \ /data/dem/Shandong_30m.tif \ /data/dem/Henan_30m.tif \ /data/dem/Shaanxi_30m.tif这样ArcGIS或QGIS加载ChinaDEM.vrt,只读取当前视图范围内的分块,几百GB数据不卡。我的习惯是定期用gdalinfo检查每个分块是否完整,并把检查结果写入日志,防止磁盘故障悄悄损坏数据。
另一个进阶技巧是制作一个简单的Web服务,用MapServer发布DEM WMS,这样团队里其他人不用安装GIS就可以直接在地图上查询高程。跑通后,用Python写一个高程查询API,输入经纬度返回该点的高程值,对后续编码工作特别方便。
我的实际教训是:下载DEM时多花半小时做完整性校验,远胜过后处理时对着一整块数据黑屏发呆。希望你尽早把这些检查环节固化到流程里,省下的时间够你多做两个项目了,希望帮到你。
本文还有配套的精品资源,点击获取