
做地貌分类这件事在国土空间规划、生态功能区划、地质灾害评估这些项目里几乎绕不开。以前靠人工勾绘翻等高线、对照影像工作量大不说同一个区域两个人勾出来的边界可能完全不一样。现在有了DEM数据和ArcGIS这套工具链完全可以用地形起伏度这个指标自动完成初分类效率提升一个量级。这篇文章我不打算讲泛泛的GIS概念直接演示从DEM数据准备、填洼处理、地形起伏度计算到重分类出图的完整流程并结合做过的实际项目把窗口大小选择、分类阈值调整这些关键参数掰开讲清楚。适合正在做地貌制图、区域地形分析以及需要批量出分类图的同学参考尤其对刚上手ArcGIS Spatial Analyst扩展模块的朋友会很有帮助。我需要先把一个核心观点放在前面地貌分类的关键不是工具多复杂而是你如何理解地形起伏度这个衍生指标以及怎么根据研究尺度确定合适的作用窗口。ArcGIS里的工具命令很简单点几下就出来了但很多人做出来的分类图碎斑遍地、边界乱七八糟多半就是窗口参数和分类标准没想清楚。1. 地貌分类的整体思路与数据准备1.1 为什么用地形起伏度而不是坡度很多人一开始会问坡度分析和地形起伏度都能描述地表形态为什么要选起伏度这里面的门道在于两个指标描述的维度完全不同。坡度是地表某一点的倾斜程度本质是高程对水平距离的导数反映的是“局部微地形”的陡缓。坡度值对DEM里的噪声非常敏感栅格里一个异常的尖峰或凹陷点就可能在局部形成虚假的高坡度区。而且坡度只描述“斜度”不描述“幅度”一个连绵200米的山坡和一个只高差20米的小土坡坡度可能都是20度但它们在地貌学意义上完全是两个东西。地形起伏度则是一个区域概念指某个邻域窗口内最大高程与最小高程的差值。它描述的是“宏观切割程度”能直接反映地面被流水切割的强烈程度。比如平原区起伏度基本在30米以下而高山峡谷区可以超过1000米。用起伏度来做地貌分类结果更稳定、更符合地貌学家的思维习惯也更容易把不同地貌单元的特征拉开。实际项目中还有一个现实考量地貌分类通常要求图斑具有一定的区域完整性坡度图噪声大、图斑破碎后期合并处理的工作量巨大起伏度因为基于邻域统计天然有平滑效果分类结果更利于后续制图综合和空间统计。1.2 DEM数据选择与预处理DEM数据的质量直接决定分类结果的可靠性。先说数据源选择这是很多人容易忽视的第一步。如果是做全国或省级尺度的大区域地貌分类建议用ASTER GDEM 30米或SRTM 90米数据如果做的是市县范围的中尺度区域ALOS PALSAR 12.5米数据和SRTM 30米数据完全够用要是小流域或工程场址这种精细尺度有条件的可以上无人机LiDAR生成的亚米级DEM。分辨率不是越高越好关键要和研究尺度匹配。你拿1米分辨率的DEM去做全省分类数据量爆炸不说地物细节房屋、树木、车辆反而会干扰地形特征的提取导致分类结果碎得像马赛克。数据获取之后有几项预处理工作必须在计算起伏度之前完成投影坐标系确认。地形起伏度计算涉及面积和距离统计几何计算在投影坐标系下更直观准确。如果原始DEM是地理坐标系GCS_WGS_1984这种建议先投影到Albers等面积投影或UTM投影再做后续分析。NoData区域处理。很多公开DEM在湖泊、云覆盖区域会存在NoData空洞。用焦点统计算起伏度时窗口覆盖到NoData会导致输出对应位置也是NoData形成一大片空洞区。处理方法是先查看空洞位置和面积必要时用栅格计算器做插值填补。填洼处理。DEM里存在大量虚假洼地通常是采集误差或内插产生的伪坑这些异常点会让起伏度计算结果出现局部突变。填洼虽然增加了处理步骤但能让后续的起伏度反映真实地形趋势。我用实际项目举例说明填洼的操作流程。打开ArcToolbox依次展开“Spatial Analyst工具 - 水文分析 - 填洼”输入DEM输出设置为Fill_dem1Z因子按需设置如果DEM高程单位是米栅格单位也是米Z因子保持默认1即可如果单位不一致需要换算调整。填洼工具的原理是把低于周边高程的凹陷单元抬升到溢出点高程浅坑会被直接填平真实存在的喀斯特洼地、采坑等地形信息也会被一并抹掉所以是否填洼取决于研究目的。做地貌分类时一般建议填洼因为我们要的是宏观起伏趋势而不是局部微型凹坑。注意如果对填洼影响有疑虑可以先做一次不填洼的起伏度结果和填洼后的结果对比看看差异区域是否集中在已知的洼地分布区再决定是否保留填洼步骤。2. 地形起伏度计算的原理与ArcGIS实操2.1 起伏度的公式与物理含义地形起伏度的数学定义非常简洁R Hmax - Hmin其中Hmax是分析窗口内最大高程Hmin是最小高程R就是该窗口中心位置的地形起伏度单位与DEM高程单位一致通常为米。这里要特别强调“窗口”这个概念。窗口决定了你在多大的空间范围内衡量高差也就是所谓的“分析尺度”。同一个点位用3×3窗口算出来的起伏度和用11×11窗口算出来的结果可能相差数倍乃至数十倍。这不是工具出错了而是尺度选择不同。说到底地貌分类本质上是一个“尺度依赖”问题。山脉的边界、平原与丘陵的界线在不同观察尺度下都会变化。因此你的窗口大小必须和你要划分地貌单元的大小相匹配。做全省尺度的宏观地貌分类一般用几百米到几千米范围的邻域做县城尺度用几百米范围合适做小流域用百米以下窗口更合理。关于窗口怎么选后面我会专门展开讲。2.2 焦点统计工具的具体操作在ArcGIS里计算地形起伏度最常用的是“焦点统计”Focal Statistics工具它属于Spatial Analyst工具集中的“邻域分析”工具组。我每次演示这个步骤都会有人看完惊呼原来这么简单但简单操作背后有一些细节必须注意。打开ArcToolbox - Spatial Analyst工具 - 邻域分析 - 焦点统计界面里需要设置的关键参数如下输入栅格选择预处理好的填洼DEM。输出栅格指定保存路径注意路径中不能有中文和特殊字符这是ArcGIS的老规矩不然容易报错。邻域类型下拉菜单里有矩形Rectangle、圆形Circle、环形Annulus和楔形Wedge等选项。地貌分类一般用矩形或圆形。圆形邻域在各方向距离权重一致不会因为栅格行列方向产生方向性偏差理论上是更合理的方案矩形计算速度稍快因为ArcGIS对矩形邻域有专门优化。我个人习惯在分析精度优先时选圆形在批量处理大范围数据时选矩形以提速。邻域宽度和高度如果选矩形需要设置X方向和Y方向像元个数如果选圆形需要设置半径像元数。这里的关键是“奇数”原则一般设置成奇数像元大小确保窗口以中心像元对称。统计类型下拉列表里选择“RANGE”这就是极差也就是最大值减去最小值正是我们的地形起伏度。参数设置完成后点击确定运行输出栅格每个像元的值就是该位置所在窗口的起伏度。这一步计算量比较大如果数据范围大、窗口大可能需要等待数分钟甚至更长时间。提示统计类型下拉列表里的英文和中文很容易对应错。ArcGIS中文版里“RANGE”翻译为“范围”有的版本翻译成“极差”。不管你看到的是中文还是英文就认准RANGE或者极差/范围别选成MAX或MIN的单值统计。2.3 窗口大小如何选择与验证窗口大小是整个流程中最需要经验判断的一步。我的做法分三步走。第一步先了解研究区的基本地形概况。比如研究区是高山区主山脊间距在几公里量级或是丘陵区沟谷密度较高、地形起伏周期在几百米。通过等高线或绘制DEM山体阴影图确定地形“波长”的粗略范围。第二步根据地形波长初步确定窗口半径。通常选择窗口边长接近或略大于典型地貌单元的平均尺度。举例来说某项目区为低山丘陵山脊到沟谷的距离约为500米DEM分辨率30米那么对应的窗口大约是17个像元左右我选21×21窗口边长为630米这样每个窗口基本覆盖一个完整的地形起伏周期算出来的起伏度最能代表该区域的宏观切割程度。第三步多窗口对比验证。分别计算3×3、7×7、15×15、21×21窗口的起伏度然后对比各结果的标准差和空间分布。有效的窗口应该在保证图斑连续性的前提下把不同地貌单元之间的起伏度差异拉开。实际操作经验是窗口过小时分类图斑极其破碎噪声大窗口过大时不同地貌单元之间的过渡边界会被模糊掉失去分类意义。多次对比后选择一个窗口参数使得分类结果最贴近实地认知这就是最优尺度。这里提醒一点千万别把3×3窗口的“起伏度”当成最终结果直接分类。3×3窗口本质上就是中心像元与周围8个邻域像元的高差极值它反映的还是局部像元间的邻域反差和坡度信息高度重合不具备宏观地貌意义。我做第一版分类时就是用默认3×3结果分类图几乎等同坡度图后来调整到21×21才出效果。3. 地貌分类标准与重分类实现3.1 常见的地貌分类体系与阈值划分地形起伏度栅格算好之后接下来的工作是把连续的起伏度值划分为离散的地貌类型。这个过程在ArcGIS里叫“重分类”。采用哪套分类标准直接决定了成果是否专业可信。地貌学家积累了很多成熟的分类方案我实际使用中最常参考的是以内外力营力为核心、结合海拔与起伏度的组合分类法。简化到只用起伏度一个指标做快速分类时有一个常用的经验阈值体系如下表所示地貌类型地形起伏度范围米典型特征描述平原0 - 30地面平坦切割微弱高差极小台地30 - 70顶面平缓、边缘有明显坡折起伏不大丘陵70 - 200波状起伏沟谷较浅相对高差中等小起伏山地200 - 500山体连绵切割较深相对高差明显中起伏山地500 - 1000山高谷深地形陡峭切割强烈大起伏山地1000极高强度切割多为高山极高山地貌这套阈值不是拍脑袋定的而是参考了《中国地貌分区》和《1:100万中国地貌图制图规范》里对切割程度的量化界定。实际项目里我会根据研究区域的海拔背景微调在青藏高原这种高海拔区域起伏度200米可能已经是高寒台地而非丘陵在东南沿海丘陵区起伏度200米确实已经是典型的低山地形了。所以分类标准要结合区域地理背景来判断不能生搬硬套。另外还要说明一点如果项目要求更全面的地貌分类仅靠起伏度是不够的一般还要叠加海拔分级。比如可以把DEM按海拔划分成低海拔1000米、中海拔1000-3500米、高海拔3500-5000米和极高海拔5000米然后与起伏度分类结果做栅格叠加形成“海拔起伏度”的组合分类体系。这样得到的类型如“中海拔丘陵”“高海拔中起伏山地”等更加科学细致。3.2 在ArcGIS中完成重分类的步骤重分类操作本身非常简单但有几个细节容易出错。在ArcToolbox中找到“Spatial Analyst工具 - 重分类 - 重分类”打开对话框后输入栅格选择起伏度结果栅格Relief。重分类字段保持Value不变。点击“分类”按钮在“分类”对话框里选择分类方法为“手动”Manual类别数量设为6。在“中断值”表格中手动输入各阈值30、70、200、500、1000最高值可以设为99999。在“输出栅格”处设置输出路径名称建议用Landform_Class。确认无误后点击确定。这里提示一下分类对话框里默认会使用几何间隔法或自然间断点法自动生成分类区间千万别直接用。自动分级的区间不可能正好落在30米、70米这些地貌学阈值上必须手动改成我们预设的阈值。很多人做完发现自己平地面积巨大、山地面积几乎为零原因就是默认分类把阈值搞偏了。重分类完成后新栅格的每个像元值对应一个类别代码1代表平原2代表台地3代表丘陵4代表小起伏山地5代表中起伏山地6代表大起伏山地。后续制图时就可以按类别来配色、标注图例了。3.3 分类结果的栅格后处理重分类得到的结果常常有一个问题碎斑太多。受原始DEM噪声和窗口边缘效应影响分类结果里会出现很多一两个像元的“椒盐状”孤立小图斑与周边类型显得格格不入这在制图和统计时很难看。解决这个问题有几个办法我按推荐程度排列第一是众数滤波。使用“Spatial Analyst工具 - 邻域分析 - 众数滤波”工具输入分类栅格设置邻域大小为3×3。该工具会用邻域内出现次数最多的类别替代中心像元对去除孤立噪点非常有效。注意可以连续做两次但别超过三次否则会把有价值的细碎地貌边界也抹掉。第二是“多数过滤”工具Majority Filter它和众数滤波类似但允许设置替换阈值控制更精细。实际效果各有千秋我习惯先用众数滤波再配合栅格转面后的小图斑剔除来完善。第三是栅格转面后的面积阈值过滤。把分类栅格通过“转换工具 - 从栅格转出 - 栅格转面”转成矢量多边形在属性表里计算每个图斑的面积利用“计算几何”功能然后按面积阈值筛选删除小于设定面积的图斑比如小于1平方公里的图斑删除再用“消除”工具把删除后留下的空洞合并到相邻最大图斑。这个方法虽然步骤多一些但控制力最强适合最终成果图生产。经验分享我见过很多人在分类后直接拿原始栅格出图碎斑多到图面没法看。只要肯花5分钟做一次众数滤波图面质量立刻能提升一个档次。这是性价比极高的一步。4. 专题制图与成果输出4.1 分类栅格的符号化与配色方案分类结果出来后制图是决定成果能否被领导和评审专家一眼认可的关键。ArcGIS里的栅格符号化设置相对简单但要做得专业也讲究配色逻辑。在内容列表中右键点击Landform_Class图层选择“属性 - 符号系统”。由于是分类数据应该选择“唯一值”Unique Values而不是“分段色带”。在唯一值窗口中系统会列出所有类别值你需要逐个点击类别前的颜色块来调整颜色。配色我推荐按“从低到高、从冷到暖”的思路平原用绿色系表示平坦低地台地用浅黄色丘陵用橙色小起伏山地用浅棕色中起伏山地用棕红色大起伏山地用深紫色或深红色。这种配色方案符合视觉直觉也不容易引起审美争议。如果默认的颜色方案不合心意可以从“颜色带”下拉框中选择ArcGIS自带的配色方案或者双击颜色块自定义RGB值。这一步骤我建议多花一点时间因为后续所有图面输出都用这个配色配好了可以节省大量返工时间。4.2 图面整饰与专题图输出进入布局视图之前先把图层的显示范围设置好。地貌分类图如果范围过大内容会很小重点区域显示不清楚。我通常会先按研究区边界裁剪出一个与项目范围一致的数据框范围。在“布局视图”下插入必要要素图例用Insert - Legend插入标题写“地貌类型”图例项保留中文类别名。比例尺Insert - Scale Bar选择合适样式单位设为千米。指北针Insert - North Arrow选一个简洁的样式。网格或经纬度坐标Insert - Graticule或Grid设置经纬网间隔出图更专业。标题用Insert - Text添加比如“XX区域地貌类型分类图”。布局排好之后从“文件 - 导出地图”出图格式选择JPEG或PDF。分辨率设置建议不低于300dpi尤其是打印成图册的场合。另外ArcGIS Pro用户可以用“共享 - 导出布局”达到相同效果。5. 常见问题与避坑记录5.1 实操中反复遇到的几个典型问题这些问题都是实际做项目时踩过的坑整理成速查表供大家对照排查现象可能原因排查与解决办法焦点统计输出有大量NoData区域输入DEM本身存在NoData空洞先用IsNull和Con工具检测空洞结合邻域均值插值填补后再计算起伏度结果出现极高异常值DEM存在粗差或未填洼运行填洼工具必要时先做DEM中值滤波消除孤立异常点分类图碎斑极多、边界混乱窗口过小或分类前未做滤波增大邻域窗口分类后执行众数滤波或转为矢量后按面积合并图斑平原面积占比异常大分类阈值被ArcGIS默认方式打乱检查重分类的分级方法务必选“手动”并输入自定义阈值工具运行报错“999999”路径含中文、存储空间不足或Spatial Analyst许可未启用检查自定义路径使用纯英文确认扩展模块已勾选清理C盘临时空间起伏度分类结果与山脉走向完全不符窗口形状选择不当造成方向偏差换成圆形邻域避免矩形邻域在不同方向上统计范围不一致5.2 一点实操心得我刚开始做地貌分类时总想着把所有步骤一步到位结果就是反复返工。后来总结出来的稳妥流程是先小范围试算把窗口参数和阈值敲定再批量跑全区域每个中间产品都起好清晰的名字填洼DEM、起伏度栅格、滤波分类结果各有各的命名避免后面拿着同名文件搞混。还有一个容易忽略的点如果研究区跨多个图幅、需要拼接多个DEM瓦片一定要先做镶嵌再统一投影最后再算起伏度。有人图省事分块计算再镶嵌结果每个分块边缘出现明显的“镶嵌痕迹”因为各块的邻域在分块边缘信息缺失拼出来的起伏度在接缝处出现条带状异常值后期非常难修复。根据我个人经验窗口半径取地形起伏波长的一半左右分类结果在视觉上最均衡阈值体系则至少要参考所在区域的地貌背景微调才能让分类结果既满足规范要求又经得起实地检验。先从小范围试验开始多对比几次再铺开到全域这个流程基本不会翻车。希望这篇文章能给正在做同类工作的朋友一些直接可用的参考。