ArcGIS坡度分析全攻略:坐标系、Z因子与DEM预处理 做坡度分析之前我建议你先想清楚一个问题你要的到底是坡度值本身还是一个“能出图、能写进报告”的结果。因为ArcGIS里坡度分析翻车绝大多数不是操作问题而是对数据状态和计算原理的认知问题。这篇文章把我在实际项目里踩过的坑、验证过的流程、排查过的奇奇怪怪的结果都整理成一份可以照着做的实操笔记。全文不绕弯子从原理讲到参数从预处理讲到可视化最后给一份问题排查速查表适合刚接触坡度分析的同学也适合被坡面图搞到头秃的同行。1. 坡度分析的原理与工具选型先搞懂ArcGIS在算什么1.1 坡度分析到底算的是什么坡度本质上是地表高程在水平方向上的变化率。ArcGIS的坡度分析工具Spatial Analyst工具箱里的Slope输入一张DEM栅格输出一张新栅格每个像元的数值就是该点地表最陡方向的倾斜角单位是度也可以输出百分比。ArcGIS内部用的是Horn算法1981年提出的改进了的差分方法对每个像元取周围3×3窗口计算东西方向的高程变化率dz/dx和南北方向的高程变化率dz/dy然后通过下面这个关系得到坡度角slope arctan( sqrt( (dz/dx)^2 (dz/dy)^2 ) ) * 57.29578这里乘以57.29578是把弧度转成角度。Horn算法相比早期的简单差分法好处是考虑了距离权重对噪声有一定抑制在平坦区域不会输出过于夸张的坡度值。ArcGIS官方文档里写的就是这个算法做研究或写论文时方法说明部分直接引用Horn算法即可。理解了计算原理很多问题就能提前预判。比如坡度结果异常偏大往往是dz高程差被算法捕捉到了异常像元值或dx、dy的实际物理距离因为坐标系问题失真。再比如坡度结果大面积接近0不见得是你的地形真的平有可能是DEM分辨率太低把微地形完全抹平了。所以遇到问题别急着调参数先回到这个公式来想是哪个输入项出了问题。1.2 工具在哪、有哪些关键参数坡度分析工具的位置ArcToolbox里Spatial Analyst工具箱 - 表面分析 - 坡度也可以在搜索面板里直接敲“Slope”找到。工具对话框里有三个核心设置输入栅格必须是DEM高程栅格单位通常是米或英尺。输出栅格指定保存路径。输出测量单位可选“度DEGREE”或“百分比PERCENT_RISE”。方法ArcGIS 10.0之后的新版本里还有一个“Planar”和“Geodesic”的选项默认是Planar。如果数据覆盖范围很大或者在高纬度地区做分析建议改成Geodesic它会考虑地球曲率结果更准确但计算量会更大。还有一个容易被忽略的参数是Z因子Z factor它不直接显示在主界面的显眼位置而是放在环境设置Environments里的“栅格分析”选项卡下。Z因子是垂直方向单位与水平方向单位的缩放比例。很多人坡度结果离谱问题就出在这个Z因子上后面第2部分专门展开讲。我个人的习惯是先用默认的Planar 度跑一遍结果把输出栅格的统计值拉出来看一遍再决定要不要换成Geodesic或者调整Z因子。一来能快速了解数据特性二来能避免在错误参数上白跑一整个区域的进度条。1.3 角度单位还是百分比单位按用途选别乱用坡度工具输出的单位在很多教材里讲得比较含糊导致不少人直接默认用百分比出图结果图例上的数值大得吓人。其实这两个单位没有优劣完全看你要拿坡度数据干什么如果用坡度做土壤侵蚀分级、农业适宜性评价、道路选线行业标准里通常用“度”或者“百分比”比如通用的土地坡度分级小于5度为平缓5-15度为缓坡15-25度为陡坡大于25度为峻陡坡用度更直观。如果用坡度做径流模型、水流速度估算或统一接入其他水文分析的输入条件用百分比更合适因为百分比坡度乘以水平距离可以直接得到高差计算方便。如果是做可视化出图展示地形陡缓建议用度配合合适的色带视觉上更符合直觉。百分比的结果在平缓地区容易显得“一片白”反而掩盖了细节。两种单位之间换算关系很简单百分比坡度 tan(角度) × 100%。坡度为45度时百分比为100%坡度为90度时百分比趋近无穷大。所以你在图例里看到几千几万的百分比坡度值不要慌那是接近垂直的悬崖区域算法在个别像元上算出了极大的斜率值。2. 坐标系与Z因子九成坡度异常的根源2.1 为什么经纬度坐标系下做坡度分析会翻车这是我在帮助同行排查问题时遇到最多的情况DEM数据是地理坐标系GCS_WGS_1984或者类似的经纬度坐标系直接拿去做坡度分析结果出来坡度值几乎全是0到1之间的微小值或者出现负值、超过90度的荒谬值怎么看怎么不对。原因并不复杂。坡度计算的公式里水平方向变化率dz/dx和dz/dyx、y表示的是水平距离。地理坐标系下每个像元的水平尺寸是用经度、纬度度来度量的而高程值Z是用米或英尺来度量的两者单位根本不统一。比如一个DEM像元大小可能是0.0005度约50米高程变化是5米但算法无法自动理解“0.0005度”和“5米”之间的关系只能在数值上直接比较结果就是水平变化率被严重低估坡度趋近于0。有些老版本的ArcGIS在平面投影下做坡度分析即使坐标系是地理坐标也不会报错只是结果完全是垃圾值。这一点特别坑因为软件不拦你只有你回头检查结果才会发现数据废了。解决办法有两种把DEM重投影到适合该区域的投影坐标系比如UTM、高斯-克吕格、或者区域性的Albers等积投影。保证投影后像元尺寸的单位是米或英尺这样水平方向和垂直方向单位一致坡度计算结果才准确。如果不方便重投影必须在经纬度坐标系下做分析那么需要手动设置Z因子让水平单位度换算到与Z单位米可比较的量级。Z因子不是随便填的后面给出计算方法。2.2 Z因子的原理与计算公式按纬度去查别凭感觉填Z因子Z factor的定义是垂直方向单位与水平方向单位的比值理解成“高程单位需要乘以多少才能与水平单位对齐”。当水平单位是米、高程单位也是米时Z因子等于1这是最常见的情况。当水平单位是度时Z因子的取值就变得很关键了。对于经纬度坐标系一个经度的实际距离在不同纬度上差别很大而一个维度纬度的1度基本恒定约111320米。ArcGIS官方文档给出的参考公式是Z factor 1 / (111320 × cos(latitude))这里的latitude是你要分析区域的中心纬度。比如在纬度30度的地方Z factor 1 / (111320 × cos(30°)) 1 / (111320 × 0.866) ≈ 0.00001037。在纬度45度的地方cos(45°) 0.707Z因子约等于0.00001271。纬度越高cos值越小Z因子越大这意味着算法需要把水平距离的“度”折算成更远的实际距离坡度才会被正确放大。把Z因子设置成0.00001上下这个量级大概率跟ArcGIS官方文档的思路基本一致。但我的建议是能重投影就重投影别依赖Z因子。原因是Z因子的公式用的是目标区域中心纬度的一个近似值而DEM覆盖范围内纬度跨度一大每个纬度位置的真实距离比例都在变化单个Z因子根本无法完全纠正这种变异。最终结果在这个跨度大的区域内坡度值会系统性偏小或偏大北部和南部的精度不一致。2.3 重投影时的操作细节选投影坐标系要看区域位置重投影DEM的时候别直接Web墨卡托一把梭。Web墨卡托WGS 1984 Web Mercator虽然全球通用、很多在线底图用它但它以米为单位的同时在高纬度地区面积变形极其严重用这种投影做坡度分析纬度越高坡度值越不靠谱。正确的做法是根据目标区域所在的纬度带和经度跨度选择合适的投影中纬度地区优先选UTM投影每个UTM带覆盖经度6度适合范围不大的区域。大区域或国土尺度分析选Albers等积投影或者兰伯特等角投影。高纬度地区不要用UTM某些纬度带UTM可用范围有限可以考虑极地方位投影或自定义的横轴墨卡托投影。以国内分析为例如果是做某个县的坡度分析高斯-克吕格投影按3度带或6度带就很合适如果做全国尺度的坡度分析用阿尔伯斯等积投影是常见做法。重投影时要注意DEM数据最好用双线性插值或三次卷积插值不要用最邻近法。虽然最邻近法保留原始值、速度最快但DEM是连续表面最邻近法会让地形细节出现明显的块状人工痕迹后续坡度计算容易在边界上产生锯齿状伪影。我个人在重投影DEM时默认用双线性插值精度要求高的项目用三次卷积。还有一个隐藏坑重投影之后的像元尺寸Cell Size会发生变化尤其当你手动指定一个比原始DEM粗糙或精细的像元大小时坡度结果会明显不同。这个不是错误是完全正常的地表概括效应——像元越大微地形越平滑坡度越缓和。所以对比不同区域的坡度结果必须先统一像元尺寸。3. DEM数据预处理别拿垃圾数据去算坡度3.1 DEM里的空洞NoData和异常值有多大影响DEM数据在生产过程中受云层遮挡、传感器噪声、拼接误差等影响经常出现局部空洞像素值为NoData和异常高程值。坡度分析对这类数据特别敏感原因在于Horn算法依赖3×3窗口内所有8个邻域像元的高程值只要窗口内有一个异常值计算出的dz/dx或dz/dy就可能完全失真结果就是一个孤立但极其夸张的坡度值。我见过一个典型案例一个县域DEM整体坡度结果合理但某个山谷区域出现了一条亮白色的“光带”坡度值普遍在80度以上。排查后发现该区域DEM中有一行像元的数值异常偏低比周围真实地形低了将近100米导致算法在东西方向上检测出巨大的高程变化率坡度自然爆表。所以拿到DEM的第一步不要直接跑分析先做质量检查。质量检查的三个常规操作查看栅格统计值Raster Calculator里算一次栅格的Min/Max/Mean/StdDev重点看最大值和最小值是否在合理范围内。普通陆地高程通常在-100米到8000米之间某些区域除外如果出现-9999、-32768这类填充值或上万米的异常值说明数据存在大量填充残留或拼接错误。检查NoData空洞的分布。在ArcMap或ArcGIS Pro里用“栅格信息”工具或直接显示NoData区域看空洞面积占比和分布位置。若空洞零星分布且面积很小可以用“焦点统计”配合“条件函数”做填充若空洞面积很大说明原始数据质量差建议更换数据源别强行填补。用“地形”表面工具生成一个等高线层来目视对比或与高分辨率影像叠加以识别明显的高程跳变区域比如山谷里突然凸起一个山脊形状的条带往往是数据接边误差。3.2 空洞填充的实操焦点统计 条件函数对于零星空洞操作上可以用Spatial Analyst里的“焦点统计Focal Statistics”生成邻域均值栅格再用“条件函数Con”只把原NoData位置替换成邻域均值。具体步骤是这样的用“焦点统计”工具输入DEM邻域类型设为矩形宽度和高度按DEM分辨率调整比如3×3或5×5像元统计类型选“平均值”。这一步生成一个全区域平滑后的栅格。打开“栅格计算器”输入表达式Con(IsNull(dem), focal_mean, dem)意思是如果原始DEM在该像元是NoData取焦点统计结果的值否则保留原始DEM值。这里要注意邻域窗口越大填充值越平滑如果空洞面积较大建议分多次填充先填3×3再填5×5逐步扩大窗口减少填充痕迹。对大多数分析来说零星空洞用这个方法足够。还有一种情况是DEM有值但明显异常比如高程出现负值或突然跳变。处理这类异常的思路类似先通过条件函数把异常值改成NoData再走一遍空洞填充流程。条件表达式可以根据你的数据范围来写例如Con((dem -100) (dem 6000), dem, dem_noisy)用这个表达式生成一个新栅格异常位置为NoData再执行填充步骤。这样可以比较干净地保留有效数据。3.3 要不要“填洼”看你的坡度分析目的水文分析里填洼Fill是常规预处理因为洼地会阻断水流路径。但做坡度分析时要不要填洼完全取决于分析目标。如果坡度分析只是用来描述地形陡缓、做土地利用适宜性评价那么不要填洼。因为洼地是真实地形的一部分填洼会人为抹去局部低洼区域的地形特征坡度结果在洼地周边会失真。如果坡度数据要作为水文模型的输入比如用坡度计算径流方向、汇流累积量那么一般建议在填洼之后再做坡度分析。原因很简单未填洼的DEM存在封闭洼地水流会停在里面这不符合现实情况模型无法正确汇流。而且ArcGIS的“填洼”工具会生成一个新的DEM正好用来做后续的水文分析。需要注意填洼对坡度结果的影响集中在原洼地边界附近的像元上影响范围通常不大。但如果你在一个喀斯特地貌或人工矿区做分析洼地数量多、面积大填洼带来的坡度变化就不可忽视了这时候最好在报告里如实说明预处理方法。3.4 分辨率选择坡度分析中的“尺度陷阱”DEM分辨率对坡度结果的影响很多人要到对比实验时才意识到。同一个区域30米分辨率的DEM算出的平均坡度和12米分辨率的ASTER GDEM算出的平均坡度差距可能达到3-5度30米的更平缓。原因不难理解栅格分辨率越粗一个像元覆盖的地面范围越大像元内部的微地形变化被平均掉整个区域表现为被“磨平”的效果坡度自然变小。分辨率越细真实的沟谷、陡坎、路堤等地形细节能被保留下来坡度值更真实但也更“暴躁”。所以做坡度分析前先确定分析尺度如果做全国或大区域的宏观坡度分级用90米甚至250米分辨率的DEM都够用还省计算资源。如果做一个小流域或小丘陵区的精细坡度分析尽量用12.5米或10米分辨率的DEM。如果做城区或重点工程区域的坡度分析最好是1米或2米的机载LiDAR DEM精度完全不是一个量级。另一个容易忽略的点是当多幅DEM拼接时不同源的分辨率不一致拼接后选一个统一的输出像元尺寸往往需要重采样。这时较粗的DEM会被重采样到较细的像元但高程信息并没有增加坡度结果会显得过度平滑。办法是重采样到两者都能接受的中等分辨率别迁就数据里最细的那个然后硬拉到统一尺寸。4. 完整实操流程从检查数据到出坡度图4.1 开工前的检查清单我把一次比较稳妥的坡度分析流程拆成了几步每一步都是为了减少后边返工的可能性。以下是我个人习惯的顺序符合ArcGIS的操作逻辑检查DEM坐标系右键图层 - 属性 - 源看一眼坐标系是投影坐标系还是地理坐标系。查看DEM分辨率检查栅格元数据里的像元大小Cell Size记录X、Y单位。检查高程单位栅格里存的高程值是米还是英尺这在元数据或者获取数据的说明里能看到。查看DEM统计值在识别工具里点几个点或直接用栅格计算器看Min/Max。检查NoData分布条件函数统计NoData比例或用地图显示判断。确认分析区域范围如果只需要局部区域的坡度先用“提取分析/按掩膜提取”别拿全图跑浪费时间。这套检查看起来繁琐但一整套做下来也就五分钟。很多时候项目卡在结果异常上回头一查就是坐标系单位忘了看。4.2 步骤一准备一个“统一单位”的DEM如果你的DEM是地理坐标系且区域跨度不大我建议直接重投影。以中纬度一座县级市为例操作是打开“投影栅格”工具Data Management工具 - 投影和变换 - 栅格 - 投影栅格。输出坐标系选择该区域的UTM带或高斯-克吕格投影。重采样方法选择“双线性”。输出像元大小保持跟原始DEM一致或按需要设定。如果DEM已经是投影坐标系且水平单位是米高程单位也是米那这块可以直接跳过。判断依据很简单查看源信息里“线性单位”是Meter高程是Meter那Z因子默认就是1不需要额外设置。这里提一个容易踩的细节某些DEM产品高程单位是厘米比如LiDAR衍生DEM可能是厘米精度。如果高程单位是厘米而水平是米那Z因子要设置成0.011厘米 0.01米。不设置的话坡度结果整体会放大100倍非常离谱。每次拿到新数据先看一眼高程单位是规避这类问题的关键习惯。4.3 步骤二执行坡度分析在ArcGIS Pro或ArcMap中打开“坡度”工具参数如下设置输入栅格准备好的DEM。输出栅格指定保存路径命名清晰比如“slope_deg_30m”。输出测量单位选“度”或按需求选“百分比”。方法区域不大选“Planar”区域跨越大或高纬度选“Geodesic”。在“环境设置”里栅格分析 - 像元大小如果做区域对比设置一个固定的像元大小比如统一为30米。处理范围与分析范围一致。并行处理因子如果机器配置好可以适当调高并行处理加速大区域计算但别开爆内存。跑完以后右键图层 - 打开属性表或者符号系统查看统计值。一个合理的坡度分布区间应该符合目标区域的实际情况。如果统计值里出现超过90度的值在“度”单位下超过90是无物理意义的或者最大值极小比如全部小于0.01度就要停下来检查Z因子和坐标系而不是直接出图。4.4 步骤三坡度结果的可视化与分级坡度结果是一张连续值栅格直接加载时会自动使用红绿黄拉伸看着很花哨但并不适合正式出图。我建议用“分类”或“自然间断点”的方式做分级设色。常见的坡度分级标准可以参考水土保持或国土部门的标准等级坡度范围度分级含义10-5平缓地25-15缓坡地315-25坡地425-35陡坡地535峻陡坡地在符号系统里选择“分类”类别数设为5断点按上述标准手动设定颜色从绿色渐变到红色。注意如果目标区域整体很平缓直接用固定断点会导致大部分区域都显示为同一颜色看不出地形变化。这种情况可以用“分位数”或“自然间断点”来观察数据分布但是出图时要标注好分级方式别让读者误解。除了坡度分级图还可以用“山体阴影Hillshade”和坡度图叠加显示。方法是把Hillshade结果放在下层设置透明度和色带叠加既能保留坡度分级信息又能展示地形起伏视觉效果好很多适合项目汇报和论文插图。4.5 步骤四统计与成果输出坡度分析的最终产出往往不是一张图而是一组统计数字。比如“项目区坡度大于25度的面积占比为18%”这类指标在土地适宜性评价、水土流失评估、规划选址中很常见。统计的常用工具是“区域分析 - 面积制表Tabulate Area”或者用“以表格显示分区统计Zonal Statistics as Table”。如果你只是对整个分析范围做一个统计不需要分区直接打开坡度栅格的属性表查看像元数量乘以像元面积注意单位换算比如30米乘30米等于900平方米即可得到面积。实操中如果像元数量特别大用“面积制表”工具直接生成一个表输出到dbf或csv。这里有个单位陷阱像元面积要换算成平方千米或公顷时别被千进制的换算整迷糊了。30米分辨率像元面积是900平方米10000个像元是9平方公里这个乘算没毛病但要检查输出表里有没有已经做过换算的字段例如“Area”字段有时会直接以平方千米为单位取决于工具版本和坐标系设置。5. 常见问题速查表遇到异常结果怎么排查5.1 八种典型异常及处理方向我在多个项目里碰到过各种坡度分析翻车现场整理成一张速查表遇到症状直接查表定位异常现象可能原因排查与解决方向坡度值全部极小趋近0地理坐标系下未设置Z因子或高程单位为厘米检查坐标系重投影到投影坐标系检查高程单位设置正确Z因子坡度值出现负值或大于90度DEM中存在异常像元或NoData干扰预处理DEM填充空洞剔除异常值重跑坡度坡度图出现条带或条纹DEM原始数据存在接边误差或扫描噪声重检查DEM对可疑区域放大检查必要时用平滑滤波但需谨慎不要过度平滑坡度图呈明显的锯齿状重投影用了最邻近法或DEM分辨率突然变化重投影时改用双线性/三次卷积插值统一像元大小坡度值整体偏大Z因子设置过大或Geodesic方法下比例因子设置错误复核Z因子确认水平/高程单位必要时退回Planar方法坡度值整体偏小Z因子设置过小或DEM分辨率过粗复核Z因子检查数据分辨率是否满足要求坡度结果在某区域异常突出该区域DEM空洞/异常值未被清除单独提取该区域检查DEM填补或剔除异常数据后重跑两个相邻区域的坡度结果对不上使用了不同分辨率/不同投影的DEM统一坐标系、像元大小和Z因子设置重新计算这里有一个实操心得当你调试坡度结果时建议先在一个小范围区域比如一个乡镇、一个流域测试参数确认合理后再跑全区域。这样能把排查参数的时间缩短到几分钟而不是每次等全图跑完才发现方向不对。5.2 排查日志一个“坡度全部为零”的实战过程有一次一位做土地整理的同行发来一张截图问我为什么他的坡度分析结果全是0到0.001的范围图面一片绿根本没法用。我先问了他两个问题数据源是什么坐标系高程单位是什么他回复DEM是WGS84地理坐标系高程单位是米直接从网站下载的。到这里问题基本确认了——地理坐标系下水平单位为度但Z因子没有设置ArcGIS默认Z因子为1于是算法把一个“度”的水平距离当成了“1米”来算水平变化率被低估了近十万倍坡度自然趋近0。我给的处理办法很简单不重投影因为他的区域还涉及其他地理坐标系数据直接用Z因子修正。以区域中心纬度30度左右计算Z因子设置为0.00001量级重新跑一次坡度结果分布恢复正常最大值出现40多度分布曲线也符合当地丘陵地形特征。这个故事想说明两点。第一故障排查的关键往往不是操作技巧而是对单位换算的敏感性。第二遇到异常结果先检查“坐标系Z因子单位”这三个元凶再考虑DEM数据质量问题别一上来就怀疑算法或软件。5.3 避坑指南五个容易被忽略的小问题除了上面的表格我再补充几个日常工作中容易被忽略、但确实会影响成果质量的点。第一个是“输出路径和名字不要用中文和特殊字符”。ArcGIS对栅格数据的输出路径很挑剔中文路径偶尔会触发奇怪的问题比如工具报错、结果无法加载。虽然现在较新版本有了改进但稳妥起见工作目录和中间数据都用英文命名最终出图时再改显示名称即可。第二个是“坡度分析之前想清楚是否要做水文填洼”。这个问题在第3部分讲过但真的值得再强调一遍因为很多人拿到DEM就默认做一个填洼再算坡度导致真实地形细节被抹掉最终结果用于土地评价时偏离实际。第三个是“当分析范围跨越多个UTM带时最好不要用UTM投影”。UTM带之间投影参数不同单幅图跨带会导致明显的变形和不连续。这时候选Albers等积投影更适合大范围连续分析。第四个是“坡度结果重分类后面积统计要卡在分类边界上”。比如分类标准是“坡度大于25度为陡坡”做面积统计时如果你用的是重分类后的栅格要确保原始坡度值正好落在25度的像元被分到正确的一类里不要因为浮点运算的微小偏差导致边界像元被错分。可以先用“栅格计算器”生成一个条件栅格大于25度为1其他为0再做面积统计一步到位。第五个是“注意软件版本差异”。ArcMap的坡度工具和ArcGIS Pro的坡度工具在参数名称和默认值上略有差异。比如ArcMap旧版本里没有Geodesic方法默认PlanarArcGIS Pro里方法选项默认Planar但Geodesic选项已经比较常见。如果你在ArcMap里生成的地理坐标系坡度结果放到ArcGIS Pro里打开默认拉伸方式也可能不一样导致视觉上“看起来”结果变了但数值没变。遇到这种情况不要慌对比一下统计值确认即可。6. 几点总结性经验这篇文章从原理讲到实操最后落到问题排查核心还是那句话ArcGIS坡度分析本身不难难的是理解数据从哪里来、单位是什么、算法怎么算。用我个人做过多年的GIS分析经验来收个尾。第一件事是每次拿到新的DEM数据不论来源我都坚持花几分钟做质量检查。这个习惯救了我至少三次因为有的数据源看似正常内部实际混着错误投影和填值异常不查就开跑后面全是白工。第二件事是坡度分析的结果最好永远保留两个版本一个原始度单位版本一个重分类版本。原始版本用于复查和后续深度分析重分类版本用于出图和统计。不要图省事只保留最终符号化的成果后期想调整分级标准时没有原始栅格会非常被动。第三件事是如果可能尽量在用坡度的人面前解释一句“单位是度分类标准用的是XX规范”省去后面数据被误解的麻烦。最后再分享一个小技巧无论你是做论文还是项目报告坡度分析的流程图、参数设置截图、原始统计值和分类方案尽量全部保留在项目记录里。这不仅是可复现性的要求也是为后期论文审稿回复和专家质询留一手。数据治理的本质不是做的时候多费劲而是别人问起来的时候你不心虚。坡度分析是小事但小事做成习惯整个GIS项目的质量都会上一个台阶。