news 2026/10/27 18:26:58

赣州30m DEM数字高程数据实战:从裁剪、坡度分析到流域提取与淹没模拟

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
赣州30m DEM数字高程数据实战:从裁剪、坡度分析到流域提取与淹没模拟

简介:这份资源面向地理信息科学、城乡规划、环境与灾害研究等领域的从业者及学生,提供江西省赣州市30米分辨率的DEM数字高程数据,并附带本市行政范围的矢量边界文件,可用于地形分析、坡度坡向计算、水文建模与地图制图等场景。压缩包共12个文件,约139.7MB,以tif栅格高程数据为核心,配合shp、shx、dbf等Shapefile几何与属性文件,另有prj投影定义、tfw坐标配准、ovr与xml元数据及sbn、sbx空间索引,构成一套可直接在ArcGIS或QGIS中加载的完整数据集。目前已有1110人学习下载。借助该数据,读者可提取赣州市高程信息、生成晕渲与等高线,并结合行政边界开展土地利用、交通选线与灾害风险评估等空间分析,为区域研究与决策提供基础支撑。

1. 拿到赣州 30m DEM 之后:先搞清楚它能干什么、不能干什么

如果你手头正好有一个「江西省赣州市DEM数字高程数据30m(含本市级范围shp文件).zip」,别急着双击解压就往 ArcMap 里拖。我见过太多人拿到 DEM 第一反应是「赶紧出个山体阴影图」,结果投影没定、范围没裁、NoData 一片黑,最后怀疑数据有问题。其实 30m 分辨率的 DEM 在市级尺度上是非常实用的底图数据——它能支撑坡度坡向分析、流域提取、淹没模拟、选址踏勘,甚至给遥感影像做正射校正的辅助高程。赣州地处赣南丘陵山区,地形起伏大,用这份数据做地形因子计算比用全国 90m 数据靠谱得多。但它的边界也很清楚:30m 意味着两个高程点之间隔了 30 米,你拿它去算一栋楼的土方量,那是自欺欺人。这份资源适合做区域规划、水文分析、地形可视化的从业者,也适合刚接触 GIS 想拿真实行政边界练手的新手。下面我按「数据是什么 → 怎么裁怎么用 → 坑在哪 → 进阶怎么玩」的顺序,把这份包拆开讲透。

2. 拆包先看三样东西:投影、范围、NoData

2.1 解压后到底有哪些文件

拿到 zip 先别急着在 ArcMap 里点「添加数据」。我一般会先解压到一个纯英文路径下,比如D:\gis_data\ganzhou_dem,中文路径在部分老版本 ArcGIS 里会出玄学问题。解压完通常能看到这几类文件:

文件/文件夹典型命名作用
DEM 栅格ganzhou_dem_30m.tif或.img主高程数据,30m 分辨率
市级范围矢量ganzhou_boundary.shp及配套.dbf/.shx/.prj赣州市行政边界,用于裁剪和掩膜
说明文件readme.txt或metadata.xml记录投影、高程基准、数据来源
可能的索引图index.jpg快速预览覆盖范围

重点看.prj文件在不在。如果 shp 没有.prj,ArcMap 会提示「未知空间参考」,这时候你直接做裁剪,出来的结果可能偏移几百米。常见做法是打开 DEM 的属性看它的坐标系,然后给 shp 手动定义成一致的。

2.2 投影和基准:别让「地理坐标系」坑了你

30m DEM 最常见的两种空间参考:一种是地理坐标系 WGS84 或 CGCS2000,单位是度;另一种是投影坐标系,比如 UTM 或高斯-克吕格,单位是米。你打开 DEM 属性,看「XY 坐标系」那一栏。如果是GCS_WGS_1984,那它的像元大小会显示成0.000277...度左右,而不是 30。这时候你做坡度分析,ArcMap 会警告「像元大小以度为单位,坡度结果可能不准确」。

