资讯动态

基于DEM的地形起伏度计算与ArcGIS地貌分类实操指南

发布时间:2026/10/5 7:57:55 来源:尧图企业网站定制
做地貌分类这件事放在十年前基本是靠人工勾绘。对着等高线一层层看再叠加遥感影像判读一个县域要磨上一两周。现在有了DEM数据配合ArcGIS里的空间分析工具整个流程能压缩到一个工作日内出初稿。这套方法在地貌学、国土空间规划、生态评价、地质灾害易发性分析里都是基本操作GIS相关专业的学生、做自然资源调查的技术人员都可以直接照着我这套流程走一遍。我最初接触这个需求是被一个地貌制图项目逼的。甲方要一张地貌类型图区域跨度大既有河谷平原又有中高山地纯靠人工勾绘工作量巨大。后来我改用DEM算地形起伏度再按分级标准重分类成图效率提升非常明显。当然这个过程不是简单点几个按钮就完事关键在于理解起伏度的计算原理以及分级指标怎么定。今天就把这套完整的实操流程拆开来写从原理到ArcGIS具体操作再到我踩过的坑一次性讲清楚。1. 先搞清楚原理为什么用地形起伏度来做地貌划分1.1 地形起伏度到底是怎么算出来的地形起伏度Relief Amplitude的定义很朴素某一确定面积范围内最高点与最低点的高程差。你可以把它理解成“把地表放在显微镜下看这块区域被揉皱的程度”。如果一块区域内最高峰和最低谷相差不到30米那它就是典型的平原如果在一平方公里内高差几百米那基本就是山地了。在ArcGIS的栅格计算里这个指标的计算方式非常直接对每个像元取它周围某个邻域窗口内的高程最大值减去最小值得到的就是该像元中心点的地形起伏度值。这个值随着窗口大小变化而变化3×3窗口算出来的叫微观起伏11×11甚至更大窗口算出来的更接近宏观地貌态势。换句话说窗口大小决定了你用什么尺度的“放大镜”观察地形。这里要特别注意地形起伏度不是单个像元的属性而是邻域属性。它描述的是“这个点周围的地形差异”而不是“这个点本身有多高”。正是因为这个特性它特别适合用来区分平原、丘陵、山地这些地貌类型——因为单纯看高程DEM经常分不清海拔500米的平原和海拔500米的丘陵高程完全一样但起伏度差异巨大。1.2 整体技术路线从DEM到地貌分类图整个流程可以划分为五个核心环节我在做项目时基本按这个步骤走DEM数据准备与预处理获取原始DEM检查NoData区域转换到合适的投影坐标系。地形起伏度计算利用焦点统计Focal Statistics或地图代数表达式在指定邻域窗口内计算高程最大值与最小值之差。分级指标设定参考相关规范或研究文献确定起伏度分级阈值以及是否需要结合DEM高程做二级分类。重分类与组合将连续的起伏度栅格按阈值重分类为离散类型必要时叠加海拔分级生成复合类型。矢量化与制图将分类结果转为矢量面统计面积配置符号方案并出图。这个流程最大的优势是可重复、客观性高。同样的DEM输入同样的参数任何人都能复现出几乎一致的结果。相比人工勾绘减少了大量主观判断尤其适合大范围、多时相的对比分析。1.3 DEM数据准备源数据与预处理要点DEM的选择直接影响分类结果这一点比很多初学者想象的重要。目前常用的开源DEM包括SRTM30米/90米、ASTER GDEM30米、ALOS AW3D3030米等。如果研究范围是全国或省域SRTM 90米数据量小、处理快适合快速概览如果是县域或流域尺度建议用30米分辨率的SRTM或ALOS地形细节保留更完整。12.5米分辨率的PALSAR数据也可以尝试但数据量会成倍增加处理速度明显下降。我个人的经验是县市级研究首选30米分辨率省域以上用90米足够。分辨率并非越高越好更高分辨率意味着更多噪声和更大的计算量而且分类结果可能因为局部微地形过多而变得破碎反而不利于宏观地貌类型的识别。拿到DEM后预处理环节有两点必须做检查NoData区域。很多DEM在湖泊、云覆盖区域或高山区存在空洞。如果不处理这些区域在后续计算中会变成空值影响分类结果的完整性。可以用周边像元填补或者直接把这些区域排除在分析范围外。投影转换。原始DEM通常是WGS84地理坐标系经纬度在这个坐标系下做面积量算和窗口分析都不够准确。建议根据研究区所在位置转换为合适的投影坐标系例如UTM分带投影或高斯-克吕格投影。如果你不确定怎么选记住一个原则研究区在哪个经纬度范围就选哪个带号的投影坐标系。最后一个容易被忽略的细节计算地形起伏度之前绝对不要做填洼Fill处理。填洼是为了水文分析准备的它会削平真实的地形凹陷导致高差被人为缩小起伏度失真。尤其是在喀斯特地区或人工地形复杂的城市区域填洼前后的起伏度结果差异非常明显。这一点我在第一次做实验时就吃过亏后面会再展开说。2. 起伏度计算的两种方法以及窗口怎么选2.1 方法一焦点统计两次再相减ArcMap/Pro通用这是最稳妥、最通用的做法在ArcMap和ArcGIS Pro里操作路径一致适合绝大多数用户。第一步打开Spatial Analyst工具找到“焦点统计”Focal Statistics工具。在ArcMap中路径是Spatial Analyst Tools → Neighborhood → Focal Statistics在ArcGIS Pro中直接在“地理处理”面板搜索即可。输入栅格选择预处理好的DEM数据。邻域类型Neighborhood选择“矩形”Rectangle像元大小单位选“像元”Cell宽度和高度就是你的分析窗口比如5×5或11×11。统计类型第一次选“最大值”MAXIMUM输出一个栅格第二次同样操作统计类型选“最小值”MINIMUM再输出一个栅格。这里有个关键设置在环境Environment设置里把“像元大小”Cell Size和“处理范围”Processing Extent设为与输入DEM一致否则输出结果可能会出现偏移或范围变化。尤其是NoData处理默认情况下NoData会向外传播导致结果栅格边缘出现一圈空值。建议在焦点统计工具的选项里勾选允许忽略NoData参与计算这样可以在一定程度上减少空值扩散。第二步打开栅格计算器Spatial Analyst Tools → Map Algebra → Raster Calculator输入以下表达式FocalMax_5x5 - FocalMin_5x5这就是地形起伏度栅格。为了验证结果合理性可以在图层属性里查看栅格直方图或统计数据起伏度值应该都是大于等于0的数值最大值对应研究区内的最大高差。2.2 方法二ArcGIS Pro里的地图代数一条龙在ArcGIS Pro中因为支持Python地图代数表达式我们可以在一个步骤里完成最大最小值相减不需要先生成两个中间栅格。在地理处理面板里搜索“栅格计算器”然后输入如下表达式FocalStatistics(dem, NbrRectangle(5, 5, CELL), MAXIMUM) - FocalStatistics(dem, NbrRectangle(5, 5, CELL), MINIMUM)运行之后直接得到起伏度栅格。这个方法的好处是不产生中间文件节省磁盘空间也避免了中间结果命名混乱的问题。如果你对arcpy比较熟还可以直接用Python窗口一次性跑完import arcpy from arcpy.sa import * arcpy.env.workspace 你的工作目录 dem dem_proj relief FocalStatistics(dem, NbrRectangle(5, 5, CELL), MAXIMUM) - FocalStatistics(dem, NbrRectangle(5, 5, CELL), MINIMUM) relief.save(relief_5x5)这段代码我实测下来非常稳定而且方便批量处理多个研究区或多个窗口大小的对比实验。如果你的项目需要做多窗口对比强烈建议用脚本方式而不是手动一次次点击工具按钮。2.3 窗口大小不是随便填的我的选参经验关于窗口大小这是整篇文章里我最想强调的一个参数。因为同一个DEM用3×3窗口算出来的起伏度普遍偏小反映的是局部微地形高差更像坡度分析的变体用15×15甚至更大的窗口算出来的值才是宏观区域的高低差异。到底选多大窗口不存在一个普适的正确答案而是取决于你的研究目的和地貌尺度。我在实际项目中常用的参考原则如下3×3窗口反映局部微地形适合城市内部微地貌分析分类结果非常破碎不适合做宏观地貌图。5×5窗口30米分辨率下对应150米×150米地面范围适合乡镇级、小流域尺度的地形分析。11×11窗口30米分辨率下对应330米×330米适合县市级地貌分类大部分研究用这个尺度效果不错。15×15及以上适合省域或全国尺度的宏观地貌类型划分其结果更平滑符合大地貌单元的识别需求。我见过不少新手直接用默认的3×3窗口算起伏度结果分类图上全是密密麻麻的小图斑根本看不出地貌单元轮廓。后来我把窗口调到11×11图面立刻清爽很多地貌单元的边界也清晰了。更严谨的做法是做一个多窗口对比实验。把3×3、5×5、7×7、9×9、11×11、15×15都算一遍统计每个窗口下不同起伏度等级的面积占比画一条面积占比随窗口大小变化的曲线。曲线出现明显拐点的位置往往就是最适合你这个研究尺度的分析窗口。这个方法在不少地貌学研究文献里出现过可以用来佐证你的参数选择。3. 分级指标与分类体系平原、丘陵、山地怎么界定3.1 地形起伏度分级参考阈值有了起伏度栅格下一步就是把连续值映射成离散的地貌类型。这一步的关键是确定分级阈值。目前国内使用较广的分级思路参考了中国数字地貌制图的相关规范和大量研究文献我综合整理后常用的分级阈值如下表所示。需要说明的是不同研究根据区域特点会对这些阈值做微调你实际使用时应该引用与你研究区背景匹配的规范或文献并在论文或报告中明确标注。地貌类型地形起伏度范围米代码平原 301台地30 ~ 752丘陵75 ~ 2003小起伏山地200 ~ 5004中起伏山地500 ~ 10005大起伏山地1000 ~ 25006极大起伏山地 25007这套阈值的基本逻辑是按照高差从低到高逐渐过渡。平原和台地的区别在于台地虽然高差不大但具有明显的地势抬升和边缘陡坎丘陵和山地的分界通常定在200米左右小起伏山地和中起伏山地的分界定在500米这个划分和中国地形三级阶梯的概念也有一定对应。如果你的研究区是典型的高原地区或者沿海平原地区阈值可能需要适当调整。这里有一个小技巧在做重分类之前先看一下你起伏度栅格的统计数据特别是最大值和频数分布直方图。如果研究区内的起伏度最大值只有800米那“大起伏山地”和“极大起伏山地”这两类在你的图上就不会出现此时可以适当调整阈值把中高等级细分让分类结果更有区分度。3.2 别漏了海拔DEM原始高程也要参与分类纯粹按照起伏度分类会有一个明显问题高海拔丘陵和低海拔丘陵在图上都是“丘陵”但它们的地貌成因、气候条件和土地利用方式完全不同。为了弥补这个不足更符合制图规范的做法是把海拔和起伏度结合起来形成二级分类。例如一个海拔4000米、起伏度150米的区域按单一指标应该被归为“丘陵”但更准确的描述应该是“高海拔丘陵”。而海拔200米、起伏度150米的区域则是“低海拔丘陵”。这两种地貌类型在学术上和工作实践中都用不同的代号表示。海拔分级我常用以下标准海拔等级海拔范围米代码低海拔 10001中海拔1000 ~ 35002高海拔3500 ~ 50003极高海拔 50004这两个指标结合后每一个像元就有了两个代码一个海拔代码和一个起伏度代码。把它们组合起来就得到了类似“低海拔平原”、“中海拔丘陵”、“高海拔中起伏山地”这样的复合地貌类型。这种分类方式的图件信息量比单一指标高出很多甲方和论文审稿人也更认可。3.3 重分类操作把连续值变成类型码在ArcGIS中对起伏度栅格做分级用的是“重分类”Reclassify工具。操作上打开Spatial Analyst Tools → Reclass → Reclassify输入栅格选择起伏度结果重分类字段选Value。然后点击“分类”Classify按钮分类方法选择“手动”Manual或“几何间隔”GeometricInterval在断点Break Values位置手动输入30、75、200、500、1000、2500对应分成7类。把新的值设为1到7方便后续组合计算。对DEM高程做海拔分级也同理断点填1000、3500、5000分为4类。这里要提醒一个容易出错的细节重分类工具默认的断点处理方式是“大于下边界且小于等于上边界”也就是说30米这个临界值会被分到“台地”类别而不是“平原”。如果你不希望临界值恰好卡在边界上可以在输入断点时微调比如把平原上限定为29.99米或者根据你的标准重新定义区间。重分类完成后我通常建议把这两个栅格分别命名成“海拔分级”和“起伏度分级”名称里带上阈值信息因为后续做组合分析时容易混淆。4. 一个完整案例从30m DEM到地貌分类矢量图4.1 数据准备与投影转换下面我用一个多山的县级区域作为案例演示完整流程。假设我已经下载好了研究区的30米分辨率SRTM DEM数据。首先在ArcGIS Pro中加载DEM打开图层属性查看坐标系。如果显示是WGS 1984经纬度我需要先做投影转换。这个案例区位于北半球中纬度地区大致对应UTM 48N分带的范围因此我选择WGS 1984 UTM Zone 48N投影坐标系。操作路径是数据管理工具 → 投影和变换 → 栅格 → 投影栅格Project Raster。输入DEM输出坐标系选WGS 1984 UTM Zone 48N重采样方法建议选择“双线性”Bilinear或“三次卷积”Cubic因为DEM是连续表面用最近邻法会产生锯齿状边界。投影完成后顺手用“栅格计算器”做一个掩膜提取将研究区边界外的像元剔除保证后续计算不涉及无关区域。如果你的DEM已经严格覆盖研究区这一步可以跳过。另外我建议在投影后重新检查一下像元大小。有些DEM在重投影后像元大小会变成30.01米或29.98米虽然差异很小但在后续计算面积时会产生累积误差。可以在投影工具的环境设置里把输出像元大小明确指定为30米。4.2 计算地形起伏度并做多窗口对比我这次没有直接拍脑袋选窗口而是按前面提到的方法做了对比实验。分别用5×5、9×9、11×11、15×15四个窗口计算起伏度然后统计各窗口下起伏度栅格的均值与标准差。实测结果很有意思5×5窗口的起伏度均值明显偏小大量区域集中在75米以下因为小窗口看到的只是局部的微小高差随着窗口增大到11×11均值开始稳定并且各类地貌面积占比的变化幅度也开始收窄15×15窗口的结果与11×11差异不大但局部山谷的细节被过度平滑一些独立的河谷地貌单元边界变得模糊。结合以往经验和对比曲线我最终选择了11×11窗口。这个窗口在30米分辨率下对应330米×330米的地面范围既能保留河谷与山地的清晰边界又不会因为噪声产生太多细碎图斑。确定窗口后我用焦点统计工具输出了“FocalMax_11x11”和“FocalMin_11x11”两个栅格然后用栅格计算器相减得到起伏度栅格“Relief_11x11”。这个栅格的直方图显示数值范围从0到2820米最大高差出现在研究区西北角的高山深谷区域符合实际情况。4.3 海拔分级与起伏度分级组合接下来我把起伏度栅格和DEM高程栅格分别重分类。DEM高程重分类断点设为1000、3500分为低海拔1000、中海拔1000~3500、高海拔3500三类。因为研究区最高点不到5000米“极高海拔”类型在本区不存在所以没有设5000的断点。起伏度重分类按7级标准执行断点设为30、75、200、500、1000、2500。输出栅格各类型的像元数量统计显示本区以丘陵和中起伏山地为主平原面积较小集中在东南部河谷地带。然后我用栅格计算器将两个分类结果组合成一个唯一代码。我采用的公式是%elev_class% * 10 %relief_class%例如低海拔代码1加上平原代码1组合代码为11中海拔代码2加上丘陵代码3组合代码为23。这样每一个像元都有一个两位数的整数代码前一位代表海拔等级后一位代表起伏度等级。这个做法的便利之处在于转成矢量后我可以通过属性表里的分类代码直接识别每一个图斑属于哪种复合地貌类型不需要额外建立关联表。如果你用的是ArcGIS Pro还可以用“组合”工具Combine直接生成一个包含所有唯一组合的栅格效果一样但会更直观一些。4.4 栅格转面、面积统计与制图出图重分类后的栅格是整型栅格可以直接转为矢量。操作路径是转换工具 → 从栅格 → 栅格转面Raster to Polygon。输入栅格选择组合分类结果字段选Value勾选“简化面”Simplify可以根据需要决定。我通常建议不勾选简化因为简化算法可能会把一些地貌边界的小锯齿抹平虽然图面更美观但丢失了真实边界细节。如果确实觉得边界太碎可以在转面后再用“平滑面”工具处理。转面完成后矢量图斑的属性表里有“gridcode”字段就是那两位的组合代码。我新建一个“地貌类型”字段用字段计算器或手动输入把每个代码对应的名称写进去比如11对应“低海拔平原”23对应“中海拔丘陵”45对应“中海拔小起伏山地”等。面积统计直接用“添加几何属性”Add Geometry Attributes工具在属性里选择“面积”和当前坐标系单位生成面积字段后按面积字段汇总合计。如果单位是平方米想换算成平方公里再除以100万即可。这个面积统计结果是后续报告和成果表的重要组成部分通常会按地貌类型汇总计算各类型面积和占比。最后是出图环节。在布局视图里把分类面图层按“地貌类型”字段符号化。配色可以参考常见地貌图例习惯平原用绿色系丘陵用黄绿色系山地用棕色系高海拔区域可以加深颜色。图例、比例尺、指北针、图名一个都不能少。如果你是要提交给甲方或发表论文建议导出300dpi以上的PNG或TIFF图面字体统一图例注明数据来源和分类标准。5. 常见问题与排查技巧实录5.1 结果出现大片NoData怎么办这是初学者问到最多的问题。起伏度栅格或重分类结果里出现大片黑色或透明区域多半是原始DEM本身就存在NoData或者在焦点统计时没有正确处理NoData。排查思路很简单先在原始DEM图层属性里查看NoData值是多少以及分布在哪些区域。如果NoData区域是零星的可以在焦点统计工具里勾选“忽略NoData计算”Ignore NoData in calculations这样每个像元只基于有效像元计算最大最小值不会因为邻域内存在空值就输出NoData。如果NoData区域是大面积的比如湖泊或大范围云遮盖那说明原始DEM质量问题建议换数据源或者对NoData区域做插值填补。ArcGIS Pro里可以用“焦点统计”计算局部均值后填补NoData操作上先做一次以“平均值”为统计类型的焦点统计再用Con函数把原始DEM缺失位置替换为邻域均值。这种方法处理后的DEM在起伏度计算时影响较小。5.2 分类图斑太碎怎么聚合分类结果过于破碎通常有两个原因窗口太小或DEM噪声过大。如果是窗口原因直接重新计算更大窗口的起伏度。如果窗口已经很大但图斑仍然很碎可以尝试两种处理方式。第一种方式是对起伏度栅格做平滑预处理比如先用焦点统计的“平均值”或“中位数”统计类型对DEM做一次3×3或5×5的平滑再计算起伏度。注意平滑会降低真实高差幅度不宜过大。第二种方式是在重分类之后、转面之前使用“众数滤波”Majority Filter工具。这个工具会用邻域内的主要类别替换孤立的像元类别可以有效去除椒盐噪声般的孤立小图斑。参数上“替换阈值”Replacement Threshold设为“4邻域”或“8邻域”我习惯用“8邻域”效果更好。如果转面后仍然有大量细小面可以用“消除”Eliminate工具在矢量层面把面积小于某个阈值的图斑合并到相邻最大面积图斑中。操作时要注意“消除”工具需要获得高级编辑许可同时最好先备份原始矢量避免误合并。5.3 不同窗口结果差异大研究结论怎么选窗口大小直接影响分类结果这一点我在前面已经强调过。如果你的研究需要与其他文献或历史成果对比窗口参数必须与对比对象一致否则两张图的差异可能完全来自参数不同而不是真实地貌变化。一个比较标准的做法是在报告中明确写清楚本研究中地形起伏度基于30米分辨率DEM采用11×11像元窗口对应地面约330米×330米范围计算。这样无论谁拿到你的成果都能复现。另外如果你的研究目的是多时期对比比如分析某区域5年间地貌变化一定要保证两个时期的DEM分辨率和窗口参数完全一致否则结果差异无法解释。我自己在做一个时序研究时就因为第一期用了30米DEM、第二期用了90米DEM导致分类结果出现大面积差异后来不得不重新处理数据。5.4 软件环境与效率优化建议ArcGIS版本众多ArcMap 10.x和ArcGIS Pro在界面和工具名称上略有差异。我强烈建议新项目优先使用ArcGIS Pro原因是Pro的栅格计算器支持地图代数表达式能一步完成起伏度计算Pro的多线程性能也比ArcMap好处理大范围高分辨率DEM时速度优势明显。ArcMap用户也无需担心焦点统计和重分类工具在两个软件中都在Spatial Analyst模块下操作逻辑一致只是界面风格不同。如果你在ArcMap中打开“聚焦统计”工具找不到确认一下是否已经启用了Spatial Analyst扩展模块。扩展模块没启用很多工具都是灰色不可点状态。这种情况在ArcMap 10.2到10.8之间的版本里尤其常见。数据处理还有几个提升效率的小习惯大范围DEM先裁剪到研究区范围再分析避免全图计算浪费时间中间结果记得命名规范别用“Final_final_2”这种命名方式项目周期一长就会乱处理前先设置好工作环境的临时文件夹路径和并行处理因子Parallel Processing Factor可以在环境设置里调整实测能明显缩短大型栅格分析的时间。5.5 常见问题速查表最后把我遇到过的高频问题整理成速查表方便你排查问题现象可能原因解决方案起伏度栅格出现大片NoDataDEM原始NoData未处理或焦点统计未忽略NoData填补NoData勾选忽略NoData检查处理范围起伏度值全部为0或极小输入了填洼后的DEM或窗口太小使用原始DEM增大分析窗口分类图斑特别破碎窗口过小或DEM噪声大增大窗口对DEM做平滑使用众数滤波分类结果与实际情况偏差大分级阈值不合适查看起伏度直方图调整断点值组合代码出现多位数字海拔等级或起伏度等级超过10类使用“Combine”工具或改用字符串拼接组合转面后面积统计不准面图层的坐标系仍为地理坐标系投影转换后再统计面积确认面积字段单位这套流程走下来我从拿到DEM到输出一张完整的地貌分类图通常只需要大半天时间其中很大一部分时间花在前期的数据检查和参数对比上真正操作ArcGIS的时间其实不长。我个人觉得这整套方法的价值不在于“快”而在于每一个分类结果都有明确的量化依据不会出现两个人对一个区域画出完全不同的两张图的情况。后面如果你想升级还可以把坡度、坡向、地表粗糙度这些因子一起加进来做更细致的地貌类型划分或者用随机森林这类机器学习方法自动识别地貌单元。先把DEM和地形起伏度这条主线跑通后面的路就好走了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