
简介云南省保山市30米分辨率DEM数字高程数据覆盖全市范围并附带边界Shp文件面向GIS从业者、城乡规划与地质环境专业师生可支撑地形分析、洪水模拟、地质灾害评估、生态规划等研究场景。压缩包共12个文件、约81.44MB核心为TIFF格式栅格高程数据另包含保山市范围Shapefile、投影定义文件、空间索引与元数据等辅助信息在ArcGIS、QGIS等软件中加载后可准确定位支持后续填挖方、视域、水文等分析。已有399人学习下载保山市地处滇西高原这套数据可清晰呈现山谷、山脊、坡度和海拔变化适合科研和教学人员快速获取局部高精度地形数据省去自行下载裁剪和坐标配准环节高程栅格与行政边界相互配套可直接作为三维地形建模、灾害风险识别和区域规划的可靠底图。1. 30米分辨率DEM对保山地形分析意味着什么保山市西部被高黎贡山和怒江切割地形破碎度很高。做区域规划或灾害评估时90米SRTM数据容易把细沟谷磨平5米级激光雷达数据又重到难以全城批量计算。30米DEM正好处在“能看清主要地形骨架、又跑得起大规模计算”的平衡点上。这个数据包最吸引我的不是那一个tif而是把保山市范围shp一起打包了解压后就能用边界去裁剪栅格也可以直接统计不同海拔覆盖面积省去到处找区划边界的麻烦。适合GIS工程师、规划从业者也适合用真实地形学习DEM处理的学生。下面按“打开检查、投影裁剪、地形因子提取、等高线生成”的顺序把参数和坑一次性讲透。2. 解压出的不只是tif保山市DEM数据包文件分工2.1 30米格网在保山复杂地形中的实际表现DEM 的本质是把连续地表离散化为规则格网每个格网记录一个高程值。30米分辨率意味着一个30m×30m的方块内只保留一个高度值天然会抹平小于30m的沟槽和边坡。保山从西到东分布着高黎贡山、怒江谷地、保山坝子和澜沧江峡谷最大高差超过3000米。在这样的地形中宽度小于30米的冲沟和梯田边界会被平均化但山脊线、河谷线、主沟道走向都能保留下来。所以30米DEM适合做州域尺度的水文分析和坡度分级不适合做单栋建筑的微地形判断。实际操作中我会先看dem.tif的直方图确认高程范围是否落在保山预期海拔内约600米至3800米再进入后面的处理这一步能快速发现数据拉伸或取值范围异常。2.2 压缩包内文件角色对照展开压缩包后会看到一组名称相近但扩展名不同的文件。不少人只看到保山市DEM.tif就以为完事了忽略了范围shp和tfw。下面列表是按实际用途整理的。文件类型作用保山市DEM.tifGeoTIFF 栅格核心高程数据像元灰度值为海拔保山市DEM.tfw世界文件记录tif左上角坐标和像元尺寸共6行保山市DEM.tif.ovr金字塔加速缩放和局部显示保山市DEM.tif.aux.xml辅助元数据GDAL打开时写入的统计信息、投影描述保山市DEM.tif.xml元数据数据来源、生成日期、坐标系说明保山市范围.shp矢量面用于裁剪、掩膜和面积统计保山市范围.shx矢量索引shp的几何索引缺失时很多GIS软件打不开保山市范围.dbf属性表行政名称等非几何属性保山市范围.prj坐标系文件定义shp的投影读取时依赖它保山市范围.sbn / .sbx空间索引ArcGIS生成的二进制空间索引QGIS/GDAL可忽略保山市范围.shp.xml元数据shapefile的描述性元数据通常可忽略真正参与计算的只有保山市DEM.tif和保山市范围.shp但其他文件在特定工具里是必需的。比如.shx丢了ArcGIS会拒绝直接读取.prj丢了QGIS里需要手动指定坐标系。.sbn和.sbx是ArcGIS的历史包袱从其他系统复制时没有这两文件反而更干净。2.3 用gdalinfo检查栅格的头40行拿到数据后第一步不是急着算坡度而是先确认坐标系、行列数、NoData值。我一般会先解压到工作目录然后用gdalinfo扫一眼unzip -o 云南省保山市DEM数字高程数据30m含区域范围shp文件.zip -d ./保山DEM cd 保山DEM gdalinfo 保山市DEM.tif | head -n 40第一行unzip指定解压目录避免把一堆文件直接撒在当前文件夹head -n 40截取关键输出避免栅格统计信息刷屏。输出里重点看Size、Coordinate System、Pixel Size、NoData Value四段。Size决定分辨率够不够Pixel Size是0.0002度左右的经纬度值还是30米整的投影值直接影响后续gdalwarp参数选择。NoData值如果出现-9999或-32768说明DEM边缘有填充值坡度计算前必须先处理。如果机器上没有装GDAL命令行可以用Python等效检查from osgeo import gdal ds gdal.Open(保山市DEM.tif) print(f尺寸: {ds.RasterXSize} x {ds.RasterYSize}) print(f投影: {ds.GetProjection()}) band ds.GetRasterBand(1) print(fNoData: {band.GetNoDataValue()})这段比gdalinfo输出更简洁适合写进自动化脚本。NoData值是后面所有计算的安全底线如果这里不取出并在处理时保留等坡度图出来时会在边界处出现一圈异常黑色像素原因就是NoData参与了邻域计算。3. 坐标参考与裁剪把保山市DEM放进正确的空间3.1 为什么必须确认DEM的坐标系GeoTIFF的坐标系统信息埋在文件内部tfw只负责记录行列号与地理坐标的换算关系不描述投影。相对的保山市范围.prj是用来描述shp的坐标系。如果打开后发现DEM是WGS84经纬度而shp是CGCS2000高斯投影直接做cutline裁剪可能会出现错位轻则几十米重则边界完全对不上。所以在做任何计算前我都习惯分别查看两者的空间参考而不是相信文件名上的“保山市”三个字。这里有一个容易误判的点保山市DEM.tif可能直接采用WGS84经纬度存储或者用了UTM投影。经纬度坐标系的像元尺寸是度数30米数据在纬度25度附近经度方向一个像元对应的地面距离约28米左右这和“30米”有一点偏差但仍在可接受范围。如果要做汇水面积、坡长因子这样对距离敏感的分析先统一到投影坐标系更稳妥。3.2 从prj文件反查投影信息命令只有一行cat 保山市范围.prj输出是一段WKT文本。如果文本里出现PROJCS字段说明shp已经是投影坐标系如果只有GEOGCS说明是经纬度坐标系。常见写法是WGS_1984_UTM_Zone_47N中央经线99°E正好覆盖保山所在经度范围。有了这个信息后面gdalwarp的-t_srs参数就能直接复用。如果用QGIS打开shp属性窗口的“信息”标签页也能看到同样内容不需要额外工具。3.3 用gdalwarp重投影到UTM 47N并裁剪保山市经度大致在98.5°E到100.5°E之间UTM分区落在47N带。这个带号不是随便选的算一下保山城区经度99.2°E加上180度除以6再向下取整再1就得到47。只要你只做坡度分析经纬度坐标也能用gdaldem内部会按经纬度自动处理但结果单位不是米。如果要量算面积、距离或者叠加道路和房屋矢量建议先转到UTM。gdalwarp -t_srs EPSG:32647 -r bilinear \ -cutline 保山市范围.shp -crop_to_cutline -dstnodata -9999 \ 保山市DEM.tif 保山市DEM_utm47_clip.tif其中-t_srs指定目标坐标系EPSG:32647也就是WGS 84 / UTM zone 47N-r bilinear是双线性重采样适合高程这样的连续表面最近邻法会出现锯齿-cutline连同-crop_to_cutline一起让输出范围严格对齐shp边界-dstnodata -9999把裁剪后边缘的无数据区域统一填成-9999避免后续坡度计算时出现随机极值。如果你只想快速裁剪不改变坐标系用gdal_translate更快gdal_translate -cutline 保山市范围.shp -crop_to_cutline \ 保山市DEM.tif 保山市DEM_clip.tif这个命令不做重采样速度比gdalwarp快但要求DEM和shp已经处于同一坐标系。两者对比可以看下面表格。命令是否重投影是否重采样适用场景gdal_translate否否快速裁剪已有数据gdalwarp是是投影后裁剪一步到位ogr2ogr对矢量否只转换shp坐标系如果解压后的DEM是分幅文件比如保山市范围内有好几个tif可以写循环批量重投影for f in 保山市分幅_*.tif; do gdalwarp -t_srs EPSG:32647 -r bilinear $f ${f%.tif}_utm47.tif done${f%.tif}是bash中的变量替换去掉扩展名后加_utm47.tif。分幅数据的注意点是相邻幅之间要有重叠区域否则拼接时会出现接缝错位。这种情况建议先用gdalbuildvrt生成虚拟栅格再统一处理gdalbuildvrt 保山市_dem.vrt 分幅_*.tif gdalwarp -t_srs EPSG:32647 -r bilinear -cutline 保山市范围.shp \ -crop_to_cutline 保山市_dem.vrt 保山市DEM_final.tif提示如果gdalwarp报错说cutline和栅格坐标系不匹配先把两个文件分别用ogrinfo和gdalinfo确认空间参考再决定是先用gdal_translate裁剪还是先转shp坐标系。4. 坡度、坡向与山体阴影从保山DEM提取地形因子4.1 为什么坡度坡向要先于等高线生成等高线只是DEM的可视化衍生品真正参与规划计算的是坡度和坡向。保山地区大雨集中在夏季大于25度的斜坡在短时强降雨条件下容易发生浅层滑坡。做建设用地适宜性评价时通常先把坡度分成5度、5-15度、15-35度、35度四类再与土地利用现状叠加。坡向则决定日晒和水分蒸发光伏选址优先南坡茶园种植更偏东坡和东南坡。所以原始DEM到手后我一般直接算坡度而不是先画等高线。4.2 用gdaldem生成坡度栅格如果前面已经重投影到UTM命令很简洁gdaldem slope 保山市DEM_utm47_clip.tif 保山市坡度量.tif -p -s 1.0-p表示输出坡度单位是百分数默认是度-s是水平和垂直比例因子UTM投影下水平和垂直单位都是米所以设为1.0。如果你的DEM还是经纬度坐标必须加-s 111120来修正一个纬度对应的水平距离否则坡度值会明显偏大。运行后可以用QGIS加载坡度量.tif用“处理工具箱→坡度”再生成一份度数制坡度两个结果对比看是否存在系统性偏移。这里要多说一句-p输出的是百分数而不是度。100%对应45度。不同部门习惯不同国土空间规划里常用度数林草项目里常写百分数导数据时一定要确认对方要哪种。4.3 坡向与山体阴影的组合判断坡向和山体阴影有助于快速定位滑坡体和深切沟谷。三条命令一次跑完gdaldem aspect 保山市DEM_utm47_clip.tif 保山市坡向.tif gdaldem hillshade 保山市DEM_utm47_clip.tif 保山市山体阴影.tif -az 315 -alt 45 gdaldem TRI 保山市DEM_utm47_clip.tif 保山市地形起伏度.tifaspect输出的是0到360度方位角正北为0度顺时针方向。hillshade的-az 315是把光源放在西北方向-alt 45是太阳高度角45度这样渲染出的阴影最能突出山脊和冲沟的层次。TRI是地形位置指数反映每个像元与周围邻域的高差能快速圈出切割强烈的破碎地形区。命令输出内容常用参数gdaldem slope坡度-p 百分制-s 水平比例gdaldem aspect坡向无特别参数gdaldem hillshade山体阴影-az 方位角-alt 高度角gdaldem TRI地形起伏度默认邻域窗口即可4.4 用Python统计各级坡度面积栅格计算完成后最想知道的往往是“保山有多少平方公里是缓坡”。用Rasterio加NumPy可以快速统计下面是可直接跑的脚本import rasterio import numpy as np with rasterio.open(保山市坡度量.tif) as src: slope src.read(1) profile src.profile nodata profile.get(nodata, -9999) slope np.where(slope nodata, np.nan, slope) bins [0, 5, 15, 35, 90] labels [0-5度, 5-15度, 15-35度, 35度] for i in range(len(bins) - 1): mask (slope bins[i]) (slope bins[i 1]) count np.sum(mask) area_km2 count * 30 * 30 / 1e6 print(f{labels[i]}: {area_km2:.2f} km²)这里读取坡度tif后先把NoData像素替换成nan不参与区间统计。bins数组用左闭右开的方式划分区间最后一项90足够容纳坡度上限。area_km2的计算假设每个像元是30米×30米如果前面用了其他分辨率改30这个数字即可。脚本输出的是各级坡度面积直接可以作为专题图表的底数。注意如果DEM没有被重投影而直接用来算面积经度方向一个像元在地面的实际宽度随纬度变化不能用30×30计算这也是前面强调先转UTM的原因。5. 用保山市DEM生成等高线并输出为shp5.1 用gdal_contour生成矢量等高线等高线生成相对靠后因为它的用途偏展示。20米间距的等高线能较好表达保山的高差既不会太密也不会太疏。命令如下gdal_contour -i 20 -a ELEV -nln 保山市等高线 \ 保山市DEM_utm47_clip.tif 保山市等高线.shp-i 20表示每20米生成一条-a ELEV指定等高线属性字段名方便后续筛选-nln是图层名。生成后可以用ogrinfo确认属性ogrinfo 保山市等高线.shp -al -so看到ELEV字段的最小值和最大值就可以做渲染和注记。如果原始DEM边缘有NoData生成的等高线会在边界产生闭合小环这是很多第一次接触的人被吓到的地方。5.2 等高线边缘异常的修复边缘异常环通常表现为半径几十米的小圈集中在DEM和shp的交界处。修复方法是在生成前先对DEM做一次NoData统一并把shp边界向内收缩一个像元gdalwarp -t_srs EPSG:32647 -r bilinear \ -cutline 保山市范围.shp -crop_to_cutline -dstnodata -9999 \ 保山市DEM_utm47_clip.tif 保山市DEM_edge.tif gdal_contour -i 20 -a ELEV -nln 保山市等高线 \ 保山市DEM_edge.tif 保山市等高线_clean.shp如果收缩后用仍出现碎环多半是DEM内部存在局部凹陷先用第4章的填洼工具处理后再生成。保山市西部高黎贡山区常有陡崖相邻像元间高差过大生成时会沿陡崖边出现密集短线这属于正常地形表达不必强行删除。真正需要检查的是那些位于河谷底部、带着异常闭合趋势的小环它们往往是NoData或填洼不彻底造成的。最后再用ogr2ogr把等高线转成需要的坐标系比如与房产边界叠加时转成CGCS2000ogr2ogr -t_srs EPSG:4490 保山市等高线_cgcs2000.shp 保山市等高线_clean.shpEPSG:4490是CGCS2000地理坐标系单位是度适合与互联网底图配合。如果是为了三维展示直接保留UTM米制坐标更方便生成地形剖面。这里注意转坐标系后原本闭合的等高线可能因为投影变换精度出现微小未闭合用QGIS修复几何后即可。本文还有配套的精品资源点击获取