
我们拿到一块地、一个县、一条流域经常会被问到一个问题这地方到底是山地还是丘陵是平原还是高原如果没有现成的地貌图很多人第一反应是用DEM看看海拔。但实际上单纯看海拔很容易误判——同样是海拔500米的地方在平原边缘就是一座山在高原腹地就是一块平地。这个时候地形起伏度才是真正的决定因素。这篇内容想解决的问题很具体如何用ArcGIS基于DEM数据计算出地形起伏度再结合海拔把研究区划分成不同地貌类型。整套流程下来你会得到一张可直接出图的地貌分类专题图而不是只在屏幕上看看山体阴影。文章会从原理讲到实操从单步工具讲到建模自动化最后还会把我实际做项目时踩过的坑一并交代清楚。适合正在做土地利用规划、区域地质调查、水土流失评价、生态分区之类工作的GISer参考。1. 地形起伏度与地貌分类先弄清楚这个指标到底在算什么1.1 地形起伏度在数学上是什么地形起伏度的定义很朴素它就是一个局部范围内最高点与最低点的高差。用公式表达是RD Hmax - Hmin其中Hmax和Hmin分别指某个邻域窗口内的最大和最小高程值。这个窗口可以是矩形、圆形或者环形具体形状和大小取决于你分析的目标。这个概念看起来简单但它和坡度是两回事。坡度描述的是局地倾斜程度是地表曲面的一阶导数而地形起伏度描述的是单位范围内的相对高差体现的是宏观地表切割程度。举个例子一个坡度很陡但连续下降的坡面坡度很大但起伏度未必大而一个四周高中间低的封闭洼地坡度不一定会很大起伏度却很明显。这也是为什么做地貌分类时地形起伏度比坡度更常用。它更接近我们肉眼判断这里是不是山的直觉一片区域上下的相对高差够不够大。1.2 为什么分类需要两个维度而不只是起伏度单靠起伏度同样有问题。一片中海拔的丘陵和一片高海拔的高平原起伏度可能都在100米左右但地貌性质完全不同。前者是切割的丘陵区后者是平坦的高原面。所以我在实际项目中采用的做法是用海拔做一级分类框架用起伏度做二级分类框架。海拔解决它在哪个大的高程阶梯上起伏度解决它在这个阶梯上的切割程度。两者正交组合才能分出有地理意义的地貌类型。这也是《中国地貌分类系统》里比较常见的划分逻辑先按海拔划出低海拔、中海拔、高海拔、极高海拔再按起伏度划出平原、台地、丘陵、小起伏山地、中起伏山地等。我们做一般性项目不用完全照搬国标但思路可以一致先用海拔分类再用起伏度细分。1.3 这套方法适合什么样的项目和场景从我接过的实际任务来看以下三类场景是绝对的主力区域土地利用与国土空间规划需要知道哪些区域属于平原宜耕区、哪些属于丘陵林果区、哪些属于山地生态保育区作为土地适宜性评价的底层输入。水土流失敏感性评价起伏度直接决定径流汇集能力和土壤侵蚀潜力是通用土壤流失方程中的重要地形因子LS因子的辅助判断量。生态区划与景观格局分析不同地貌类型的生态服务功能不同分类结果可以作为景观破碎化、植被覆盖度分析的分层统计单元。只要你属于这三类场景的其中一类这套DEM-起伏度-地貌分类的流程就值得完整做一遍。2. 数据准备与预处理DEM的坑比你想的多很多人拿DEM就算起伏度结果出来一张花里胡哨的图却经不起推敲。问题往往不是出在计算环节而是数据预处理没做到位。2.1 选对DEM数据源精度和范围要一起看目前常用的免费DEM数据源大概有这么几个数据源分辨率覆盖范围适合场景SRTM 1弧秒约30m全球北纬60° 到南纬56°中小尺度区域分析ASTER GDEM V3约30m全球大范围粗略分析注意局部噪声ALOS AW3D30约30m全球精度较好城市区域更推荐12.5m高分辨率DEM如Pleiades、TanDEM-X衍生12.5m局部县域、流域级精细分析无人机航测DEM厘米级到亚米级局部重点区域工程级、样地级研究如果是做县域或更大范围的地貌分类我一般首推ALOS AW3D30因为它在平坦地区的表现比SRTM更稳定地形纹理也更干净。如果没有下载渠道SRTM也够用毕竟地貌分类的容错率不像洪水淹没分析那么低。极端重要的一点无论用哪家数据都要下载同一种投影体系下可正常拼接的影像如果跨带后面投影转换会很痛苦。2.2 填洼处理不填洼起伏度会多出一堆假信息DEM填洼Fill在很多人的印象里是为水文分析服务的不做流向分析就不需要填。但我的经验是做地形起伏度之前必须填一次洼地否则会出现两大问题第一真实地形中的微小凹陷、错误高程点和噪声会被当成地形起伏计入邻域统计导致起伏度偏大第二平坦地区的桁架状误差会产生大量极值点在分类结果里形成密密麻麻的椒盐噪声。ArcGIS里的操作路径是Spatial Analyst Tools → Hydrology → Fill。参数上Z limit可以先填一个较小的值比如5米让工具只填掉微小的局部洼地不至于把真实的地形洼地比如喀斯特漏斗、采石坑、天然湖盆全都抹平。2.3 投影坐标系先行地理坐标系算距离就是在自欺欺人这是新手最容易忽略的一步。地形起伏度虽然计算的是高差不直接涉及平面距离但它依赖邻域窗口——窗口在球面上划定的范围和投影后的范围在形状和面积上有明显差异尤其是高纬度地区。所以我的习惯是拿到DEM后立即做投影转换而不是等到出图时才投影。具体操作为Data Management Tools → Projections and Transformations → Raster → Project Raster输出坐标系选研究区对应的投影坐标系。中央经线要选对如果研究区跨两个投影带就用Albers等积圆锥投影如果是省市级行政区可以选择Albers或UTM中合适的带号。判断标准很简单确保投影后研究区内任意地点的面积畸变控制在可接受范围内一般5%。2.4 裁剪出研究区别把窗口统计带到区域外研究区外的DEM是否需要保留我的建议是保留至少一个窗口半径的缓冲区再裁剪出最终成果。因为焦点统计在边缘处的邻域是不完整的ArcGIS默认会用可用像元计算导致边界区域起伏度偏小。如果直接对裁剪后的研究区DEM计算整个边界一圈都是不可信的。所以正确顺序是先对完整DEM做填洼和投影再裁剪出带有缓冲区的子集计算完起伏度后再用精确研究区边界Extract by Mask裁剪最终成果。3. 地形起伏度的计算原理与ArcGIS实操3.1 焦点统计起伏度计算的核心工具ArcGIS里计算地形起伏度核心工具是Spatial Analyst Tools → Neighborhood → Focal Statistics。这个工具会在每个像元周围定义一个邻域然后对邻域内的像元做指定统计计算。在我们的场景里统计类型选择RANGE即范围内最大值减最小值也就是邻域内最高的山和最低的沟之间的高差。工具界面里需要注意几个参数Neighborhood类型默认是Rectangle也可以选Circle、Wedge、Annulus。Width和Height矩形的宽和高也就是邻域范围。Units像元单位Cell还是地图单位Map。这个工具本身就是按窗口滑动计算每个栅格点的起伏值的所有中间结果它都会自动生成。我们要做的是选对窗口大小。3.2 窗口大小的选择逻辑没有万能值但有判断标准这是整个流程里最见功夫的地方。窗口太小起伏度反映的是局部微地形分类结果碎成渣窗口太大起伏度被平均化分不出来真正的山体与谷地。窗口大小直接决定最终分类的尺度感。我常用的参考规则是窗口等效边长应约为目标地形体宽度的1/2到1倍。比如研究区以丘陵为主单个丘陵体的直径大约在500米到1000米那窗口取500米到1000米就比较合适如果是山地单个山体宽度可能达到2到5公里窗口就要放大到2公里甚至更大。以30米分辨率DEM为例窗口大小等效地面边长效果表现3 × 390m几乎等于坡度/粗糙度碎斑极多只反映微地形11 × 11330m丘陵地区的较好起点能区分明显的沟梁15 × 15450m中小流域尺度较合适斑块较为完整31 × 31930m山体尺度丘陵会被明显平滑掉51 × 511530m更宏观的分区尺度适合大区域分异研究实际操作建议在正式计算之前先用窗口15×15、31×31、51×51各算一次肉眼观察哪种窗口下研究区的地貌分界线与山体阴影图、等高线图最吻合。多试几次不要怕麻烦。这个试参过程决定了你最终分类图的说服力。3.3 栅格计算器与结果验证计算完成后用Raster Calculator跑一个非常简单的表达式验证一下数据范围FD focal_DEM_out打开FD的属性表查看最小值、最大值、均值、标准差。如果最小值接近0说明研究区内有平坦区域最大值如果远大于你预期的最大高差就要回头检查是否没填洼或者DEM存在异常极值。还有一个非常好的验证方法在山体阴影图Hillshade之上半透明叠加起伏度栅格观察起伏度高值区的边界是否与陡崖、山脊线、沟谷线吻合。如果不吻合基本可以判断窗口大小不对或者数据预处理环节出了问题。我在实际项目中还会做一个随机验证点抽检选取20到30个随机点在等高线地形图上人工判读这些点的地貌类别与自动分类结果比对准确率达到85%以上才算合格。4. 分类标准的制定海拔与起伏度的正交组合4.1 一级分类按绝对海拔划分高程阶梯首先对DEM数据本身进行重分类Reclassify。分类阈值的选取要参考研究区实际情况不能照搬教科书。我这里给一个通用的参考值海拔类别高程范围m说明低海拔 1000东部平原、丘陵和低山的大部分区域中海拔1000 ~ 2000西部高原边缘、中山区域高海拔2000 ~ 4000青藏高原外围、西北山地主体极高海拔 4000青藏高原腹地、常年积雪带附近这个阈值要结合研究区所在位置调整。如果研究区整体都在海拔3000米以上那么低海拔一级可以直接删除在更高尺度上分区。4.2 二级分类按相对起伏度确定形态类型对起伏度栅格进行重分类时我常用的分级参考是这样一套阈值起伏度区间m地貌类型宏观形态表现0 ~ 30平原一望无际几乎没有切割30 ~ 75台地顶部平坦但边缘有坎75 ~ 200丘陵波状起伏切割较浅200 ~ 500小起伏山地山体完整沟谷明显500 ~ 1000中起伏山地高差大山势陡峻 1000大起伏山地极高山、深切割峡谷区这些数值来源于国内区域地貌调查中常用的相对地势分级框架而且在很多已发表的地貌分类研究里都能找到类似的影子。但是——必须强调的是——不同研究区的地质背景不同实际阈值需要在野外验证或与已有地貌图对比后微调。我在做黄土高原的项目时因为黄土塬面平滑、沟谷深切的特殊地形把丘陵上限从200米直接调到了150米效果明显更好。4.3 重分类与组合叠加得到最终分类结果得到两个重分类栅格后用Raster Calculator做栅格代数叠加。比如先给海拔类别赋百位数值低海拔1000中海拔2000……再叠加起伏度类型的个位数值平原1台地2……组合值形如1301就代表中海拔丘陵。这一步要特别留意NoData像元的处理。叠加前建议用IsNull检查两个输入栅格把NoData统一处理成0或者其他值避免分类结果大量丢失。4.4 阈值是否合理的快速检验分类结果出来以后有一个简单快捷的统计检验方法用Zonal Histogram对每个类别做面积统计然后与区域已知地貌面积占比做对比。如果某类地貌面积异常大或异常小多半是阈值选取出了问题。另外把分类结果和已有的1:100万地貌图或GE地图叠加目视观察平原/山地边界是否吻合。记住一句判断条件边界线应该沿着山脚线、陡坎线或明显地物走而不是随机穿越等高线。这句话可以帮你筛掉大部分不合理的分类结果。5. 从单步操作到一键建模把流程固化成可复用模型实际做项目时你不会只做一个县就收工往往是一套流程用在多个相邻区域上。如果每个区域都重复十几步手工操作既慢又容易出错。这时候就该用Model Builder把整套流程串成一个自动化模型。5.1 模型里需要包含哪些节点从输入原始DEM到输出分类成果我的模型包含以下节点Fill填洼 → 输出填洼DEM投影转换 → 转为统一投影坐标系如果输入是地理坐标系焦点统计 → 计算起伏度Range重分类DEM → 海拔分级栅格重分类起伏度 → 起伏度分级栅格栅格计算器 → 两者组合编码栅格转面 → 矢量化得到分类多边形消除小碎斑块 → 合并面积过小的分类图斑5.2 各节点的关键参数设置模型里最容易出问题的两个节点第一个是焦点统计节点。窗口大小如果固定写死换一个不同分辨率的DEM时就会出问题。解决方案是用模型变量参数传入窗口大小或者在模型外部用批处理参数统一管理。我个人更喜欢的方式是在模型里用变量关联像元大小根据目标窗口边长米除以像元大小自动计算窗口的宽和高。第二个是栅格计算器的表达式。如果表达式里引用的栅格路径包含中文或空格很容易报错。我建议模型里的中间数据统一存放到英文路径的临时GDB中最终结果再复制到正式数据库。5.3 模型建成之后的后处理栅格转面之后分类结果必然会产生大量细碎图斑这是栅格分析的通病。ArcGIS里可以用Eliminate或者Aggregate Polygons做合并但我实测下来最顺手的做法是先计算每个图斑的面积筛选小于最小制图单元一般取0.5平方公里根据比例尺调整的图斑用Eliminate把这些碎斑合并到相邻最大同类图斑中这一步做完再叠加行政区边界、主要河流、公路要素就可以进入出图阶段了。符号化建议使用分层设色平原用浅绿色系丘陵用黄绿色系山地用棕褐色系。图例、比例尺、指北针、相对位置图配齐一张标准的地貌分类专题图就能直接提交评审。6. 实操中躲不开的坑与调参心得6.1 投影坐标系没转换导致的面积和邻域失真我第一次用SRTM原始数据直接算起伏度的时候项目区在黑龙江北部纬度接近50度。由于输入的是WGS84地理坐标系焦点统计的邻域是按度数定义的算出来的起伏度栅格在南北方向和东西方向上对应的地面距离差异极大。最后的结果图怎么看怎么别扭等高线验证也对不上。后来把数据统一投影到UTM 51N后一切正常。这个坑的教训就是任何涉及邻域统计、距离计算、面积统计的栅格分析必须使用投影坐标系。如果只是渲染出图地理坐标系无所谓但做定量分析不投影就是给自己埋雷。6.2 窗口大小变化对分类结果的颠覆性影响同一个研究区我用9×9、15×15、31×31三种窗口跑出来的分类结果差异巨大不是微调而是完全不同。9×9的结果里到处都是山地连谷底的冲积平原都被切成一条一条的碎线31×31的结果里整个研究区一半以上都变成了平原这显然是错的——因为31×31邻域在宽谷区把周围山体的高点也纳入了窗口把明显的河水切割谷地平均掉了。最终我选定15×15窗口再用山体阴影叠加验证分界线基本沿山脚线和沟谷线走才算靠谱。这个调试过程花了大半天但它比任何理论参数都更能说服验收方。建议所有做这类分析的人在汇报材料里附上一张不同窗口尺度对比图直观展示参数选择依据。这比在文字里写经多次试验确定窗口为15×15要专业得多。6.3 边界区域的异常值怎么处理前面提到焦点统计边缘邻域不完整会导致边界起伏度偏低。这个问题模型化之后依然存在。我常用的处理逻辑是先用整体DEM算完起伏度再用研究区掩膜裁剪。模型里的节点顺序一定不能错先算全图再裁剪而不是先裁剪再算。如果模型里为了节省计算量把裁剪放在前面那对不起边界一圈300到500米宽的区域基本就是废的。6.4 不同地貌因子交叉验证的重要性很多项目验收时会要求提供地形因子间的互检结果。我的建议是把起伏度分类结果和坡度分类结果做一次交叉统计。平原区坡度应普遍小于5°丘陵区坡度大多在5°到15°之间山地区坡度超过15°的比例应显著增加。如果交叉统计出现平原区平均坡度超过15°这种明显矛盾的结果就要回去检查前面的步骤。交叉验证不需要额外工具ArcGIS里用Zonal Statistics as Table就能完成以地貌分类多边形为Zone统计坡度栅格的均值、中位数和高坡度面积占比。6.5 关于地形起伏度与坡度的补充说明如果你要做的项目需要进一步做水土流失评价起伏度分类结果可以直接辅助生成坡度分级图两者配合使用效果更好。另外有人问地形起伏度能不能用标准差来代替我的看法是在大多数地貌分类任务里Range比StdDev更直观、更接近分类标准中的定义建议优先使用Range。如果你用ArcGIS Pro流程完全一致工具位置略有不同但功能并无本质差别。Pro中Focal Statistics的工具界面更友好可以直接在历史记录里查看执行参数这对我调试窗口大小帮助很大。最后再分享一个实用技巧做任何地貌分类分析前先花一个小时把研究区的地质构造背景和典型地貌照片看一遍。因为做这类分析不是纯数学游戏你需要建立对这地方到底该长什么样的直觉。有了这个直觉窗口大小、分类阈值、后期修正的方向都会变得非常清晰。先看山再算山最后你的分类结果才能拿得出手。