ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

张掖DEM 30m数据处理:从体检、裁剪到等高线与坡度批处理

2026/10/3 10:54:57 拓冰建站 浏览量
张掖DEM 30m数据处理:从体检、裁剪到等高线与坡度批处理 简介面向GIS专业学生、研究人员及城乡规划从业者提供甘肃省张掖市30米分辨率DEM数字高程数据并附带覆盖市域及周边部分区域的范围shp矢量文件可直接用于地貌解析、洪水模拟、工程选址与国土空间规划等场景。压缩包共12个文件大小约187.99MB核心文件为张掖市DEM.tif栅格高程数据配套tfw坐标信息、ovr金字塔加速文件范围shp及其dbf属性、prj投影、shx/sbn/sbx索引文件组成完整Shapefile确保ArcGIS、QGIS等主流GIS软件导入后即可开展分析。30米网格可较好地呈现山峰、山谷、河流等微地貌特征配合行政区划范围文件还能实现裁剪、拼接和区域统计。已有405人学习下载适合需要中等精度真实地形数据完成课程设计、科研实验或区域规划项目的用户。1. 拿到甘肃省张掖市 DEM 数字高程数据 30m 压缩包先别急着出图甘肃省张掖市 DEM 数字高程数据 30m 分辨率的成果包通常以一个 zip 压缩包交付里面除了高程栅格还会带上这一片的区域范围 shp 文件。我见过很多人拿到手直接拖进 ArcGIS用拉伸符号化出一张彩色地形图然后发现 shp 和 DEM 对不齐、值域统计异常、裁剪完边缘一大片空白。这不是数据本身坏了而是 30m 分辨率数据在交付、投影与预处理上的几个默认条件没被满足。这篇文章就围绕这个 zip 展开怎么先做数据体检怎么把 DEM 和 shp 正确叠合及裁剪怎么生成等高线、坡度坡向以及我切到 Python 加 GDAL 批处理时反复踩过的几个坑。适合需要把张掖或河西走廊类似地区的 30m DEM 落进实际项目的 GIS 工程师、规划人员和水文从业者。2. 拆开张掖 DEM 30m 压缩包文件清单、坐标系和数据体检2.1 解压前先看 zip 内容别以为里面只有 DEM 和 shp拿到这种 zip我习惯先不解压用 7-Zip 或 Windows 资源管理器直接浏览压缩包列表。这一步能避开两个经典问题一是压缩包体量不小直接右键解压到桌面碰到磁盘空间不足会中断留下半截文件二是包内往往不是一个文件而是按目录组织的栅格与矢量盲目全选解压会把结构打散。先看列表你至少能确认三件事。高程文件是单幅还是分幅——张掖这种东西跨度大的地区30m DEM 有时按标准分幅切成多块交付直接整幅加载会在后续镶嵌时出现重叠边区域范围 shp 是否齐全——shp 在交付时必须同时具备 .shp、.shx、.dbf 三个文件缺了 .shx 在 ArcGIS 里基本打不开缺了 .dbf 属性表就是空的有没有投影说明文件 .prj如果 shp 缺 .prj它的坐标系信息就丢了后面叠加会很麻烦。顺带说一句如果你是从地理空间数据云这类平台下载的栅格压缩包内常见结构是「高程 tif 范围 shp readme 文本」。readme 里通常会写清楚数据版本、坐标系和无效值约定这比任何二次猜测都准确。我建议先读 readme再动数据。2.2 用 gdalinfo 或图层属性做第一次体检坐标系与像素尺寸我的做法是先跑一条 gdalinfo 看栅格元数据。这条命令对所有 GDAL 能读的栅格都适用Windows 下用 OSGeo4W Shell 运行Linux 直接用终端。gdalinfo zhangye_dem_30m.tif输出里重点看几个字段。Pixel Size 如果显示为 0.0002777778 这样的值说明 DEM 还停在地理坐标系WGS84下30m 约等于 0.000278 度如果显示为 30 或 30.0说明它已经投影到平面坐标系。这个区别直接影响后面所有地形因子的计算因为只有平面坐标下水平单位才是米。接下来确认 DEM 和 shp 的坐标系是否一致。张掖市域大约落在东经 97°到 102°、北纬 38°到 40°之间常见的两种交付形式是 WGS84 经纬度以及 CGCS2000 或 UTM 47N 投影。在 ArcGIS 里选中 shp 图层打开图层属性的源选项卡能看到坐标系字符串如果 shp 与 DEM 不同后面叠加和裁剪会直接翻车这属于张掖项目里最频繁出现的问题我在第 4 章会专门展开。2.3 DEM 的 NoData 与无效值统计值为什么会骗人第三个体检项是看空值和有效范围。很多时候直接加载 DEM 并用拉伸符号化会看到一条从 -9999 到几千米的色带这不是数据异常而是 NoData 没有被正确识别。ArcGIS 的源信息里能看到 NoData 值常见是 -9999 或 32767如果工具没读对后面计算坡度、生成等高线时就会把空值当作真实高程参与运算输出成尖锐的负值或异常沟壑。我一般会在 gdalinfo 的统计信息里看最小值和最大值如果最小值恰好是 -9999 或 0 附近就得警惕。更严谨的做法是算一遍有效像元占比用 Python 或 QGIS 的栅格计算器统计大于 0 或非 NoData 的像元个数。对张掖这种含祁连山区和高海拔荒漠的区域有效高程跨度通常在 1200 米到 5500 米之间如果统计结果明显超出这个区间说明空值混了进来。还有一个隐藏问题影像边缘存在无效像元。30m 数据在分幅拼接时边缘经常出现一行或一列 NaN整幅看时不容易察觉但按掩膜提取后就会变成 DEM 与 shp 边界之间的一条锯齿状空带。处理方式不复杂先裁剪再用焦点统计把边缘空值补掉或者干脆在裁剪时把范围外扩 1 个像元再切回原范围。3. 用 ArcGIS 处理张掖 DEM 30m按掩膜提取与地形因子的参数3.1 按掩膜提取最小参数组合与输出设置如果手头只有 ArcGIS最快且稳的裁剪方式是按掩膜提取路径在 ArcToolbox 里是 Spatial Analyst Tools—Extraction—Extract by Mask。输入 DEM掩膜指向区域范围的面状 shp输出为 tif。有两个参数值得单独说明像元大小默认会继承输入 DEM 的 30m不要手改成 10m否则会出现重采样空洞和虚假细节NoData 值建议统一设置成 -9999方便后续在 Python 里统一判断。操作上我一般先确认 shp 坐标系再执行裁剪。输出路径要写全包含路径的 .tif而不是临时栅格图层因为图层形式只是引用重启 ArcMap 或 ArcGIS Pro 后配置会丢。裁剪完成后用识别工具点几个位置确认高程不是 -9999也不是空洞。这里有个细节很多人忽略Extract by Mask 保留的是「掩膜范围内所有像元即使像元中心点不在面内」所以裁剪结果的轮廓会比 shp 略毛糙。要严格贴合边界应该打开环境设置里的裁剪栅格选项或者改用第 5 章的 gdalwarp 加 -crop_to_cutline。3.2 生成等高线、坡度与坡向间隔怎么选投影怎么换等高线工具在 3D Analyst 里输入裁剪后的 DEM等高距我一般对张掖这种高差大的区域选 50 到 100 米。选 50 米以下在 30m 分辨率下会产生大量细碎折线附在地图上很难看也不适合打印100 米在祁连山和平原过渡的地方又太粗会漏掉关键地形。常见做法是分两段祁连山段用 100 米黑河河谷两侧用 50 米生成后再合并比一锅端效果好。坡度工具默认输出单位是度范围 0 到 90。要注意的是ArcGIS 的坡度工具在经纬度坐标下算出的值不可用因为水平单位是度垂直单位是米量纲不一致。必须先投影到 CGCS2000 或 UTM 47N高斯克吕格投影也可以再算坡度。这个坑在张掖这类跨投影带的地区尤其容易犯投影带如果选错了中央经线坡度结果会整体偏差。坡向工具默认输出 0 到 360 度平地输出 -1山体阴影工具里有两个参数值得调太阳方位角和太阳高度角默认 315 度和 45 度在河西走廊这种光照环境下偏暗我通常改成 135 度和 45 度再把透明度叠在彩色 DEM 上立体感会好很多。3.3 验证输出直方图、边界贴合与已知点抽样最后一步是验证不能只看颜色。我把裁剪后的 DEM 单独加载叠加区域范围 shp然后在图层属性里打开直方图看值分布。如果直方图在 1200 米以下出现孤立峰说明空值或水体像元混了进来。如果是坡度图层可以用识别工具去几个已知地点查值比如黑河河谷的坡度应该明显小于祁连山北坡。还有一种快速验证方式用重分类把坡度分成 0 到 5、5 到 15、15 到 25、25 以上四档看各类别像元数量是否大体符合地理规律——如果 25 度以上在谷地出现大片分布大概率是投影换算出了问题。4. 张掖 DEM 30m 数据处理的五条避坑记录4.1 DEM 和 shp 对不上不是数据坏了是投影带不一致现象把 DEM 和范围 shp 同时放进 ArcGIS两者在画布上相隔几百公里或者只有一个能看到。 原因zip 里 DEM 常见是 WGS84 坐标系而 shp 可能被转成了 CGCS2000 3 度带高斯投影也可能是 UTM 47N三者在同一画布上自然对不上。 解决以 DEM 为准用 Project 工具把 shp 一次性投影到 DEM 坐标系。注意 UTM 47N 和高斯克吕格虽然中央经线同为 99°E但参数结构不同不能混用。投影后再叠加如果还有少量偏移用 Spatial Adjustment 做平移校正控制在 1 到 2 个像元内也就是 30 到 60 米超过这个值就要回去查原始数据来源。4.2 等高线出现尖刺负数直接跳到几千米现象生成等高线时某些地方出现极细长的尖刺折线高程从负数直接跳到几百米。 原因DEM 在河谷或分幅拼接处有空值或无效值等高线工具把这些值当作真实高程参与插值。 解决先用栅格计算器把 NoData 与无效值统一重设为 NoData再用焦点统计工具按最小值或最大值填充需要补洞的位置。填充半径我一般设 3 像元也就是 90 米。填充后重新生成坡度或等高线尖刺就会消失。这个操作属于数据修复做完后最好把修复记录写进数据说明避免下游使用者误以为原始 DEM 如此。4.3 shp 属性表打开是乱码编码问题不是玄学现象在 ArcGIS 里打开 shp 属性表字段名和属性值显示为乱码。 原因shp 的 dbf 文件常见编码是 GBK、GB2312 或 UTF-8三者的字节流在不同软件里的解释方式不同就会出现乱码。 解决在 ArcGIS 里设置图层属性的编码或在 QGIS 里重新加载并指定编码更稳妥的做法是直接用记事本或文本工具打开 dbf 另存为 UTF-8 的 CSV再导入成新的 shp。每次处理完我会把原始 dbf 拷贝一份存档防止后续覆盖导致属性丢失。4.4 裁剪后的 DEM 带黑边范围设置没跟上现象裁剪输出的 DEM 和 shp 边界不吻合四角出现黑色矩形区域。 原因使用 Extract by Mask 时没有在环境里设置处理范围为 shp 范围工具默认使用输入栅格的范围输出自然带了大量空白区域。 解决在环境设置里把处理范围改为「与 shp 相同」并开启裁剪栅格选项。如果想彻底避免这类问题换成 gdalwarp 加 -crop_to_cutline输出不会携带多余范围这是我现在更常用的做法。4.5 zip 解压报错或 shp 缺文件先校验再处理现象解压时提示文件损坏或缺失解压后 shp 在 ArcGIS 里打不开。 原因下载过程中数据包字节缺失或分卷包没有下全也可能是 shp 在打包时缺了 .shx 或 .prj。 解决先看 zip 文件大小是否与下载页标注一致用 7-Zip 的测试功能校验压缩包完整性。shp 缺 .shx 时用 QGIS 打开有时能自动修复缺 .prj 时用 QGIS 手动定义坐标系再导出比猜投影靠谱。这种问题属于送分题但发生频率相当高尤其是用了不靠谱的下载工具时。5. 用 Python GDAL 批处理张掖 DEM裁剪、重采样与地形因子5.1 读取 DEM 和 shp 的最小脚本做完 ArcGIS 的单幅处理后如果面对的是多幅分幅 DEM我会切到 Python 加 GDAL 做批量。先读取数据基本信息确认坐标系、像素尺寸和 NoData再决定下一步。from osgeo import gdal, ogr dem_path zhangye_dem_30m.tif shp_path zhangye_boundary.shp # 打开 DEM只读模式 ds gdal.Open(dem_path, gdal.GA_ReadOnly) if ds is None: raise IOError(无法打开 DEM 文件请检查路径) # GeoTransform 依次是左上角x, 像素宽度, 旋转项, 左上角y, 旋转项, 像素高度 gt ds.GetGeoTransform() cols, rows ds.RasterXSize, ds.RasterYSize band ds.GetRasterBand(1) nodata band.GetNoDataValue() print(行列数:, cols, rows) print(分辨率:, gt[1], gt[5]) print(NoData:, nodata)这段代码里最重要的是 GeoTransform 的前两项和后一项分别对应横向和纵向分辨率。如果 gt[1] 和 gt[5] 的绝对值不同说明像元不是正方形常见于 WGS84 经纬度下的 DEM需要先投影再使用。NoData 获取为 None 时要人工从 readme 里查不能直接假设为 -9999。5.2 用 gdalwarp 裁剪 DEM 到 shp 范围单幅裁剪最常用的命令是 gdalwarp它的裁剪质量比 Extract by Mask 更可控尤其是输出范围能严格贴合边界。gdalwarp -cutline zhangye_boundary.shp -crop_to_cutline \ -dstnodata -9999 -of GTiff zhangye_dem_30m.tif zhangye_dem_clip.tif-crop_to_cutline 的意思是输出像元范围严格与 shp 边界一致不加这个参数输出只是按 shp 外接矩形裁边缘仍然有一圈 NoData。-dstnodata -9999 把所有空值统一为 -9999方便后续用同一条件筛选。如果 shp 与 DEM 坐标系不同需要加 -t_srs 指定目标坐标系否则 gdalwarp 会默认以 DEM 为准结果仍是错位。5.3 批量生成坡度、山体阴影与颜色浮雕GDAL 自带工具 gdaldem比 ArcGIS 快得多。坡度计算在经纬度坐标下必须加 -s 参数做垂直与水平单位换算否则结果偏小得离谱。gdaldem slope zhangye_dem_clip.tif zhangye_slope.tif -p -s 111120-p 表示输出坡度百分比-s 111120 表示纬度 1 度约等于 111120 米这个值适合 WGS84 经纬度坐标。如果 DEM 已是投影坐标水平单位是米就不要加 -s可以用 -p 得到百分比坡度。接下来生成山体阴影和颜色浮雕gdaldem hillshade zhangye_dem_clip.tif zhangye_hillshade.tif -az 135 -alt 45 -z 1.2 gdaldem color-relief zhangye_dem_clip.tif color_ramp.txt zhangye_shaded_relief.tif-z 1.2 是垂直夸大系数。张掖高差大系数过大阴影在山谷区域会一片死黑1.2 左右比较合适。color_ramp.txt 是自定义颜色表每行是「高程值 空格 红色 绿色 蓝色」。我会按河西走廊的地貌特征设置四档颜色1200 200 230 160 2500 160 190 120 4000 120 120 80 5500 255 255 255这段配置里 1200 到 2500 米对应绿洲和荒漠过渡区2500 到 4000 米对应山地4000 米以上对应高寒区。颜色值可以根据制图风格调整但高程断点最好结合张掖的实际地形区间设定不要照搬默认。5.4 批量循环与统计筛选面对几十个分幅文件时我会写一个循环先做统计筛选再逐幅处理。import glob for dem in glob.glob(dem_tiles/*.tif): ds gdal.Open(dem, gdal.GA_ReadOnly) band ds.GetRasterBand(1) stats band.GetStatistics(True, True) if stats[0] -5000: print(f跳过 {dem}: 存在大量 NoData 值) ds None continue # 在这里继续执行裁剪或重采样 ds NoneGetStatistics 的第二个参数必须为 True工具才会在 NoData 未定义时强制扫描全图并计算真实统计否则返回的是缓存值很容易漏掉异常数据。筛选阈值 -5000 是根据张掖 DEM 正常最小值 1200 米设定的如果你的研究区高程范围不同要相应调整。6. 进阶把张掖 DEM 30m 做成坡度分级图与地形阴影图30m 数据出图关键不是颜色深浅而是图层叠加透明度。先把山体阴影放到底层再把颜色浮雕或原始 DEM 拉伸图层放到上层上层透明度设在 40% 到 50% 之间既保留高程色带又有立体阴影。图层顺序和透明度参数在 QGIS 里调整比 ArcGIS 顺手所以出图阶段我一般用 QGIS。接着做坡度分级。用重分类把坡度分成四级0 到 5 度为平缓区5 到 15 度为缓坡区15 到 25 度为中山坡地25 度以上为陡坡区。分类界限不是随便定的30m 分辨率在 1:10 万制图比例尺下25 度以上区域基本就是易侵蚀地区。如果你做的是道路选线或土地整治建议把 25 度单独提出来做一张二值图快速查看不可建设用地的分布。三维地形展求如果没有专业软件用 ArcScene 或 QGIS 的 Terrain Shading 也能达到效果。拉伸因子要控制好张掖整体高差大拉伸 2 倍足够过度拉伸会让黑河河谷看起来像悬崖。汇报时把范围 shp 转成 KML 在移动端展示也很常见注意先转成 WGS84 经纬度再导出否则在手机地图里位置会偏移。最后是验证与输出。导出的坡度图分辨率保持 30m打印比例尺建议 1:10 万同时计算各坡度级别的面积占比写进报告。我习惯每次导出前做一次栅格属性检查确认行列数与原始 DEM 一致、NoData 占比小于 1%否则重新走一遍裁剪流程。这套流程反复用在同一地区不同年份的数据上可以对比地表侵蚀变化这才是 DEM 长期价值所在。希望帮到你。本文还有配套的精品资源点击获取