ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

临沧30m DEM与边界shp的ArcGIS裁剪与分析实操指南

临沧30m DEM与边界shp的ArcGIS裁剪与分析实操指南 简介云南省临沧市30米分辨率DEM数字高程数据包涵盖临沧市及周边部分区域为GIS学习者、科研人员及城市规划相关从业者提供可直接下载的基础地形数据。数据以GeoTIFF格式记录每个30米×30米栅格单元的高程值并随附临沧市范围Shapefile矢量边界便于在ArcGIS、QGIS等软件中直接进行裁剪、叠加、制图与空间分析。基于这套数据可快速完成坡度坡向提取、等高线生成、流域汇水分析、洪水淹没模拟、可视域分析等典型地形分析任务同时它也是高校地理信息课程案例教学、毕业设计以及GIS入门实操的理想素材。压缩包共12个文件、87.69MB除核心.tif高程影像外还包含.shp/.dbf/.shx等矢量边界及其属性索引、.prj坐标参考、.tfw配准参数和多个.xml元数据文件结构完整能够直观体现DEM与Shapefile等GIS多格式协同工作的方式。已有330人学习适合希望理解DEM数据组织、文件构成及空间分析方法的学习者快速上手。1. 一个 zip 包解决临沧地形底图问题30m DEM 与边界 shp 的实际用法临沧市横断山系南延怒山、老别山、邦马山交错澜沧江与怒江穿境而过最低点和最高点高差能到两千多米。这种地形条件下做国土调查、林业区划、地质灾害评估、水利汇水分析没有一张像样的数字高程底图很多工作根本推不下去。这个数据包给的就是一张 30m 分辨率的 DEM 栅格外加临沧市范围的面状 shp 文件解压以后栅格负责地形起伏shp 负责把人限定在行政边界里做裁剪和统计。对常年跑 ArcGIS 的从业者来说这相当于把过去要花半天找数据、勾边界的活一次干完适合做区域级地形分析、出坡度坡向图、提等高线以及做初步的水文分析。这篇就按拆包、裁剪、分析、避坑的顺序把我平时处理这类数据包的完整流程和参数习惯讲清楚。2. 30m DEM 的精度边界与数据包内部结构先看清再动手2.1 30m 这个分辨率能干什么、不能干什么先说结论30m 分辨率的 DEM 在同级别数据里属于性价比最稳的一档向下能覆盖县域、市域和流域尺度向上不会像 90m 那样把沟谷和山脊抹得没法看。临沧这种地形破碎度高的地方30m 栅格大致能分辨出百米量级的地形单元乡镇级的汇水区划分、山体阴影渲染、坡度分级统计都能得到看起来合理的数值分布。你要是拿它去做单条冲沟的断面提取或者宅基地尺度的平整评估栅格边长三十米一个像元内高差可能已经被平均掉了精细地形细节丢了就是丢了靠插值找不回来。我常用一个土办法判断精度够不够出图比例尺定在 1:5 万到 1:10 万之间30m 数据画出来线划不跳、等值线不抖一旦切到 1:1 万甚至更大的比例尺等高线就会出现明显锯齿感这就不适合继续用了。热词里常有人问 5 米精度高程怎么下实际项目中如果需要 5 米级数据通常是用无人机仿地飞行或高精度 LiDAR 点云派生 DSM 再生成 DEM 的路线家门口或者小流域的精细项目才值得这样干。论全市铺开30m 既能控制数据量又不会让存储和分析时间翻倍。2.2 数据包里通常装着什么栅格文件与边界 shp 的配套关系这类数据包解压后的核心组成一般是一个 tif 格式的 DEM 栅格和一个 shp 格式的行政区边界有些还会附带 prj 投影文件、tfw 世界文件或者元数据说明。栅格部分存储的是高程值常见的单位是米数据类型可能有 16 位整型或 32 位浮点这决定了后续做坡度填洼时要不要做数值预处理。边界 shp 里至少会带一个面要素属性表里通常有县区名称或行政区代码做按县域分割分析时会非常方便。拿到数据包以后我习惯先做三件事顺序从不乱。第一在 ArcGIS 里分别加载 tif 和 shp打开图层属性看坐标系是否一致第二用识别工具点几个像元确认 DEM 高程值落在正常陆地高程区间而不是出现夸张的 0 值或负的离谱值第三看一眼统计直方图确认数据没有在打包传输过程中被压坏。很多新手第一次做裁剪直接拿边界工具去切裁完出来一片黑十有八九是跳过这三步坐标系和像元深度出了问题。栅格数据的坐标系是个容易被忽视的隐性地雷。临沧市范围 30m 数据常见来源以 WGS84 经纬度坐标存储也就是 EPSG:4326这种坐标系下像元尺寸虽然也叫 30m实际是 0.00027 度左右的地里弧度做面积和坡度计算需要动态投影否则会因纬度不同产生形变。如果边界 shp 反而是西安 80 或 CGCS2000 投影坐标那裁剪之前就得多做一步数据框投影转换不然裁出来图形范围完整落到地图上是错位的。2.3 DSM、DEM 与高程基准的基本概念选数据的时候经常能碰见 DSM 和 DEM 这两个词被混用。DSM 是地表模型把树冠、屋顶、桥梁全部算进高度DEM 是地面模型反映的是裸地表。30m 这类中等分辨率数据多来源于卫星雷达或光学立体像对经过处理后的 DEM 基本接近地表趋势但在陡峭植被茂密区DSM 生成 DEM 时有时会残留部分植被高度误差。这个误差对宏观填洼和水系提取影响有限做工程土方量估算时就别指望它精细到厘米级那是 LiDAR 的活。高程基准方面国内项目按规范应当使用 1985 国家高程基准但网上广泛传播的全球 DEM 数据多基于 EGM96 或 WGS84 椭球高在临沧这种高海拔山区基准面差异可能带来几十米的系统偏差。日常做坡度、坡向、山体阴影这类相对地形分析不受影响需要绝对高程值去套防洪堤、道路纵坡设计时我通常会选几个已知高程的控制点做差值校正以实测点为基准对 DEM 做整体平移这是处理任何免费 DEM 都绕不开的一步。3. 用面图层 shp 裁剪 DEMArcGIS 掩膜提取操作与脚本批处理3.1 ArcGIS 中按掩膜提取与栅格裁剪工具的差别ARCMAP 里处理面图层裁剪 DEM工具箱里有两个极其相似的工具一个叫“按掩膜提取”另一个叫“裁剪”。两者都能得到被面范围限制的栅格结果但内部机制有本质区别。“按掩膜提取”是基于像元级的掩膜操作任何落在面边界内的像元被保留边界外变成 NoData边缘像元会严格按照面形状进行锯齿状裁切而“裁剪”工具在栅格分析许可下能用更灵活的方式但在老版 ARCMAP 里它受环境设置影响更大容易把输出范围设置成规则的矩形包络线导致边界外仍然带着一大片黑块。我一般做主分析前的底图整理时优先用“按掩膜提取”路径在【Spatial Analyst 工具 → 提取分析 → 按掩膜提取】。输入栅格选 DEM输入掩膜数据选临沧市边界 shp输出路径选一个干净的 gdb 或 tif 路径。这里有两个关键参数值得细看一个是“像元大小”默认跟随输入栅格保持 30m 不动即可如果你为了加速处理填了 90后续提取等高线时细节会明显变钝另一个是“输出范围”在环境设置里建议直接指定为边界要素的相同范围避免计算范围自动扩展造成多余的背景像元。3.2 先做投影与范围一致性检查再谈裁剪很多老手裁完发现结果整体漂移西南方向几百米问题不在裁剪工具本身而在输入数据的坐标系错位。处理方法其实简单先在 ArcToolbox 里用【数据管理工具 → 投影和变换 → 栅格投影】把 DEM 转换到与 shp 相同的投影坐标系常见做法是统一转到 CGCS2000 / 3-degree Gauss-Kruger zone 或 UTM 47N。临沧经度大约在 98°E 到 100°E 之间UTM 分区落在 47 区动态投影虽然能减轻显示误差但直接用投影转换生成一份新数据再做掩膜分析结果才算真正稳定。投影转换后会注意到一个现象经纬度坐标系下 DEM 的像元尺寸在投影后被重采样成新网格每次重采样都会引入轻微的高程插值误差。想把这个影响压到最低重采样技术建议选“双线性”它比最邻近法平顺比三次卷积法计算量小对 30m 高程模型来说足够用。如果是做水文分析不建议再用最邻近法去强制保留原始像元值因为填洼工具处理锯齿状边界时会制造更多伪洼地。3.3 用 Python 脚本批量裁剪arcpy 版本单次裁剪用工具箱点几下没问题但一次性按县级行政区拆临沧市域时一个个点效率太低。我常用的办法是写一段 arcpy 脚本循环遍历 shp 面要素为每个县单独裁一份 DEM。示例代码import arcpy # 环境设置 arcpy.env.workspace rD:\Lincang\data arcpy.env.overwriteOutput True dem rD:\Lincang\data\lincang_dem_30m.tif boundary rD:\Lincang\data\lincang_boundary.shp # 提取面要素属性里的县名 fields [FID, CITY_NAME] out_dir rD:\Lincang\output with arcpy.da.SearchCursor(boundary, fields) as cursor: for row in cursor: county_name row[1] out_tif out_dir \\ county_name _dem.tif # 用属性字段构造临时要素图层再用按掩膜提取 temp_layer temp_ county_name arcpy.management.MakeFeatureLayer(boundary, temp_layer, CITY_NAME {}.format(county_name)) arcpy.sa.ExtractByMask(dem, temp_layer, out_tif) # 清理临时图层 arcpy.management.Delete(temp_layer) print(county_name 裁剪完成)逻辑说明先通过 SearchCursor 读取边界 shp 属性表拿到每个县区名称。然后用 MakeFeatureLayer 按属性表达式筛选出单一面要素传到 ExtractByMask 里作为掩膜输出路径以县名命名。这个写法避免用 Select 工具生成大量中间图层也防止直接传整个 shp 导致所有县被裁成同一份。注意 arcpy.sa 模块需要 Spatial Analyst 扩展许可脚本第一行后建议补一条 arcpy.CheckOutExtension(Spatial) 的调用不然会报许可不足。输出路径尽量不要放中文或带空格的文件夹个别版本 gdb 在中文路径下会有无法写入的玄学问题英文路径最省心。3.4 BigEMap 或 Global Mapper 下载数据后的补充处理热词里常出现用 BigEMap 下载 5 米精度高程、再用 Global Mapper 14 处理的工作流。这种路线的产物实际经常是 DSM 或经过拼接的多幅高程瓦片需要先在 Global Mapper 里执行拼接、高程归一化和坐标系转换再导出成单一 tif 使用。Global Mapper 14 的汉化版有一个常用功能在 Analysis 菜单下可以生成具有可视化的山体阴影叠加坡度晕渲图看起来比 ArcMap 默认符号效果更专业。不过这类软件处理完成后务必检查输出高程值是否带有高程偏移我曾见过从第三方应用导出的高程在临沧边境区域整体抬高了约 30m原因就是基准切换时未勾选“应用 EGM96 转换”。遇到这种问题处理办法是在 Global Mapper 的投影设置中明确高程基准或者导出后再用控制点整体校正。4. 裁剪 DEM 常见问题排查黑边、偏移、负值与空洞4.1 裁剪结果出现大块黑色背景现象做完掩膜提取后图层显示一片黑完全看不到地形纹理只有边界边缘有零星颜色。原因分两类。第一类是显示符号化的问题栅格中边界外的 NoData 被默认渲染成黑色实际上数据无损。第二类是 DEM 背景值不是 NoData而是某个固定数值如 0 或 32767这类值被当成有效高程参与显示就会渲染成极端黑色或白色。解决第一类在图层属性符号化里把“显示背景值”勾选为 NoData 并设为无色即可恢复正常显示。第二类需要先用【栅格计算器】把背景值重映射为 NoData例如用 SetNull 工具把等于 0 的像元置空。判断属于哪一类很简单用识别工具点黑色区域看属性值是多少如果显示 NoData 就属于第一类如果显示数值则属于第二类。顺带提醒保存裁剪结果时尽量使用 tif 格式它会正确记录 NoData 值老式 GRID 格式有时会丢失这一关键信息。4.2 裁剪出的区域与实际边界明显错位现象裁剪结果范围与临沧市行政边界套合不上有的区域偏西有的向东南移动看起来像边界贴图贴歪了。原因数据框开启动态投影后显示正常但 DEM 的地理坐标系与 shp 投影坐标系不匹配直接掩膜时按边界特征点计算导致空间参考错位。还有一种可能是 shp 文件本身精度不高早期来源的边界与实际海域或山地分界存在偏移。解决切除前先对 DEM 做投影转换。如果只能用经纬度坐标就在环境设置里将“输出坐标系”设为与 shp 一致让 ArcMap 在内存中完成栅格重投影后再掩膜。后续验证方法是在 ArcMap 中叠加高分辨率影像或谷歌卫星图沿边界线对比山脊线位置如果仍然整体偏移几十米需要手动用空间校正工具做少量配准修正这在县级工程里已经算合格的精度。4.3 高程值出现负数或深坑状异常现象填洼流程跑下来DEM 中临沧部分河谷区出现大范围负值像是突然挖出海底地形或用 3D 分析视角观察澜沧江沿岸存在大量不自然的深坑锯齿。原因全球 DEM 在陡峭峡谷、植被异常茂密的区域常产生高程反演误差尤其是 V 型河谷底部雷达信号受地形遮挡后会生成错误测高结果。这类深坑在裸露DEM上看不明显但填洼时会被当作洼地无限填充生成严重失真的汇水网络。解决表面上看是填洼问题根源在原始 DEM。裁剪完成后先检查直方图如果最低值远低于该区域理论最低海拔需要人工判读并处理局部异常值。我通常用焦点统计计算 3x3 邻域中值再用条件函数把超过平均值三倍标准差的像元替换为中值。做完这步再进行填洼水文分析结果才不会出现顺着河谷一路连通的假河道。如果项目精度要求高建议取舍甚而换用多源数据对该区域做镶嵌补全。4.4 行政区边界处数据空洞一片白现象shp 边界内部分区域没有高程值显示为白色空洞特别容易出现在临沧南汀河、怒江沿线低热河谷区域或者边界锐角拐弯处。原因原始 DEM 数据在下载、拼接时被手动做过去边框处理或者该流域在原始影像上本身就有信息缺失属于数据源空洞。边界裁剪只能裁剪数据不能补全缺失空洞因此被原样保留。解决第一优先级是检查下载来源看是否有同区域其他时间段的数据可以补空洞。第二优先级用栅格计算器结合条件判断对 NoData 区域执行平滑插值例如用反距离权重法或样条函数。需要注意补洞后的 DEM 空间连续性好看了但补洞区的高程属于推测值水文分析时在该区域提取的河流只能当作初步方向参考不能用于工程选址。遇到这种情况我会在成果报告里专门标注“数据空洞修复区域”防止下游环节被误导。5. 裁剪之后做什么坡度坡向分析、等高线提取与水文分析5.1 坡度坡向与 Z 因子参数临沧陡坡地形的实际取值拿到裁剪好的临沧 30m DEM最常用的一步是做坡度坡向分析。【Spatial Analyst 工具 → 表面分析 → 坡度】工具里有一个特别容易忽略的参数叫 Z factor用来指定高程单位与地面单位不一致时的垂直拉伸系数。临沧 DEM 如果保持 WGS84 经纬度坐标系水平方向的单位是度高程单位是米此时 Z factor 必须设为大约 111320否则算出来的坡度值全都严重偏差很多新手到这里翻车结果坡度分级图一出来全城几乎都是 60 度以上。正确做法是在坡度工具中设置 Z factor 111320或者更稳妥地在做坡度之前把 DEM 投影到 CGCS2000 高斯投影或 UTM让水平方向和垂直方向都以米为单位此时 Z factor 保持默认 1 即可。坡度输出结果默认单位是度分级标准参考临沧当地常见划分小于 8 度基本为缓坡坝区8 到 25 度为中等坡25 度以上属于陡坡40 度以上建议划入限制建设区或重点地灾防治区。如果需要计算坡向工具与坡度一致输出的是方位角度数0 度表示正北90 度表示正东山体阴影渲染时可以通过改变方位角模拟不同光照方向。5.2 等高线提取让 DEM 回到矢量线划的操作细节从 DEM 提取等高线是制作地形图底图的常规操作。使用【Spatial Analyst 工具 → 表面分析 → 等高线】工具时需要手动指定等间距。临沧市域整体高差大全图范围做等高线时等距通常选 100m生成的线划不至于密集成一片工程详查区域可以缩小范围后使用 20m 甚至 10m 间距。参数说明“等高线列表”参数如果为空则按等间距生成最小、最大高程依据为输入 DEM 的有效值范围。为了保证提取出的等高线平顺建议先对裁剪好的 DEM 执行一步 3x3 邻域低通滤波过滤掉单像元的粗糙噪声。这个操作会让峰点的高程值略微被压低但得到的图面线条在制图美学上干净很多这一点是我的血泪经验不滤波时画出来的等高线在陡崖处经常出现刺状毛边。5.3 水文分析三步走填洼、流向、累积流量临沧的水文分析通常是市域水资源配置或者山洪沟道识别时的前置工作。标准流程是【填洼】→【流向】→【流量累积】之后通过“栅格计算器”设置提取阈值把累积流量大于阈值的像元定义为河道。填洼工具的参数最重要Z limit 应设为合理高程值我一般先用 DEM 直方图确定河谷噪声幅度再设为 10 到 30m避免把真实地形起伏一并填平。流向工具选择 D8 单流向算法即可不需要用 D-infinity。流量累积结果像元值表示汇入该像元的栅格数量阈值设定要看成果用途全市尺度取 5000 到 10000提取出的是主干河流乡镇尺度取 1000 到 2000提取出的河网接近 1:5 万地形图的水系密度做小流域山洪分析时阈值再往下降但降到 100 以下时错误河道会增多人为干扰沟和梯田坎会被误判为水系。提取后的河道栅格再转成矢量线用平滑工具处理后就能叠加到坡度图上做综合出图。这一套流程跑通后临沧境内澜沧江与怒江主要支流的空间走向会与影像上的河谷位置高度一致也是验证裁剪质量的一个重要指标。6. 进阶技巧用 GDAL 脚本批量处理多个区域彻底告别逐一裁剪在 ArcGIS 里裁剪一个县级范围很简单但绝不代表在全市范围做分割、拼接、重投影时需要手动敲几十遍工具箱。业界更普遍的做法是装一个 Python 的 GDAL 环境利用 gdal.Warp 函数直接对栅格和矢量掩膜做裁剪一行代码完成 ArcGIS 里的三步操作跑几十个区域都稳定且可控。from osgeo import gdal, ogr dem_path rD:\Lincang\lincang_dem_30m.tif shp_path rD:\Lincang\lincang_boundary.shp # 面矢量作为 cutline # 定义输出参数 out_tif rD:\Lincang\output\lincang_cut.tif options gdal.WarpOptions( formatGTiff, cutlineDSNameshp_path, cropToCutlineTrue, targetAlignedPixelsTrue, dstNodata-9999 ) gdal.Warp(out_tif, dem_path, optionsoptions)参数说明cutlineDSName 用于指定作为裁剪参考的矢量边界文件cropToCutline 决定输出栅格范围是否贴着边界走如果设置为 False输出会保留规则矩形而边界外为 NoData视觉效果和一整块整幅图差不多。targetAlignedPixels 设为 True 时输出像元会与原始 DEM 对齐从多个相邻矢量区域分别裁剪后重新拼接时缺失缝隙更少。dstNodata 设一个不会与真实高程冲突的负值后续统计高程时可以用它过滤无效区。这样整段脚本跑完既不依赖 ArcGIS 的扩展许可也方便配合 os.walk 批量遍历多个 shp 文件批量执行。最后说一个执行完的验证习惯脚本运行后用 QGIS 或 ArcGIS 加载裁剪结果对比沿线各断面的高程曲线是否与原 DEM 一致再做一次范围边界套合检查。批量处理最怕的就是源文件坐标系不统一导致某几个区域裁得准、另外几个偏得远宁可花半分钟抽查两三个输出文件也不要交付后再面临大范围返工希望这个流程和踩坑记录能帮到你。本文还有配套的精品资源点击获取
返回列表