提示:做地形分析前,强烈建议把数据投影到以米为单位的坐标系。赣州在 CGCS2000 高斯投影下通常用 3 度带,中央经线 114°E 或 117°E,具体看数据说明。

我一般会用一个「投影转换」的批量脚本,把 DEM 和 shp 一起转成CGCS2000_3_Degree_GK_CM_114E。转换完再检查像元大小是不是接近 30。这一步不做,后面坡度坡向全是错的,血泪经验。

2.3 用 shp 裁剪 DEM:掩码提取和普通裁剪的区别

热搜里有人问「arcmap 中依靠面图层裁剪dem栅格tif文件 和依靠面图层掩码提取,有啥区别」。这个问题很关键。普通裁剪(Clip)是按 shp 的外包矩形切,边界外的像元直接删掉,但边界内的像元值不变。掩码提取(Extract by Mask)是把 shp 外的像元设为 NoData,shp 内的保留原值。对于赣州市这种不规则边界,如果你要做全市统计,必须用掩码提取,否则外包矩形里的邻市区域会混进来。

操作路径:Spatial Analyst Tools → Extraction → Extract by Mask。输入栅格选 DEM,掩码选ganzhou_boundary.shp,输出ganzhou_dem_masked.tif。跑完之后,用「识别」工具点一下边界外的区域,应该显示 NoData。如果还能看到高程值,说明掩码没生效,检查 shp 的坐标系是否和 DEM 一致。

3. 从 DEM 到可用地形因子:坡度、坡向、山体阴影的实操参数

3.1 坡度分析:Z 因子到底填多少

坡度是 DEM 最常用的衍生数据。ArcMap 里Spatial Analyst → Surface → Slope,输入裁剪后的 DEM,输出坡度栅格。关键参数是Z factor。如果你的 DEM 已经是投影坐标系、单位是米,Z factor 填 1。如果还是地理坐标系、单位是度,Z factor 要填一个换算值,大约1/111320乘以纬度余弦的倒数,赣州大概在 0.0000089 左右。但我不建议这么干,误差太大,还是先投影。

# ArcPy 批量计算坡度,假设 DEM 已投影到米制坐标系 import arcpy from arcpy.sa import Slope arcpy.env.workspace = r"D:\gis_data\ganzhou_dem" arcpy.CheckOutExtension("Spatial") dem = "ganzhou_dem_masked.tif" out_slope = "ganzhou_slope.tif" # Z factor = 1,因为输入是投影坐标系,单位米 slope_result = Slope(dem, "DEGREE", 1) slope_result.save(out_slope) print("坡度计算完成,输出:", out_slope)

这段脚本里Slope的第二个参数"DEGREE"表示输出角度制,如果你要百分比坡度就改成"PERCENT_RISE"。第三个参数1就是 Z factor。跑完检查一下最大值,赣州山区坡度超过 60 度的地方不多,如果出现 89 度,大概率是 DEM 有异常尖峰或者投影没转。

3.2 坡向和山体阴影:光照角度怎么设才自然

坡向用Aspect工具,输出是 0 到 360 度,正北是 0,顺时针增加。平坡会输出 -1,记得在符号化时把 -1 设为透明或单独颜色。山体阴影用Hillshade,三个参数:方位角、高度角、Z factor。方位角我一般设 315(西北方向),高度角设 45,这样出来的立体感最符合人眼习惯。Z factor 同样填 1。

from arcpy.sa import Aspect, Hillshade out_aspect = "ganzhou_aspect.tif" out_hillshade = "ganzhou_hillshade.tif" Aspect(dem).save(out_aspect) # 方位角315,高度角45,Z factor 1 Hillshade(dem, 315, 45, 1).save(out_hillshade) print("坡向和山体阴影完成")

跑完山体阴影,把它和坡度图叠加,用透明度 50% 显示,能快速看出赣州哪些区域是陡坡、哪些是河谷平地。这个组合图拿去做踏勘底图非常实用。

3.3 等值线和高程分级:出图前的最后一步

