首页 / 资讯中心 / 文章详情

昆明30米DEM数据实操指南:地形分析、坡度计算与边界裁剪全流程

昆明30米DEM数据实操指南:地形分析、坡度计算与边界裁剪全流程 ★ FEATURED ARTICLE
简介云南省昆明市30米分辨率DEM数字高程数据是面向GIS学习者与城乡规划、环境研究人员的开源地形数据集。数据覆盖昆明市及周边部分区域可支撑地形剖面分析、水文模拟、城建选址等场景适合需要中等精度高程信息的中级用户直接导入ArcGIS或QGIS使用。压缩包内含12个文件核心是昆明市DEM.tif高程栅格另有昆明市范围.shp矢量边界及配套的dbf属性、prj投影、tfw空间配准与sbn/sbx索引文件共约70.94MB完整满足地理配准、裁剪与制图需求。已有2181人学习下载在同类数据集中具备一定参考度。通过该包可同时获得数字高程模型与行政边界数据省去单独下载和坐标对齐的麻烦直接用于坡度坡向提取、等高线生成、可视域分析等工作是开展昆明地区空间分析的实用基础数据。1. 昆明30米DEM加shp边界一套数据背后能榨出多少价值做滇池流域或者昆明周边的项目时最愁的不是算法选型而是手头没有一套能直接进流程的基础地形数据。这套“云南省昆明市DEM数字高程数据30m含区域范围shp文件.zip”本质就是两样东西一张30米分辨率的数字高程模型栅格和一个限定行政区范围的shp矢量边界。展开来就是解压后你能拿到昆明市域的地表高程栅格数据配合边界文件做裁剪、统计、出图不用再满世界找底图。30米这个精度放在全国尺度看偏粗但放在昆明这种山地占比极高的城市恰恰是性价比之选。SRTM和ASTER的30米公开数据拼出来正好是这个精度做流域分析、选址评估、通视分析、坡度分级都够用再往上追求12米甚至1米数据量翻几倍来源却开始依赖商业采购或无人机航测。对绝大多数规划、水利、国土、交通前期的可行性研究来说这套数据是“打开就能干活”的那种。适合谁呢刚入行的GIS工程师、做场地分析的建筑师、写环评报告的技术人员还有需要快速出地形图的研究生。接下来我把这套数据的完整使用链路拆开讲从解压识别文件到坐标系检查再到坡度坡向、裁剪出图最后是几个我踩过的坑。2. 解压后的第一件事看清zip里到底装了什么2.1 文件组成你不是拿着一张tif就能开工zip包解压后典型的内容构成是一个或多张DEM栅格可能是.tif格式也可能直接是.dem或.img格式外加一个或多个shp文件及配套文件。很多人拿到压缩包后直接双击打开把.tif拽进ArcGIS就开始做分析这是最危险的操作。正确顺序是先建一个工作目录然后完整解压。zip解压最怕的是中文文件名乱码和目录层级丢失。Windows自带的解压工具对zip内的中文文件名支持不好解压出来要么是乱码要么文件干脆打不开win10下右键菜单里的“压缩为zip”和“全部解压缩”看起来方便但对带空间参考的栅格文件不友好。我一般用7-Zip或Bandizip解压选“解压到当前文件夹”而不是“解压到xxx\”避免多套一层目录。# 以Linux环境为例解压并查看内部结构 mkdir -p /data/kunming_dem cd /data/kunming_dem unzip 云南省昆明市DEM数字高程数据30m含区域范围shp文件.zip # 查看解压后的文件结构 find . -type f | sort # 查看shp配套文件是否齐全shp的完整家族成员 ls -la *.shp *.shx *.dbf *.prj *.sbn *.sbx提示shp文件不是单一文件至少要.shp、.shx、.dbf三个文件同时存在才能被GIS软件正确识别。如果缺了.prj坐标系信息就会丢失缺了.shx图层能显示但无法做属性查询。这步的产出是确认自己手里有哪些数据。正常情况下应该有dem.tif或dem.img格式的高程栅格以及一个边界shp。如果只看到shp没有栅格说明压缩包里的DEM可能是分批压在不同的子目录中如果只看到栅格没有shp说明需要自己去下载行政区划边界后面第4章的裁剪方案就要换个思路。2.2 在ArcGIS Pro里打开头一次加载的坐标系陷阱ArcGIS Pro打开DEM和shp的路径很直接目录窗格 → 文件夹连接 → 定位到解压目录 → 双击栅格图层。但加载顺序有讲究先拖shp再拖DEM或者反过来都会影响首屏显示效果。关键点是坐标系匹配。昆明所在的区域是UTM 47N或48N带EPSG代码是32647或32648同时国内很多共享数据用的是CGCS2000地理坐标系EPSG是4490。打开ArcGIS Pro后我建议先右键图层 → 属性 → 源看一下两个数据各自的空间参考。# 在ArcGIS Pro的Python窗口里快速检查坐标系比鼠标点按效率高一截 import arcpy # 替换为你的实际路径 dem_path rD:\kunming_dem\dem.tif shp_path rD:\kunming_dem\kunming_boundary.shp # 栅格数据集的空间参考 dem_sr arcpy.Describe(dem_path).spatialReference print(DEM坐标系:, dem_sr.name, EPSG:, dem_sr.factoryCode) # 矢量数据的空间参考 shp_sr arcpy.Describe(shp_path).spatialReference print(shp坐标系:, shp_sr.name, EPSG:, shp_sr.factoryCode)判断标准很简单DEM和shp如果坐标系不一致先做投影转换统一再做任何分析。常见情况是DEM自带WGS84地理坐标系经纬度而shp是国家2000或西安80投影坐标系米。这种不匹配直接做裁剪结果是裁出来的范围偏到西伯利亚去直接做坡度分析算出来的坡度值全部不可信。2.3 QGIS作为免费替代路径如果不能装ArcGISQGIS 3.x完全可以走通全流程。加载方式和ArcGIS一样左边浏览器面板找到矢量/栅格拖进画布双击图层查看坐标系信息。QGIS里有一个ArcGIS没有的便利点临时图层和永久导出分离。预览裁剪效果可以直接在菜单栏“栅格”→“提取”→“按掩膜提取”里跑它会自动生成临时图层确定参数没问题后再勾选“保存到文件”避免反复试错时产生一堆中间文件。# QGIS Python控制台里做同样的事情 from qgis.core import QgsRasterLayer, QgsVectorLayer dem_path rD:/kunming_dem/dem.tif shp_path rD:/kunming_dem/kunming_boundary.shp dem_layer QgsRasterLayer(dem_path, Kunming_DEM) shp_layer QgsVectorLayer(shp_path, Kunming_Boundary, ogr) print(DEM加载状态:, dem_layer.isValid()) print(shp加载状态:, shp_layer.isValid()) print(DEM CRS:, dem_layer.crs().authid()) print(shp CRS:, shp_layer.crs().authid())2.4 数据质量检查清单加载后先看四样东西加载完成后别急着分析花两三分钟检查四件事。第一像元统计信息。右键图层 → 属性 → 源数据看像元大小是否真的是30米左右行列数合理不合理。如果像元大小是0.0002777这种说明是经纬度坐标下的度数分辨率实际地面分辨率漂移不定必须重投影后再用。第二高程值范围。昆明的海拔大致在1500米到4200米之间如果统计后发现最小值是-32768或者最大值异常比如几千万说明数据带NoData值或者压根是16位整型深度不够导致溢出。用符号化方式看一眼通常能立刻发现黑洞区域。第三边界匹配度。把shp叠加在DEM上放大h后检查边缘如果shp明显超出DEM范围说明边界数据比DEM新或者两者来源不一致后续裁剪会出现大片NoData区域。第四文件格式。.tif比.img通用性更好.dem后缀不一定能双击打开很多GIS软件不认裸dem需要借助GDAL转换。# 用gdalinfo检查栅格元数据这个命令在任何平台都好使 gdalinfo dem.tif | head -30 # 输出会显示大小、像元尺寸、坐标系、像元统计信息、NoData值 # 重点关注 # Size is 2362, 2332 — 行列数 # Pixel Size (30.000000000000000, -30.000000000000000) — 像元尺寸 # NoData Value -9999 — NoData值 # Minimum-32768, Maximum32767 — 高程范围异常则需深究3. 提取地形因子坡度、坡向、山体阴影、等高线的参数与误用3.1 为什么30米数据的坡度分析容易翻车DEM到手后最常见的第一个操作是算坡度。但直接用原始DEM算坡度结果往往会让人困惑昆明城区看起来是平地算出来的坡度却有十几度。问题出在数据源。国内能免费下载到的30米DEM大多源自ASTER GDEM或SRTM这两个数据在山区城市存在大量噪声尤其植被茂密的区域高程值跳跃很厉害。直接算坡度会把这种“麻点”放大成伪地形。标准做法是先做低通滤波或重采样但重采样的方法有讲究。不要用最邻近法它会让数据变得更块状建议用双线性或三次卷积法把DEM重采样到同一个分辨率再做坡度计算。# 在ArcGIS Pro中使用“焦点统计”做平滑等效于低通滤波 import arcpy from arcpy.sa import * arcpy.env.workspace rD:\kunming_dem arcpy.env.overwriteOutput True # 用3x3窗口的均值滤波抹掉高频噪声 dem_smooth FocalStatistics(dem.tif, Rectangle 3 3 CELL, MEAN) dem_smooth.save(dem_smooth.tif) # 在平滑后的数据上计算坡度输出单位是度 slope_out Slope(dem_smooth, DEGREE, 1) slope_out.save(kunming_slope_deg.tif) # 计算坡向注意坡向输出是0-360度-1表示平地 aspect_out Aspect(dem_smooth) aspect_out.save(kunming_aspect.tif)这里有个参数值得细说Slope工具的第三个参数是z-factor垂直方向比例因子。如果数据是地理坐标系经纬度z-factor必须设置成0.00001左右才能把水平方向度数和垂直方向米的单位统一如果数据已经投影成UTM单位为米z-factor保持1即可。很多人在ArcGIS里算出来坡度全是90度就是忘了在高纬度地区设置这个参数。3.2 等高线生成间距怎么定昆明这种高原山地城市生成等高线间距定多少取决于用途。做宏观的地形起伏展示50米间距比较合适做建设用地适宜性评价20米间距够用做详细规划至少需要10米或5米但30米分辨率的DEM生成5米等高线已经超过数据本身的精度边界了生成的曲线会出现大量锯齿。等高线提取是对DEM做“轮廓”分析的经典操作。ArcGIS里用Contour工具核心参数有两个contour interval和base contour。base contour设成50的倍数后续标注会整齐很多。# 提取间距50米的等高线 contour_out arcpy.sa.Contour(dem_smooth.tif, kunming_contour_50m.shp, 50, 0) print(等高线生成完成要素数量:, arcpy.GetCount_management(kunming_contour_50m.shp))等高线生成后我一般会做一步简化把线要素的平滑度调高ArcGIS里是Simplify Line工具选择“点到移除”算法去掉那些明显由DEM噪声引起的锯齿状曲折。这一步是为了出图和后续叠加分析的视觉质量。需要说明的是这一步一定要在做地形渲染之前完成否则等高线和渲染结果对不上会非常尴尬。3.3 山体阴影与地形渲染让图看起来专业山体阴影Hillshade是地形图中最出彩的部分也是ArcGIS的Hillshade工具一行代码就能出效果。两个参数最影响成图质量太阳方位角azimuth和太阳高度角altitude。默认值是315度和45度看起来中规中矩但放在昆明这种低纬度城市太阳高度角的真实感觉偏高渲染出来的山体阴影对比偏弱。经验值是方位角315不变高度角调到35度到40度之间阴影更长、山体立体感更强。如果做的是面向公众的展示图这个值能让整体视觉立刻“亮起来”。# 山体阴影计算 hillshade_out Hillshade(dem_smooth.tif, 315, 35) hillshade_out.save(kunming_hillshade.tif) # 把山体阴影和高程渲染叠在一起符号系统里选“拉伸”“山体阴影”混合 # 注意叠加顺序一定是DEM高程渲染在下hillshade在上且透明度设成50-60%透明度设置是出图质量的细节。直接把hillshade设置成100%不透明会把高程色彩完全遮住图面变成黑白灰设置成30%透明度则完全盖不住高程信息。50%是一个通用折中值但我一般会先用40%试一张再根据打印设备的颜色特性微调。3.4 水文分析前的填洼步骤30米数据必做做流域提取、河网分析时必须先填洼。这是DEM数据处理中公认的“不填洼就出废图”的例子。昆明喀斯特地貌分布较广溶蚀洼地在DEM上表现为一个个封闭的低点不填掉这些洼地水流会原地打转河网提取结果碎成一片。# 填洼 dem_fill Fill(dem_smooth, zhang_jie_2015) dem_fill.save(dem_fill.tif) # 流向计算 flow_dir FlowDirection(dem_fill) flow_dir.save(flow_dir.tif) # 流量累计 flow_acc FlowAccumulation(flow_dir) flow_acc.save(flow_acc.tif)需要提醒的是填洼阈值默认是“填充到最近的非洼地像元”对喀斯特地区的真实地下河、落水洞系统这种填洼是粗暴的。如果做的是喀斯特水文专题切不能用开箱即用的Fill需要结合区域水文地质认识到数据本身的这种局限必要时要人工干预洼地提取阈值和填洼范围。4. 用shp边界裁剪DEM从“昆明周边”到“昆明市域”4.1 不裁剪直接做统计的后果很多人加载DEM和shp后看一眼觉得“图已经框在昆明范围里了”就直接在ArcGIS里做区域统计、坡度分级、面积统计。这个操作会导致统计结果覆盖的是全图矩形范围昆明以东、以南的曲靖、玉溪、楚雄的地形都被算进去了数据就废了。ArcGIS里图层的“显示范围”和“分析范围”是两个概念。显示上shp只框出昆明但栅格数据本身是矩形分析工具默认沿用栅格的完整范围。所以必须用shp边界做物理裁剪生成一个新的矩形缩小版的栅格。4.2 按掩膜提取一步操作里的两个参数陷阱ArcGIS Pro中裁剪栅格用“按掩膜提取”Extract by Mask设置如下输入栅格选dem输入掩膜数据选shp输出路径选新文件。# 按掩膜提取以shp为边界裁剪DEM out_dem_clip arcpy.sa.ExtractByMask(dem_smooth.tif, kunming_boundary.shp) out_dem_clip.save(kunming_dem_clip.tif) # 检查裁剪范围是否准确 desc arcpy.Describe(kunming_dem_clip.tif) print(裁剪后范围:, desc.extent.XMin, desc.extent.YMin, desc.extent.XMax, desc.extent.YMax) print(像元大小:, desc.meanCellWidth)一个参数是“NoData值”。裁剪后shp边界外的区域会填充NoData如果后续做坡度分析这些NoData会被当作“无数据”处理统计结果没问题但如果做镶嵌或转成ASCIINoData值必须明确指定否则后续程序读到-9999会把它当成真实高程参与计算。第二个参数是“裁剪范围是否包含shp边缘”。shp边界一般不齐整有的区域边界正好压着DEM像元边界有的半压着按掩膜提取会自动用最邻近像元覆盖边缘会出现“锯齿”状这是栅格数据的固有属性不要试图用平滑处理消除它。另一个常见的混淆操作是“栅格裁剪Clip”和“按掩膜提取”。ArcGIS里Clip是矩形裁剪只能裁正矩形范围ExtractByMask可以按任意多边形裁剪。不要用Clip选shp边界去裁那样裁出来仍然是矩形只是矩形缩小了shp边界范围内的统计问题依旧存在。4.3 shp范围小于DEM范围时怎么处理昆明市的shp边界如果是从某资源网站下载的“市界”而非“市域”可能会出现边界只覆盖主城区而不包含下辖县区的情况。此时按掩膜提取出来的DEM虽然范围准但面积统计会明显偏小。这种情况有两个处理思路。一是核对shp的属性表看“姓名”字段或“行政区代码”字段是否涵盖完整比如昆明市含五华、盘龙、官渡、西山、东川、呈贡、晋宁、富民、宜良、石林、嵩明、禄劝、寻甸等区县如果缺了这是数据的行政边界不完整不是操作失误。二是直接用“按属性选择”抽出完整的多边形要素重新导出shp。# 检查行政区域代码是否齐全 import arcpy with arcpy.da.SearchCursor(kunming_boundary.shp, [NAME, ADCODE99]) as cursor: for row in cursor: print(row[0], row[1])一条更省事的路径是如果只是做坡度、坡向、山体阴影这类逐像元运算其实可以不做物理裁剪直接在栅格计算时使用ExtractByMask作为掩膜环境。ArcGIS的“地理处理选项”里可以设置全局掩膜Mask所有后续工具自动只用掩膜范围内的像元计算减少中间文件产生。这是我常用的做法尤其做多因子叠加分析时能省一半磁盘空间。5. 昆明DEM数据的真实边界与避坑指南5.1 坑一shp是“区域范围”不是“行政边界”现象拿到压缩包后用shp一裁剪发现DEM面积比想象的小很多有些区县没了。原因标题里写的是“区域范围shp”很多数据集打包的是研究区范围比如滇池流域范围、昆明都市圈范围而不是行政区划边界。两者差异巨大滇池流域只占昆明市的一部分都市圈范围通常又比行政区大。解决先打开shp属性表查看字段里有没有行政区代码或地名确认这个范围是“市域”“流域”还是“某种规划区”再决定是否直接用它做裁剪。如果是流域边界做水文分析正好对口如果是行政范围做规划数据统计正好对口。5.2 坑二源栅格是经纬度坐标系算出来的距离全错现象用“欧氏距离”或者“缓冲区”工具算出来的距离值明显不对比如滇池湖岸线的缓冲区半径应该是500米显示出来的却是0.5。原因数据本身是WGS84经纬度坐标系单位是度工具按度计算距离把500米当作0.5度。解决在任何距离相关分析前先把DEM重投影到UTM 47NEPSG:32647或CGCS2000 / 3-degree Gauss-Kruger zoneEPSG:4521等。重投影方法用“投影栅格”工具重采样选双线性像元大小保持30米。# 重投影栅格从地理坐标到投影坐标 out_sr arcpy.SpatialReference(32647) # WGS 84 / UTM zone 47N dem_proj arcpy.ProjectRaster(dem.tif, dem_utm47.tif, out_sr, BILINEAR, 30) print(重投影完成)5.3 坑三NoData值没有统一多张DEM镶嵌后出现黑洞现象把多张昆明周边DEM镶嵌在一起拼接缝处出现一条条黑色或白色的带子。原因每张DEM的NoData值设定不一样有的用了-9999有的用了0有的用了-32768。镶嵌时没设置“NoData值统一”导致本应是空值的像元被当成有效高程参与计算。解决统一NoData值是在镶嵌前必须处理的事。# 用GDAL统一NoData值 gdal_translate -a_nodata -9999 -of GTiff dem_01.tif dem_01_fixed.tif gdal_translate -a_nodata -9999 -of GTiff dem_02.tif dem_02_fixed.tif # 然后做镶嵌 gdal_merge.py -o kunming_merge.tif -n -9999 dem_01_fixed.tif dem_02_fixed.tif5.4 坑四用30米DEM做淹没分析精度严重不足现象做滇池周边淹没模拟算出来淹没范围边界粗糙、出现大量锯齿状伪边界与实际不符。原因30米分辨率只适合做宏观趋势判断做精确到街道尺度的淹没分析需要至少10米分辨率且要考虑建筑物对水流的阻隔效应单纯DEM无法表达。解决认清DEM的能力边界。30米数据适合做流域尺度的相对高差分析、径流路径模拟、淹没风险的初步分级要精确到具体地物拿LiDAR点云生成1米DSM才是正确路径。这不是软件问题是数据源问题。5.5 坑五把DEM当地形底图直接出图山体阴影对比度不足现象出图后山体阴影效果灰蒙蒙的打印出来更加看不清。原因默认的45度高度角在低纬度地区导致阴影区域占比过大或过小ArcGIS的默认渲染拉伸方式百分比截断对山地数据不适用。解决调整山体阴影高度角到35度并在符号系统里设置“最小值-最大值拉伸”为自定义值比如把高程范围截断在5%-95%之间可以避免个别极高极低值把整体色彩范围撑爆。6. 让这套数据发挥真正价值融入项目工作流的三个进阶习惯6.1 先用DEM统一项目坐标系基线项目里所有数据统一坐标系的习惯养成比掌握任何工具都重要。拿到任何新数据第一件事就是检查坐标系然后统一到项目的标准坐标系。这套昆明30米DEM如果给到不同的项目组我会先确认各自项目的坐标基准避免项目中间环节自己重新投影。6.2 出图前必做的可视化增强常规的DEM出图渲染方式选“海拔带”配色颜色条一般选用蓝→绿→黄→棕→白的标准高程带但要结合昆明自身的高程分布调节色带范围。昆明平均海拔约1900米主流城区在1900-2100米如果色带按0-5000米均分城区会被分在同一个色带里层次完全出不来。手动把色带截断到1500-3200米范围城市建成区的地形起伏才清晰可见。这个习惯是我在一次汇报前被迫改图时学到的比任何教程都好用。6.3 归档输出给数据文件补一份元数据随手记录解压后的原始数据、裁剪后的中间数据、最终成果图分目录存放。在成果数据根目录下放一个txt或md文件记录数据来源、坐标系、分辨率、处理流程、处理日期。这个习惯帮我省了无数次“这是啥数据来着”的复盘时间。以后再看这套昆明DEM还能记起当时填洼用的什么方法为什么没有直接填。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站