区域DEM怎么下载?以泰安地形为例的一次梳理
做地形分析、三维建模、坡度坡向、可视域计算,或者进一步的InSAR形变解译,第一关往往是同一件事:先搞一块区域DEM(数字高程模型)下来。
泰安是一个很适合拿来练手的地方。境内泰山主峰海拔1500米以上,和周边平原相差超过一公里,地形起伏剧烈,DEM下载、配准、基准转换里常见的坑,在这里几乎一个不落。下面以泰安及周边为例,把区域DEM的下载路数讲清楚。
一、先想清楚:你要的是哪种DEM
动手之前,先明确三件事,免得下错源白费功夫。
1. 分辨率。 全球开源数据里,30米(1弧秒)是性价比最高的通用档,足够大部分区域尺度的地形分析。想要更细,就得靠激光雷达点云、倾斜摄影,或者省级地理空间数据节点,那已经不是"下载"能解决的事了。
2. DSM还是DTM。 开源全球30米数据大多是DSM(数字表面模型,含植被、建筑顶),不是DTM(去植被后的地表模型)。做水文、土方时心里要有数:森林覆盖区的DSM会偏高。
3. 覆盖范围与高程基准。 这是最容易栽跟头的地方,后面单独讲。
二、主流免费源,横向对比
如果只记一个结论:想要一块区域、不用注册、能写脚本自动拉,选AWS Terrain Tiles;想要30米精度且国内下载快,选地理空间数据云或OpenTopography。

高程分层着色图(绿→黄→棕→白),直观呈现泰安市域海拔分布。
三、以泰安为例,三种拿法
泰安市行政区范围:东经约116.0°–118.0°,北纬约35.6°–36.5°(辖泰山区、岱岳区、宁阳县、东平县、新泰市、肥城市)。下面三种方法都先按这个范围下载,再用行政边界裁出市域轮廓。

基于AWS Terrain Tiles真实高程数据渲染的泰安市域立体晕渲图,红点为泰山主峰,黑线为泰安市行政区边界。
1. 网页勾选:最快上手
打开地理空间数据云(gscloud.cn)或OpenTopography,在地图上框选上述范围,筛选SRTM / AW3D30,直接下载GeoTIFF。
优点是不用写代码,缺点是要注册账号(地理空间数据云),且大范围手动框选容易漏图幅。适合一次性、小范围需求。
2. 免登录批量:AWS Terrain Tiles(重点)
这个源是AWS公开数据,标准z/x/y瓦片地址,没有任何鉴权,适合写成脚本按经纬度范围自动拉取。实测稳定,作为DEM获取的"底配"很可靠。
瓦片是Terrarium编码的PNG,像素RGB解出高程的公式是:
h = (R × 256 + G + B / 256) − 32768 (单位:米)一段最小可运行的Python思路(依赖numpy、Pillow、requests):
import math, requests, numpy as np from PIL import Image from io import BytesIO LON_MIN, LON_MAX = 116.05, 118.00 # 泰安市域外接范围 LAT_MIN, LAT_MAX = 35.63, 36.48 Z = 11 # 约 76 m/像素,全市域轻量;细看泰山可调 Z=13 def tile_xyz(lon, lat, z): n = 2 ** z x = int((lon + 180) / 360 * n) y = int((1 - math.log(math.tan(math.radians(lat)) + 1 / math.cos(math.radians(lat))) / math.pi) / 2 * n) return x, y def decode(png_bytes): img = Image.open(BytesIO(png_bytes)).convert("RGB") r, g, b = np.array(img).T return (r * 256 + g + b / 256) - 32768.0 x0, y0 = tile_xyz(LON_MIN, LAT_MAX, Z) x1, y1 = tile_xyz(LON_MAX, LAT_MIN, Z) rows = [] for x in range(x0, x1 + 1): row = [decode(requests.get( f"https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{Z}/{x}/{y}.png", timeout=30).content) for y in range(y0, y1 + 1)] rows.append(np.concatenate(row, axis=1)) dem = np.concatenate(rows, axis=0) print(dem.shape, dem.min(), dem.max()) # 拿到高程数组,再写 GeoTIFF拉下来的高程数组,配好经纬度仿射参数,就能写出带坐标系的GeoTIFF,后面直接进ArcGIS、QGIS或做三维建模。
3. QGIS路线:先看个地形晕渲
不想写代码,又想先预览地形,可以在QGIS里加XYZ Tiles,源地址填上面的Terrarium URL并声明 terrarium 编码,叠加山体阴影(hillshade)就能看到泰山的起伏。适合前期确认范围对不对。
四、下载之后,三个坑别踩
坑一:高程基准不一致。 上面这些开源DEM,垂直基准大多是EGM96或EGM2008大地高,而国内工程、测绘普遍用的是1985国家高程基准。两者在泰安一带能差出数十米。如果你把下载的DEM直接和正射影像、GNSS-RTK实测控制点叠在一起,发现整体对不上,先别怀疑数据坏了——多半是基准没转。需要做似大地水准面转换(EGM2008模型或国内高程拟合)。
坑二:瓦片缝隙和边缘nodata。 多源拼接、不同分幅交界处经常出现细缝或空洞,需要用mosaic拼接再填洞。泰安这种山区,nodata容易出现在陡崖背坡,预处理时单独查一下。
坑三:投影。 开源数据几乎都是WGS84经纬度,国内项目通常要转到CGCS2000高斯投影(泰安约在3度带第39带,中央经线117°)。投影变换时记得把中央经线设对,否则整幅图会整体偏移。
五、泰山地形,拿来校验

沿东经117.109° 穿过泰山的南北剖面,下载的DEM还原出主峰约1525 m,与公开资料一致。
下载完,拿泰山玉皇顶校一下:公开资料显示峰顶海拔约1532米(不同数据源略有出入)。如果你读到的高程明显偏低,比如只到500米量级,基本可以判定是经纬度配准偏移或者源数据本身的问题——先排查范围与投影,再做垂直基准转换,顺序别反了。
另外提醒一句:如果你做的是InSAR形变分析,ALOS AW3D30有一个WGS84椭球高版本(Ellipsoidal),那个版本省去做大地高到椭球高的换算,和雷达干涉对高程敏感的处理链路更搭。
资源清单(可复制)
AWS Terrain Tiles(免登录):
https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png
OpenTopography(ALOS AW3D30 / GLO-30,免注册S3与网页裁剪):
https://opentopography.org/
地理空间数据云(国内镜像,SRTM / ASTER GDEM):
http://www.gscloud.cn/
USGS EarthExplorer(SRTM GL1 30 m):
https://earthexplorer.usgs.gov/
Copernicus DEM(GLO-30):
https://copernicus-dem-30m.s3.amazonaws.com/

主图与高程分层着色组合长图,可作封面或滚动长图。
结语
DEM是测绘遥感数据处理链路里第一块砖。选对源、搞清基准、做好配准,后面坡度坡向、可视域、InSAR形变才站得住。
本文为技术分享,不涉及具体项目与单位。
夜雨聆风