如果你要出地形图,等值线是少不了的。Spatial Analyst → Surface → Contour,输入 DEM,等高距根据区域高差定。赣州海拔从几十米到一千多米,等高距设 50 米或 100 米比较合适。输出是线要素,可以再叠加高程注记。高程分级用Reclassify,把 DEM 分成若干带,比如 0-100、100-200、200-500、500-1000、1000 以上,每带给不同颜色。这样出图比连续色带更清晰。

注意:等值线生成后,检查线是否闭合。如果出现断线,通常是 DEM 边缘 NoData 导致的,用掩码后的 DEM 重新生成即可。

4. 避坑与排查:这五个问题我几乎每次都能遇到

4.1 裁剪后全是 NoData 或黑边

现象:用 shp 裁剪 DEM 后,输出栅格一片黑,或者只有边缘有值。原因:shp 和 DEM 坐标系不一致,或者 shp 的几何有问题(比如自相交)。解决:先用Define Projection给 shp 定义正确坐标系,再用Repair Geometry修复几何,最后重新裁剪。如果还不行,检查 shp 是不是 MultiPolygon,转成 SinglePolygon 再试。

4.2 坡度结果出现 89 度或 -1

现象:坡度图最大值 89.999,或者出现负值。原因:DEM 里有异常尖峰或洼地,或者 Z factor 设错。解决:用Focal Statistics做 3x3 均值滤波平滑 DEM,再算坡度。负值通常是 NoData 被当成 0 参与计算,检查环境设置里的Mask和Extent。

4.3 山体阴影看起来像「鬼片」

现象:山体阴影明暗对比过强,或者方向反了。原因:方位角设成了 45 或 225,导致光照方向不自然。解决:方位角改回 315,高度角 45。如果还是不对,检查 DEM 是否被翻转(有些数据 Y 轴是反的),用Flip工具翻转。

4.4 投影转换后范围偏移

现象:投影转换后,DEM 和 shp 错位几百米。原因:转换时只转了 DEM,没转 shp,或者转换参数选错。解决:用Project Raster和Project分别转,确保目标坐标系一致。赣州用 CGCS2000 3 度带,中央经线看数据说明,别随便选。

4.5 内存不足或工具报错 999999

现象:跑坡度或掩码时 ArcMap 崩溃,报错 999999。原因:DEM 太大,32 位 ArcMap 内存不够。解决:先用Split Raster分块,或者换 ArcGIS Pro 64 位。我一般会在跑大工具前把其他图层全关掉,清空缓存。

5. 进阶玩法:用 DEM 做流域提取和淹没模拟

5.1 水文分析:填洼、流向、流量累积

DEM 做水文分析是重头戏。流程:Fill填洼 →Flow Direction流向 →Flow Accumulation流量累积 →Con提取河网。填洼阈值一般设 100 到 500,看区域大小。赣州丘陵区,我一般设 200。流量累积大于 200 的像元设为 1,其余 NoData,就得到河网栅格。再用Stream to Feature转成矢量,和 shp 叠加,能看出河流和行政边界的关系。

from arcpy.sa import Fill, FlowDirection, FlowAccumulation, Con from arcpy.sa import StreamToFeature filled = Fill(dem) flow_dir = FlowDirection(filled) flow_acc = FlowAccumulation(flow_dir) # 阈值200,大于200为河网 streams = Con(flow_acc > 200, 1) streams.save("ganzhou_streams.tif") StreamToFeature(streams, flow_dir, "ganzhou_streams.shp", "SIMPLIFY") print("河网提取完成")

这段脚本里Fill是填洼,消除 DEM 里的伪洼地。FlowDirection用 D8 算法,每个像元流向最陡的下坡方向。FlowAccumulation统计每个像元上游汇水面积。阈值 200 是经验值,你可以根据实际河网密度调整。

5.2 淹没模拟:给定水位,算淹没范围

