30米DEM数字高程数据包处理全流程:从解压、shp边界到地形分析
简介:本资源为山东省烟台市30米分辨率数字高程模型(DEM)地理信息数据集,面向GIS初学者、地理信息专业学生及城乡规划、环境分析等领域的实践者,用于开展地形可视化、坡度坡向计算、水文分析与三维地形建模等基础空间分析任务。压缩包共12个文件,包含核心栅格数据文件(烟台市dem.tif)、配套坐标系定义(.prj)、空间索引(.shx/.sbn/.sbx)、属性数据库(.dbf)及矢量边界文件(烟台市范围.shp),完整支撑ArcGIS、QGIS等平台直接加载与分析。资源大小31.8MB,结构规范、元数据齐全,所有文件均经坐标配准与格式校验,开箱即用。目前已有884人学习下载,用户可直接调用该DEM开展烟台市域尺度的地形特征提取、地貌分类或教学演示,无需额外预处理,显著降低GIS空间分析入门门槛。 我刚拿到这个数据包的时候,文件名只有一个:“山东省烟台市DEM数字高程数据30m(含本市级范围shp文件).zip”。乍一看挺直观,可真正动手处理时,DEM是什么、30米分辨率到底意味着什么、里面那个“本市级范围shp文件”能怎么用、压缩包怎么解、坐标系怎么处理,每一项都有值得说道的地方。这篇文章我就按照实际使用的顺序,把一个 30m DEM + 市级边界 shp 的数据包从解压到落地使用,完整拆一遍。
不管你是刚接触GIS的学生,还是已经在做国土、规划、水利相关项目的老手,只要你手头有类似的DEM压缩包,这篇内容都能帮你少走几弯路。下面我按拿到数据后最合理的处理顺序来讲。
1. 拆开这个zip之前,先搞明白30m DEM到底能做什么
1.1 一个像元30米是什么概念
DEM(Digital Elevation Model,数字高程模型)说白了就是一张带着海拔信息的栅格图。所谓30m分辨率,意思是这张图上的每个像元,对应地面上的一个30米乘30米的正方形区域,每个像元只存一个数值,就是那个区域的平均海拔。
这么说可能不太好感知,我换个说法:30m DEM在省级、市级这种宏观尺度上,足够看清一座山的整体轮廓、一条河谷的最低走势、一个城区的起伏骨架。但如果要分辨一条双车道公路的路面坡度、一栋楼前后的高差,30m就完全不够了,那时候需要的是1m或更高精度的LiDAR数据。烟台这种以低山丘陵为主的地形,用30m数据做区域规划、流域分析、选址评估、三维地形展示,性价比是最高的。
1.2 这份数据可能来自哪,不同来源差别大吗
标题里没有写明数据源,这里我把目前最常见的开源30m DEM数据列一下,你拿到数据后可以对照元数据判断:
| 数据源 | 发布机构 | 分辨率 | 特点 |
|---|---|---|---|
| SRTM GL1 | NASA/USGS | 1弧秒(约30m) | 覆盖稳定,使用最广,高程基准WGS84,2015年后全球开放 |
| ASTER GDEM | METI/NASA | 1弧秒(约30m) | 覆盖全球,垂直精度略低于SRTM,云和噪声较多 |
| ALOS AW3D30 | JAXA | 1弧秒(约30m) | 全球DSM,精度不错,包含地表建筑和植被顶部信息 |
| Copernicus GLO-30 | ESA/哥白尼 | 30m | 基于TanDEM-X,目前开源全球DEM里口碑相当好的一款 |
不同来源的高程数值会有几米到十几米的差别,尤其是植被覆盖区和山体阴影区域。SRTM和Copernicus之间的差异一般比ASTER小。你做跨区域对比时最好统一用同一个数据源,不要A地区用SRTM、B地区用ASTER,否则最后出图结果会有明显接边落差。
1.3 市级边界shp的真正价值:裁剪与统计的“标准尺”
压缩包里那个“本市级范围shp文件”才是整个数据包里的隐藏钥匙。它通常是一个面状的行政区划边界,用来做两件最核心的事:
第一,裁剪。DEM是全球或大区范围的栅格,直接做分析会包含周边城市,边界不干净。用市级shp对DEM做掩膜提取(ArcGIS里的Extract by Mask,QGIS里的Clip Raster by Mask Layer),就能得到只覆盖烟台市范围的DEM,后续统计面积、计算等高线都精确很多。
第二,统计。有了行政区划边界,你可以按区县拆分布尔运算,统计每个区的平均海拔、最高点、坡度分级面积占比,这些在规划报告里是特别实用的数据。
这里有个细节我提醒一下:有些数据包里的shp是简化版边界,只适合大比例尺展示,做精确面积统计时会有误差。你拿到shp后先看一眼属性表里有没有面积字段,再和实际行政区面积对比一下,心里有个数。
2. 先把文件弄到手:解压、校验、密码与损坏修复
2.1 下载的zip为什么老是解压失败
很多人第一步就卡在解压上。标题带“.zip”,但你用Windows自带解压或者老版本的WinRAR一解,报错一串英文。我列举几个高频翻车现场和对应的原因:
| 报错信息 | 最可能的原因 | 优先处理方案 |
|---|---|---|
| file is not a zip file | 文件本身不是zip格式,只是改了后缀名 | 用Linux的file命令看真实类型,或用7-Zip打开 |
| invalid zip archive: could not find eocd | zip文件不完整,下载中断导致尾部目录缺失 | 重新下载,或用7-Zip的修复功能 |
| failed to copy spatial iop zip | 多发生在网络磁盘或压缩包内文件被占用时 | 换到本地目录,关掉杀毒软件再解压 |
| 解压后中文文件名全部乱码 | zip包在Windows下用GBK编码,Linux下默认UTF-8解码 | 解压命令加 -O GBK 参数,或用Bandizip/7-Zip |
“could not find eocd”这个报错很有代表性。EOCD是zip文件末尾的中央目录结束标记,相当于整本书的目录页。如果文件下载到一半断了,或者传输过程中被截断,zip尾部没有这个标记,系统就根本认不出它是一个完整压缩包。
遇到这种情况,我的处理顺序是:先重新下载一次,如果还不行再用7-Zip的“打开压缩包-工具-修复压缩文件”功能,修复后一般能抢救出大部分数据,但修复出来的文件名可能变成随机名,属性表之类的小文件也偶尔会丢,所以这只适合应急。
2.2 快速修复手段与Linux解压命令
如果你在Linux服务器上工作,解压中文文件名的zip包,最简单的是这样:
# 先看压缩包内容,别急着解 unzip -l 山东省烟台市DEM数字高程数据30m.zip # 直接解压,中文乱码时用 -O 指定编码 unzip -O GBK 山东省烟台市DEM数字高程数据30m.zip如果压缩包被拆成了多个分卷,比如 .z01、.z02 加一个 .zip,这时候必须先把所有分卷放在同一个目录下,从 .zip 那个主文件开始解压,普通unzip可能会分卷处理不干净,建议直接用7-Zip图形界面或Windows的WinRAR,它们对分卷的支持更成熟。
顺带说一下zip密码的事。如果压缩包是加密的而你知道密码,只是想去掉加密属性,很简单:用WinRAR或7-Zip正常解压到文件夹,然后把里面的文件重新打成不带密码的zip/rAR包。如果密码本身忘了,那只能找数据提供方要,或者自己逐个回忆可能的密码组合,没有任何正规工具能“一键移除”未知密码。市面上所谓密码恢复工具,本质都是跑字典或暴力穷举,耗时长短完全取决于密码强度。
2.3 解压后的文件结构检查清单
解压完成后,先别急着拖进ArcGIS。我建议按这个清单过一遍:
- 数据里有没有 .tif / .img / .dem 结尾的高程栅格文件?
- 旁边有没有 .tfw / .xml 之类的元数据文件?有的话先打开xml看坐标系和分辨率。
- shp文件是单独一个“烟_市界.shp”,还是一整套 .shp/.shx/.dbf/.prj?前三个缺一个都打不开,prj缺失则坐标系未知。
- 文件大小是不是符合预期?30m DEM覆盖一个市级范围,压缩后一般在几十MB左右,如果只有几百KB,八成是边界矢量而不是完整栅格。
这些检查不花多少时间,却能防止你后面花了半天处理数据,结果发现原始文件本身有问题。
3. 坐标系的坑,比数据本身更值得花时间
3.1 先看坐标系元数据,别急着加载
我见过太多人把DEM往ArcMap里一拖就开始做坡度分析,做完之后发现结果单位根本不对。原因很简单:很多开源30m DEM(SRTM、Copernicus、ALOS)默认都是WGS84地理坐标系,单位是度,不是米。如果你拿经纬度直接算坡度,ArcGIS会提示你“这个数据是地理坐标系,需要投影”,有些自动处理流程会默认按每度对应的近似米数换算,但结果并不精确。
所以拿到数据的第一步永远是看属性,ArcGIS里右键图层-属性-源,QGIS里看图层属性-信息,确认坐标系是GCS_WGS_1984、CGCS2000还是别的。这个习惯能帮你避开至少一半的返工。
3.2 烟台市该用哪个投影参数
烟台市大致在东经119.5度到122度之间,横跨了3度分带里的40带和41带分界附近。如果只给整个烟台市范围做分析,我推荐用高斯-克吕格3度分带第40带(中央经线120度东经),这是国内测绘生产和自然资源项目里最常用的选择。
在ArcGIS Pro里,投影栅格工具的目标坐标系可以选CGCS2000 / 3-degree Gauss-Kruger CM 120E,或者WGS_1984_UTM_Zone_50N。要注意的是,用UTM 50N(中央经线117度)处理烟台东侧区域时会有一定变形,如果项目要求面积精度,稳妥做法是自定义一个以120E为中央经线的高斯投影,或者用覆盖全省的Albers等积投影,两条标准纬线取36N和38N。
还有一个很容易忽略的点:30m分辨率在投影后,像元大小要重新指定。如果你把WGS84下的0.0002695度当作30米,投影后还要把像元大小明确设置为30米,否则输出栅格的分辨率会变成一个看着很奇怪的小数。
3.3 坐标不匹配的三种典型翻车现场
我在实际工作中遇到过三种很典型的情况,分享出来给大家避雷:
第一种,矢量shp与DEM坐标系不一致。最常见的是shp用的是CGCS2000投影坐标,DEM是WGS84地理坐标,两者直接叠加,shp跑到栅格外几百公里外。解决办法是先投影shp或重投影DEM,让二者坐标系统一。
第二种,把经纬度数据当成投影坐标读取。这样整个图层缩放到一个点附近,看着像“数据丢失”,其实是坐标系定义错了。
第三种,投影后高程值出现异常。这种情况比较少,但如果你选的投影基准面和原数据不符(比如WGS84椭球与CGCS2000椭球之间没做转换),高程值可能会整体平移几十米。在山东半岛这类区域,WGS84和CGCS2000的差异通常在1米左右,但在要求严格的工程应用中不能忽略。
所以我的建议是:做正式的坡度、面积、水文分析之前,务必把数据统一到同一个投影坐标系,并且记录好原始坐标系和转换参数,后面写报告还能用上。
4. DEM数据实战:从地形分析到三维可视化
4.1 坡度、坡向、山体阴影一锅端
投影处理好之后,就可以开始地形分析三件套了:坡度、坡向、山体阴影。
- 坡度(Slope):表示地面陡缓程度,单位常用度或百分比。ArcGIS里Slope工具直接输入DEM,算出每个像元的坡度角。
- 坡向(Aspect):表示坡面朝向,输出的是0到360度的方位角,用来做光照、植被、建筑选址分析都很常见。
- 山体阴影(Hillshade):模拟光线照射地形,默认参数是方位角315度(西北方向光源)、太阳高度角45度,出来的灰度图非常自然。
这三个工具在ArcGIS里都在Spatial Analyst工具-表面分析下。QGIS用户则用Raster-terrain analysis菜单,也一样。
操作上我有个小建议:山体阴影不要只用默认参数,可以叠加多个光源方向做多方向阴影(multidirectional hillshade),用40%透明度叠在坡度图或影像图底下,效果比单方向阴影好很多。烟台这种多丘陵的区域,单方向阴影很容易在某些朝向产生大片死黑,多方向叠加能明显改善山地立体感。
4.2 等高线生成与制图输出
从DEM生成等高线是特别常见的需求,ArcGIS里用Contour(等值线)工具,QGIS里叫Contour。关键参数是等值线间距,烟台这种海拔多在0-900米之间的低山丘陵区域,大范围制图用20米间距比较合适,局部小区域看细节可以加密到10米甚至5米。
生成之后等高线默认是一堆折线,线条生硬,有锯齿。我的处理流程是:
- 先用Smooth Line工具做平滑,拓扑容差设小一点;
- 然后根据高程字段做分级设色,低海拔用绿色,中海拔用黄色,高海拔用棕色;
- 最后标注等高线高程值,字体小一点,避开密集区域。
这里要提醒一句,30m DEM生成的等高线只能用于示意图、宏观分析图,不能用于工程测量和地籍确权。原因很简单,30m的栅格在陡坡区域本身就丢失了大量地形细节,等高线误差现场一两米很正常。
4.3 水文分析与流域提取
DEM另一个重量级用途是水文分析。用ArcGIS的Hydrology工具组,流程很固定:
- Fill(填洼):先把DEM上的小凹点填平,避免水流滞留在错误位置;
- Flow Direction(流向):用D8算法,即每个像元沿最陡坡方向流向8个邻域之一;
- Flow Accumulation(累积流量):统计每个像元上游有多少像元汇入;
- 设置流量阈值,提取河流网格;
- 用Watershed工具结合出水口,提取完整流域边界。
这套流程放在烟台这种多丘陵、多短小河流的沿海地区,宏观尺度上完全可用。但有个坑一定要踩明白:Fill会改变地形,填洼之后生成的河流是“理想状态”下的水系,不是真实河道。你拿30m DEM提取出来的河网,天然就和卫星影像上的实际河道有偏移,这是分辨率带来的物理限制,不是操作问题。
4.4 三维场景和3dtiles发布
DEM最出效果的地方是三维可视化。最简单的做法是把DEM和山体阴影图叠在一起,在ArcScene或ArcGIS Pro里用“Layer 3D”显示,垂直夸张系数设成1.5到2倍,烟台这种地貌马上就有立体感了。QGIS里还能用Qgis2threejs插件,一键导出交互式三维网页,方便你发给同事领导和甲方预览。
如果你想发布到Web端、加载进Cesium或者大屏,那就要把地形切片或者转成3dtiles了。这里要注意两条技术路线,别混淆:
- DEM如果要保留地形起伏效果,应该转成地形切片(terrain tileset),Cesium接下来可以直接做地形刷;
- shp矢量(比如市界、区县面、带状线)如果要加载进三维场景,才转成3dtiles。
CesiumLab是个很方便的免费工具,DEM转terrain和shp转3dtiles都能一条龙处理,设置好坐标系和切片层级后,输出结果直接挂到Cesium中加载,烟台市范围的数据量级处理起来很轻松。
5. shp文件打开与转换的那些硬骨头
5.1 shp不是单一文件——五件套缺一不可
写过shp的同学都知道,shp从来不是“一个文件”,而是一组文件。常见组成如下:
| 文件后缀 | 作用 | 是否必需 |
|---|---|---|
| .shp | 要素几何信息,真正的图形 | 必需 |
| .shx | 几何索引,帮助系统快速定位要素 | 必需 |
| .dbf | 属性表数据 | 必需 |
| .prj | 坐标系定义 | 强烈建议 |
| .cpg | 属性表编码声明 | 强烈建议 |
| .sbn/.sbx/.xml | 空间索引、元数据辅助 | 可选 |
如果压缩包里只给你一个单独的.shp文件,那基本没法直接用。碰到缺文件的情况,优先回去找数据源,看是不是解压遗漏了,或者换一个完整数据包。这比试图“修复”一个残缺shp要靠谱得多。
打开shp现在已经很简单了:ArcGIS里双击或者拖进去,QGIS里直接拖拽,最新版的国产GIS软件(如SuperMap iDesktop)也支持直接打开shp。打不开时先检查三点,一是路径里有没有中文和空格,二是文件权限是否只读,三是ArcGIS版本是否支持这个shp生成的坐标系。
5.2 编码问题:cpg缺失导致的乱码
shp里属性表最常见的翻车就是中文字段乱码。原因一句话总结:dbf文件里存的是GBK编码的字符串,但没有cpg文件声明,ArcGIS/QGIS按默认UTF-8去读,中文就全变成问号或“锟斤拷”了。
这个坑我自己踩过不少回。解决办法有两个方向:
- 如果还没打开,先用记事本打开.cpg文件,看里面写的什么。如果缺失,用QGIS打开shp时选择“UTF-8”或“GBK”编码,能试对;
- 如果已经打开了并且乱码,不要在ArcGIS里一个个改字段值,那是白费功夫。正确做法是直接用QGIS重新读一遍,指定正确编码再导出新shp,顺便生成cpg文件,以后再打开就不会乱了。
如果你手头源数据本身就是UTF-8,那在ArcGIS里必须先通过“ArcToolbox-数据管理工具-添加编码页”生成cpg文件并指定为UTF-8,否则属性表里中文照样乱。
5.3 常用转换场景:txt、dxf、CAD、3dtiles
实际业务中shp经常要转来转去,这里说几个最常见的场景。
shp转txt,一般是为了交换坐标数据或导入其他系统。ArcGIS里最简单的方式是打开属性表,全选行,直接复制粘贴到txt里;如果是要导出几何坐标(比如各边界拐点的经纬度),用Python更方便:
import geopandas as gpd gdf = gpd.read_file("烟台市界.shp") # 输出每个要素的外边界坐标 for idx, row in gdf.iterrows(): print(row.geometry.wkt)shp转CAD,批量处理多个shp时,可以ArcToolbox用“导出为CAD”,一次选多个图层输出到一个dwg;如果你需要保留字段属性到CAD扩展数据,那得用FME或者CAD插件,普通导出会丢属性。
dxf转shp则正好相反,用ArcToolbox里的“CAD to Geodatabase”,转完再导成shp。FME是其中最强的工具,但学习成本也高。
shp转3dtiles,需要把矢量拉伸成三维体,然后再切片。CesiumLab里可以直接选shp并设置高度字段、拉伸高度、皮肤颜色,输出带属性查询的3dtiles。注意shp的坐标系在转换前最好统一成web墨卡托(EPSG:3857),否则在Cesium中可能出现位置偏移。这些转换本质上都绕不开两个核心问题:坐标基准统一、属性编码不丢。这两点做好了,格式怎么转都是水到渠成的事。
最后再分享一个我自己的小习惯:拿到任何DEM加shp的数据包,我从来不会直接往GIS里拖,而是先建一个项目文件夹,把原始压缩包保留、解压后的数据放单独目录、坐标系记录写成txt、初步检查结果放一个说明文档。这套习惯看着简单,但在项目多、数据杂的时候,能让你在几个月后回头找数据时还清清楚楚,不用重新折腾一遍。处理DEM这类数据,最大的成本从来不是工具不会用,而是返工。希望这篇内容能帮你少返几次工。
本文还有配套的精品资源,点击获取
