ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

3D Analyst栅格重分类:原理、操作与避坑指南

3D Analyst栅格重分类:原理、操作与避坑指南 Arctoolbox系列教程写到第三篇今天终于要碰一碰3D Analyst里最容易被忽略、其实出场率又极高的一个工具栅格重分类。很多朋友一听到3D Analyst第一反应就是坡度、坡向、山体阴影、视域分析这些地形专用工具潜意识里觉得它跟“重分类”这种基础栅格操作没什么关系。但实际打开工具箱就会愣住3D Analyst工具集里确实藏着一个完整的栅格重分类工具甚至在不少项目里它是整个3D分析流程的前置步骤。说白了这个工具解决的是栅格数据“从连续值到离散类别”的映射问题。DEM高程、坡度角度、NDVI指数这类连续栅格机器读得懂但人的决策逻辑是按“高海拔、中海拔、低海拔”“缓坡、陡坡、极陡坡”这种分类来推进的。如果你手里暂时只有3D Analyst的授权没有Spatial Analyst或者你正在做地形分析相关的数据预处理那这个工具就是你绕不开的一环。这篇文章我把它的原理、定位、完整操作、参数细节、容易踩的坑全部过一遍无论你是刚入门的学生还是做土地规划、林业、地质的老手应该都能找到自己需要的那部分内容。1. 为什么3D Analyst工具箱里会藏着重分类工具1.1 3D Analyst不是只做地形分析很多人对3D Analyst的认知来自“3D”这两个字觉得它只跟TIN、LAS点云、三维可视化、天际线分析打交道。这个印象不算错但太片面了。打开ArcToolbox里的3D Analyst工具集你会发现里面其实有大量和三维表面分析紧密相关的栅格处理工具栅格重分类Reclassify就放在“栅格重分类”这个工具组下面和切片、栅格计算器、区域分析这些功能并列。为什么栅格重分类会出现在这里因为3D分析的工作流相当大一部分是拿连续表面数据来看“合不合适”“属于哪一类”某片区域适不适合建楼要看坡度是否超过限制某个点位能不能看见目标点要先按高程或可见性做类别划分填挖方计算之前也要先对原始地表做分级处理。这些操作统统需要先把连续栅格“类别化”不重分类后面那些三维分析工具根本没法往下走。所以3D Analyst里的重分类不是“送错门”的功能它更像是3D分析流水线上一个不起眼但必不可少的前置环节。理解了这层逻辑你就明白为什么这篇文章不叫“Spatial Analyst之栅格重分类”而要专门讲3D Analyst这一侧的工具了。1.2 重分类在3D分析工作流中的位置拿一个最常见的场景来举例你想基于DEM做建设用地适宜性评价第一步通常是把高程栅格按一定间隔分成若干等级比如0到200米为一级、200到500米为二级、500米以上为三级。做完这个分级之后再去和坡度分级、土地利用分类叠加通过加权评价算出最终适宜性分数。这时候重分类起的作用就是“统一量纲、压缩类别”。原始DEM的高程值是米坡度是度土地利用是类型编码三者量纲完全不同没法直接相加。但只要各自重分类成1、2、3、4这样的等级值就都变成了有序分类变量后面的加权叠加就说得通了。再比如视域分析工具内部其实也经常要做类似的栅格值重映射只不过被封装在工具内部用户看不到。你手动用重分类很多时候是为了给这些分析准备一套语义更明确的输入数据做起来心里更有数审计和复核也更方便。1.3 与Spatial Analyst重分类的功能差异这是很多老用户都疑惑过的问题Spatial Analyst工具集里也有一个重分类工具它和3D Analyst这个到底有什么区别办公环境里如果两个扩展模块都装了到底该用哪一个我直接说结论功能上基本是同一套东西参数设置和输出结果几乎一致。差别主要在授权依赖和工具所处的工具箱位置。如果项目里只买了3D Analyst的许可就必须在3D Analyst这一侧找工具反过来也是同理。如果你两个模块都有优先用Spatial Analyst也不会有什么问题但要注意保持整个项目的工具箱统一别这次用3D Analyst、下次用Spatial Analyst最后写文档的时候自己也分不清哪个工具出的结果。另外提醒一句不管是哪个模块的重分类都需要在ArcMap的自定义菜单里勾选对应扩展模块否则工具会呈灰色不可用状态。这个细节后面展开讲。对比项3D Analyst重分类Spatial Analyst重分类授权依赖需要勾选3D Analyst扩展模块需要勾选Spatial Analyst扩展模块工具位置3D Analyst工具 - 栅格重分类 - 重分类Spatial Analyst工具 - 重分类 - 重分类核心功能栅格值重新映射栅格值重新映射适用场景地形分析、三维表面预处理通用栅格分析、适宜性评价输出格式同输入栅格同输入栅格2. 栅格重分类到底在做什么原理和典型应用场景2.1 几分钟理解重分类的本质栅格重分类这个词听起来高大上本质上就是查表替换。输入栅格里每个像元都有一个数值你给工具一张映射表旧值区间A映射成新值1旧值区间B映射成新值2。工具遍历全部像元按这张表重新赋值然后输出一个新的栅格。这不就是数据库里的UPDATE语句吗对思路完全一样。但很多初学者会在这里绕弯子以为重分类是在做数学运算比如把高程值乘以0.5或者做一个归一化。那是栅格计算器的事。重分类的独特之处在于它负责“离散化”。这就像把全班同学的成绩按分数段划分成优、良、中、差四个档位学生的原始分数还在但你已经不关注80分和85分的差异了你只关心他属于哪一档。这一点想通了后面很多参数就都好理解了。比如为什么重分类之后栅格的属性表会变成Value Count两列因为工具输出的已经是类别编码每个像元值只代表类别编号Count统计的就是这一类包含多少个像元。你打开属性表看到的不是原始高程分布范围而是每个等级覆盖的面积统计这个变化是区分“重分类前”和“重分类后”最直观的指标。2.2 典型应用场景从土地适宜性到地形分级重分类最经典的应用领域就是多准则评价。简单说你手上有五六个栅格图层每个图层都代表一个评价因子高程、坡度、坡向、距水源距离、土地利用类型需要把这些因子按权重叠在一起算出一个综合得分。但每个因子的原始数值范围不一样坡度可能是0到60度高程可能是50到2000米这种状态下不能直接加权必须先把每个因子重分类成相同的等级体系比如1到5分再做加权叠加。地形分级也是高频场景。做地貌分类时通常需要把DEM按海拔切成平原、丘陵、低山、中山、高山等类型切分的阈值来自行业规范或研究区实际情况。用重分类的“分类”功能可以快速按预设的阈值生成分类栅格一步到位。林业上做立地条件评价草地上做植被覆盖度等级划分用的也是同一套逻辑。还有一类场景是数据压缩和简化。原始栅格可能是浮点型一个文件几百兆重分类成少量类别之后数据量会明显下降后续处理速度更快。虽然这不是重分类被发明出来的初衷但实际项目里确实有很多人这么用尤其是在处理大范围、高分辨率的DEM时。2.3 重分类与符号化、栅格取整的区别这个坑我必须单独拎出来说因为几乎每届学生都会踩。你在图层面板里把DEM按高程分成几段用不同颜色显示出来这不是重分类这只是在符号化。符号化改变的是“显示方式”层的原始数据一个字节都没变。重分类则是真刀真枪地生成一个新的栅格旧值被永久替换成了新类别的整数值。另外一个容易混淆的操作是栅格计算器里的INT()取整函数。INT(高程 / 100)确实能生成整数栅格也能起到一定的分类作用但它只是数学取整不具备“重映射标签”的功能。实话说你要做等间距分级INT()勉强能用但要处理不规则的分类阈值比如0到200是1级、200到800是2级、800以上是3级用INT()写表达式就很费劲远不如重分类工具直接。用一句话概括这三者的区别符号化是给栅格“戴滤镜”INT()是给栅格“做算术”重分类是给栅格“换标签”。绝大多数实际工作流里需要的是第三种。3. 完整实操在3D Analyst中完成一次栅格重分类3.1 环境准备与授权检查在打开工具之前先确认环境没问题否则很容易在第一步就被卡住。我这里以ArcMap 10.x版本为例ArcGIS Pro的差异后面单独说。第一步打开ArcMap确认栅格数据已经加载到内容列表中。如果你刚启动软件什么都没加载打开重分类工具后“输入栅格”下拉框往往是空的很多人这时候以为工具坏了其实只是图层没加进来。第二步检查扩展模块授权。依次点击“自定义”-“扩展模块”在弹出的对话框里勾选“3D Analyst”。如果这一项呈灰色或没办法打勾说明你的软件授权文件里不包含3D Analyst那这篇文章后面内容可能就需要你用Spatial Analyst或找管理员申请授权了。这一步不做好工具里的参数都填完了“确定”按钮还是灰的非常耽误时间。第三步顺手检查一下输出环境的设置。在“地理处理”-“地理处理选项”里看一眼“当前工作空间”和“临时工作空间”指向的路径有没有写权限。重分类生成的临时栅格会占用临时目录空间如果临时目录在系统盘且空间不够处理大数据量时会直接报错“磁盘空间不足”。我曾见过一个同事因为这个原因折腾了半天最后清理了C盘临时文件才跑通。3.2 逐步操作以DEM高程分级为例环境准备好之后操作本身其实不复杂。我以一段DEM数据的等间距高程分级为例走一遍完整流程。打开ArcToolbox依次展开“3D Analyst工具”-“栅格重分类”-“重分类”工具双击打开对话框。第一步在“输入栅格”下拉框里选择你要处理的DEM图层。这里有个小细节如果下拉框里找不到可以直接点右侧的浏览按钮在磁盘上找到你的栅格文件它会自动加入下拉框并加载到内容列表。第二步“重分类字段”选择Value。对于普通单波段栅格来说默认就是Value字段不用改。但如果你处理的是多波段影像或者栅格属性表里有其他字段这里就可以选择不同的字段来做重分类。这个灵活性在某些特殊场景会用到比如把某种分类栅格按属性表中的“类别代码”字段重新映射。第三步点击对话框下方的“分类”按钮打开分类设置窗口。这个按钮不怎么起眼但它是整个重分类工具的“灵魂”因为所有分级方法、断点值都在这一个窗口里设置。在分类窗口里“方法”下拉框默认是“等间距”这是最常用的方法在“类别”输入5点击“确定”工具会自动按整个栅格的最小值和最大值等分出一个五级的断点列表。如果你对自动断点不满意可以手动修改“中断值”列表里的数值甚至直接在“类别”旁边手动输入断点。第四步回到重分类对话框你会看到一张映射表左边是“旧值”区间右边是“新值”。工具已经按刚才设定的断点自动填好了从1到5的新值序列。如果你想把某个区间设置为NoData而不是某个类别可以在右边那一列把对应的新值留空或用鼠标右键选择“将范围更改为NoData”后续分析的时候这个区间就会被忽略。第五步“输出栅格”这里指定保存路径和文件名。这里建议不要用默认的临时路径因为临时文件在软件关闭后可能被清理项目过程文件还是老老实实存到自己的工程目录下方便追溯。最后点击“确定”工具开始执行。执行完成后ArcMap会自动把输出的重分类栅格加载到内容列表里默认用渐变色符号化显示。3.3 分类方法与断点设置的取舍“分类”窗口里那排分类方法选项很多人从来不点开但我建议你还是认真看一眼。不同方法背后对应完全不同的数据分组逻辑选错了分类结果可能跟你想要的南辕北辙。等间距没什么可说的按最小值和最大值的差等分成N段适合数据分布比较均匀的情况。分位数则更有意思它保证每个类别里的像元数量大致相同。比如数据集中在低值区域等间距会把低值区域挤成一类分位数就不会它会把低值区域切得更细。自然间断点Jenks是很多人喜欢用的一种方法它会根据数据本身的聚类特征找到最佳断点让组内差异最小、组间差异最大。如果你的数据分布很不均匀、又找不到行业规范阈值用自然间断点通常不会太离谱。几何间隔适合数据呈正偏态分布的情况比如大部分值集中在小数值区域极少数值延伸到很大的数值这种时候按几何级数划分比按等差划分更合理。标准差法不多见但要做统计意义上的分级时很有用它按均值和标准差的倍数来划分输出结果能直观体现离群程度。选好方法之后再手动微调断点。我的习惯是先看输入栅格的直方图分布再决定断点落在哪里。尤其是做分类阈值必须符合行业规范的场景比如水土保持里坡度分级按≤5°、5°到8°、8°到15°这种标准走这时候自动断点一个都不能用全部要手动改成规范阈值。3.4 输出与结果检查重分类工具跑完之后千万别急着关了软件就走人。养成一个检查输出栅格的好习惯能帮你及时发现前面参数设置的问题。第一步打开输出栅格的属性表。正常情况下属性表里会多出几个字段包含Value新类别值、Count该类别像元数。检查一下类别数量是不是和你在分类窗口里设置的类别数一致。如果少了很可能是某些区间的像元数为0工具自动把空类去掉了。第二步计算一下总面积看是否合理。把各个类别的Count加起来乘以栅格分辨率应该等于输入栅格的像元总面积。这个简单的守恒检查能帮你发现NoData处理是否影响了范围。比如你把某个区间设为NoData之后输出的有效面积会变少这是正常的但你需要确认变少的部分确实是你不关心的区域。第三步拿重分类结果和原始DEM叠加对比。把原始DEM设成半透明叠在下面重分类结果放上面随机选几个位置比对高程值和类别是否匹配。这个步骤看起来笨但确实是抓断点设置错误的最有效手段。4. 参数细节与界面版本差异别让工具窗口把你绕晕4.1 重分类字段与NoData处理重分类对话框里的参数并不多但我见过的报错、困惑有一半都出在“更改缺失值”和NoData处理这两处。先看“将NoData更改为”这个选项。默认情况下它是勾选的后面还有个下拉框通常显示“NoData”意思是原始栅格里的NoData像元在输出中仍然是NoData。这在大多数场景下是合理的选择你不想让无效区域被分类成有意义的值因为那会污染后续统计。但也有些场景需要反过来比如做面积统计时你想让NoData区域也占用一个类别方便后面单独分析这时你可以把它改成某个具体值比如99。另一个容易让人迷惑的是“反向”这个复选框。勾选它之后新值顺序会倒转原来映射为1的变成映射为5原来映射为5的变成映射为1。看起来就是一个反序小功能但在地形分析里很常用比如坡度本来从缓到陡是1到5你想让评价结果变成分值越高越适合建设那直接把“反向”勾上就把最陡的区域映射成1分了非常方便。还有“保存删除的重分类”选项勾选后会在输出栅格旁边生成一个XML文件记录原始值和输出值对应的详细信息。我建议在项目关键节点勾上它尤其是做同行评审或成果提交时需要保持数据可追溯它能让你回头查清每个类别当初是基于什么阈值划分的。4.2 ArcMap与ArcGIS Pro的界面差异如果你在ArcGIS Pro里做同样的操作会发现界面几乎换了一套风格但逻辑是通的。Pro里的重分类工具同样位于3D Analyst工具集下工具参数多了“重分类表”这个独立窗口看起来更像一张电子表格但你在ArcMap分类窗口设置的“方法”和“类别”在Pro里同样有只是入口位置变成了“分类”按钮旁边的下拉菜单。Pro版本有一个比ArcMap舒服的地方它会把分类结果对应的直方图直接显示在重分类表旁边你调整断点时能实时看到每个类别覆盖的像元范围。这比ArcMap里的黑盒操作要直观得多尤其适合需要反复调断点的场景。不过Pro也有一个坑就是默认情况下它也不显示重分类工具你需要先确保3D Analyst扩展模块是开启状态。Pro的扩展模块开关在“工程”-“许可”里面不是ArcMap那种“自定义”菜单新手经常找不到。4.3 用栅格计算器和arcpy实现同样的功能有时候你不想用对话框工具因为需要在流程里反复执行或者要把整个流程脚本化这时候有两类替代方案。第一类是用栅格计算器写条件表达式。对于比较简单的分类比如把高程分两档可以用Con(高程 500, 2, 1)来实现大于500的输出2否则输出1。这种写法的好处是直观、可读性强适合快速临时处理。但条件一多写起来就不太舒服三层嵌套还能忍五层以上基本属于自虐。第二类是用arcpy脚本调用Reclassify函数。这也是我强烈推荐大家掌握的进阶技能。一个典型的脚本示例如下import arcpy from arcpy.sa import * # 检查3D Analyst扩展模块 arcpy.CheckOutExtension(3D) # 输入栅格路径 inRaster rC:\project\data\dem.tif # 重分类按高程区间映射到1-3 outRaster Reclassify(inRaster, Value, RemapRange([[0, 200, 1], [200, 500, 2], [500, 1000, 3]]), NODATA) # 保存结果 outRaster.save(rC:\project\output\dem_reclass.tif) # 释放扩展模块 arcpy.CheckInExtension(3D)脚本里的RemapRange就是重分类映射表每个子列表代表一个区间前两个值分别是旧值区间的起点和终点第三个是新值。写脚本时注意如果输入栅格不是全路径变量而是在ArcMap内容列表里直接把图层名传给Reclassify也可以但最稳妥的还是在脚本开头把当前地图文档里的图层转成栅格对象或用全路径。还有个小提示脚本跑完之后如果输出结果没有自动添加到内容列表用arcpy.AddMessage或者arcpy.MXD文档的AddLayer从磁盘加载结果不然你在ArcMap界面里看不到脚本生成的栅格会误以为脚本没执行成功。5. 我踩过的坑和排查思路5.1 输出栅格全黑或者只有一个类别的值这个问题的出现频率很高而且新手很容易慌。输出栅格加载进来全是一片黑色属性表里只有一个类别值看起来像是分类失败。我排查过几次之后发现绝大多数情况不是工具出了问题而是输入栅格本身的范围太大或者值域太宽自动等间距分类的结果里中间几个类别覆盖的像元数非常少可视化时几乎看不见。这时候先不要怀疑工具右键点击输出图层打开“符号系统”把拉伸方式改为“直方图均衡化”或者手动设置分类数大概率就能看到彩色分布了。如果仍然单色再检查属性表里Count值看是不是某个类别的Count占据了绝对多数。还有一种可能是你的输入栅格是整型且值域特别小比如只有0、1、2三个值的土地利用栅格你用等间距分成5类工具会照做但有些类别确实没有像元输出自然看起来只有两三个颜色。5.2 分类边界值到底归属哪个区间这估计是最容易引起争议的细节了。假设你的断点设置为0到200是第一类200到500是第二类那么高程值刚好等于200的像元到底算第一类还是第二类老实说ArcGIS在重分类中默认的处理规则是旧值区间的下限包含、上限不包含也就是左闭右开。所以200这个值会归入200到500这一段而不是0到200这一段。但问题在于这个细节在工具的帮助文档里写得很隐蔽很多教程也没有着重强调导致不同人手动处理同一个DEM时会得到不同结果。这里我有一个非常实用的避坑经验如果分类阈值来自行业标准而你不想纠结边界归属就把断点设在相邻标准值之间的中间位置。比如标准要求200米以下是一类、200米以上是另一类你可以把断点设置为200.0001这样几乎所有高程为200的像元都会归入第一类就不会有边界争议了。如果是整数高程模型更简单的办法是在旧值区间里把上界写成199.999同样能避开边界归属问题。5.3 重分类结果在后续分析中污染了NoData重分类本身很稳定但重分类结果被当作输入再做下一步分析时NoData的传染性问题会冒出来。举个例子你把一个DEM重分类成了三级然后把NoData保留为NoData。紧接着你用这个重分类结果去做邻域统计比如计算每个像元周围3x3邻域的平均类别值。如果原始DEM边缘有一圈NoData那么邻域统计的输出里靠近边缘一大片区域的像元都会变成NoData。很多人不理解为什么做出来的结果比输入栅格小了一圈其实这就是NoData像元在邻域运算中向外传染的结果。我处理这个问题时一般会在重分类之前先把原始DEM的NoData区域做一次插值或填充尽量消除无效值对后续分析的扩散影响。如果NoData区域太大且无法插值那么在最终成果制图时我会把边缘的NoData区域单独用掩膜显示避免读者误以为那些区域是类别值缺失。另外提醒一句如果你打算把重分类结果导成TIFF再交给别的软件用务必在导出时检查NoData值设置。ArcGIS默认导出的NoData在别的软件里可能被识别为0或者其他具体值导致别人接手后统计面积时多出一大块“0类”数据。我一般会在导出前用栅格计算器把NoData改为一个明确的、不会和分类值混淆的大数比如9999然后在文档里写明这个值的含义。这样数据交出去人家一眼就能看出来哪些区域是无效区不会误纳入统计分析。说实话栅格重分类这个工具单看操作复杂度真的不高对话框填一填几分钟就跑完了。但它背后涉及的分类逻辑、NoData处理、边界值归属这些细节才是真正决定分析质量的东西。我见过太多人在重分类这一步随便点了确定结果后续加权评价、面积统计全部跟着出错最后从头返工。每次遇到这种情况我都会建议对方重分类虽然是个“小工具”但请把它当成一个正式的数据生产环节来对待分类方案先写清楚跑完之后再花五分钟做结果检查后边能省下几倍的时间。下一篇我准备把重分类和邻域分析、分区统计串起来讲因为这几个工具单独看都很简单组合在一起才是栅格分析真正发力的地方。到时候拿一块真实地形数据一步一步从原始DEM做到最终的分区统计成果应该会比今天这篇更贴近实战。
返回列表