用 DEM 做淹没模拟很简单:设定一个水位值,比如 150 米,用Con(dem <= 150, 1)提取淹没区。但实际做的时候要考虑连通性,不能只看高程。我一般会结合河网和流向,从河道向外扩散。更严谨的做法是用Cost Distance或者水文连通性分析,但那个计算量大。快速出图的话,直接高程阈值就够了。

from arcpy.sa import Con # 假设水位150米 flood = Con(dem <= 150, 1) flood.save("ganzhou_flood_150m.tif") print("淹没范围提取完成")

跑完把淹没栅格转成矢量,和 shp 叠加,算一下淹没面积占比。这个结果拿去做初步风险评估够用了。

5.3 验证数据质量:三个快速检查

第一,看 DEM 的最小最大值。赣州最低海拔几十米,最高一千多米,如果出现负值或超过 2000,数据有问题。第二,随机抽几个点,用 Google Earth 或天地图对比高程,误差在 10 米以内算正常。第三,检查 NoData 占比,如果超过 20%,说明数据覆盖不全。我每次拿到新 DEM 都会走一遍这三步,从那以后我每次用新数据做分析前都强制走一遍验证流程,省得后面返工。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 18:24:46

不背 git 命令:从克隆到解冲突的 Files 仓库管理实操

不背 git 命令&#xff1a;从克隆到解冲突的 Files 仓库管理实操 【免费下载链接】Files A modern file manager that helps users organize their files and folders. 项目地址: https://gitcode.com/gh_mirrors/fi/Files Files 是一款面向 Windows 的现代文件管理器&a…

作者头像 李华
网站建设 2026/10/27 18:23:49

哈希表算法实战:从基础到LeetCode经典题解

1. 哈希表算法复健&#xff1a;从基础到实战今天咱们聊聊哈希表这个数据结构在算法题中的应用。作为算法工程师日常必备技能&#xff0c;哈希表能高效解决很多看似复杂的问题。我挑选了LeetCode上4道经典题目&#xff08;242、349、202、1&#xff09;&#xff0c;通过它们带你…

作者头像 李华
网站建设 2026/10/27 18:23:46

Ponytail:面向AI Agent的可编程运行时框架与工程化实践

1. 项目概述&#xff1a;Ponytail 是什么&#xff0c;它解决的到底是什么问题&#xff1f;Ponytail 这个名字乍一听像某种发型&#xff0c;但在当前 AI 工具链生态里&#xff0c;它正快速成为一个高频出现的代号——不是 UI 界面&#xff0c;不是 SaaS 平台&#xff0c;而是一个…

作者头像 李华
网站建设 2026/10/27 18:23:26

my-tv 免费安卓电视直播软件:三分钟装好开播,遥控器直接换台

my-tv 免费安卓电视直播软件&#xff1a;三分钟装好开播&#xff0c;遥控器直接换台 【免费下载链接】my-tv 我的电视 电视直播软件&#xff0c;安装即可使用 项目地址: https://gitcode.com/GitHub_Trending/my/my-tv my-tv 是一款免费电视软件&#xff0c;主打安卓电视…

作者头像 李华
网站建设 2026/10/27 18:16:48

Hadoop监控模板:原生JMX/Prometheus/REST三源适配方案

简介&#xff1a;本资源是一套专为Hadoop生态监控设计的Grafana可视化模板集合&#xff0c;面向大数据运维工程师、平台开发人员及系统管理员&#xff0c;解决Hadoop集群多组件&#xff08;HDFS/YARN/HBase/Hive/Kafka/Spark/ZooKeeper&#xff09;指标分散、难以统一观测的痛点…

作者头像 李华
网站建设 2026/10/27 18:16:44

副队长JavaScript教程(36)-函数:经验的复用体

点此查看 所有教程、项目、源码导航 文章目录1. 经验2. 程序世界的经验3. 代码块的应用4. 只用代码块存在的问题5. 函数&#xff1a;用来复用经验的载体6. 我们先推断函数的样子7. 小结1. 经验 在成长的过程中&#xff0c;我们会不断积累经验&#xff0c;遇到相似的事情&#…

作者头像 李华