1. 栅格重分类:为什么要做、什么时候做
做GIS分析的人迟早会撞上这么一个问题:手里拿着一张栅格数据,但里面的值根本没法直接用。比如DEM高程数据,从120米到3800米都有,你要做的是把区域划成“低海拔、中海拔、高海拔”三档去做后续分析;又比如土地利用分类结果里,类别编码是1、2、3……但你真正关心的只是“建设用地”和“非建设用地”,其他类别都得归并。这个时候你需要的操作就叫栅格重分类(Reclassify)。
在ArcToolbox里,这个工具并不起眼,藏在3D Analyst工具集下面的“栅格重分类”子集里。很多人第一反应是:重分类不是Spatial Analyst的事吗?怎么跑到3D Analyst里面来了?这里要先说清楚一个情况——在ArcGIS 10.x的体系里,3D Analyst和Spatial Analyst两个扩展模块都带有栅格重分类工具组,功能几乎一样。之所以标题写3D Analyst,是因为在部分许可场景下,你只装了3D Analyst而没有Spatial Analyst授权,那走3D Analyst路径是唯一能完成重分类的正道。这也解释了为什么很多网上的教程会把这两个路径混着写,因为它们本就在功能上重叠、在思路上同源。
重分类本身做的事情,一句话概括就是:把栅格单元格的原有数值映射到一组新值上。听起来简单,但它背后承担了三种完全不同的业务诉求:
第一是尺度压缩。原始数据可能是连续浮点型,比如坡度从0到89.9度,但分析模型只需要你给出“平缓、中等、陡峭”三个等级,必须把连续值强行分段。第二是类别归并。原始分类可能精细到几十个类别,但你的分析只关心几个大类,比如把11、12、21、22这些二级地类编码合并成耕地、林地、建设用地几个一级类。第三是价值重排。很多时候原始值的排列方向和分析需求正好相反,比如土壤侵蚀量越大越危险,但你想用1到5的等级表示危险程度递增,这就要做一个映射规则梳理。
这三种诉求对应着重分类工具里不同的设置方式,但操作入口是同一个。这篇教程先解决“重分类到底是怎么回事”和“最基本的Reclassify工具怎么用”,后面再展开其他变体工具(比如重分类按字段、查找表、分割栅格)的差异。
2. 重分类的底层逻辑与ArcToolbox路径选择
2.1 重分类在栅格分析流程中的位置
很多新手容易犯一个毛病:拿到一张栅格就直接扔进分析模型里跑,结果跑到一半发现输出乱七八糟,回头查才发现是栅格值域没整理。重分类这个步骤在常规分析流程里,处于“数据预处理”和“正式建模”之间,是承上启下的一环。
举个例子。你做一个生态敏感性评价,需要把坡度、高程、植被覆盖度、距水源距离四个因子叠加。这四个因子量纲完全不同,坡度是度数、高程是米、植被覆盖度是百分比、距水源距离是米甚至千米,不统一量纲根本没法加权求和。重分类就是把每个因子都映射到同一个等级尺度上,比如统一映射到1到5的整数值,这样后续的加权叠加才是有意义的。这个场景在选址分析、灾害风险评价、适宜性评价里几乎是标准流程。
从这个角度看,重分类的本质是建立一套评价语义的翻译规则——它把数据自己的物理含义,翻译成分析模型能理解的等级得分。理解了这一层,你就知道重分类不是随便点点就行,每次重分类前必须想清楚:你要输出的等级代表什么?等级间隔依据是什么?原始值与新值的对应关系是否覆盖了所有情况?这些想不清楚,结果出来也是错的。
2.2 ArcToolbox中3D Analyst下的工具组织逻辑
打开ArcToolbox面板,依次展开“3D Analyst工具” -> “栅格重分类”,你能看到一组工具。常见的核心工具包括:
- 重分类(Reclassify)
- 重分类按字段(Reclass by Table)
- 查找表(Lookup)
- 分割栅格(Slice)
这几个工具各有用处,但最基础、最常用、最应该彻底搞明白的是第一项“重分类”。理解它之后,其他几个工具的适用场景也自然清楚了。
这里有必要多说一句3D Analyst和Spatial Analyst两个工具集的关系。很多人一听到“3D”就以为3D Analyst只是做地形、做三维可视化、做体块建模的,跟栅格分类八竿子打不着。实际上3D Analyst核心四大功能里,除了表面分析、三维可视化、体积计算之外,栅格分析本身就是它的重要组成部分。DEM填挖方、坡度坡向计算这些都在3D Analyst里,而栅格重分类是为了配合后续三维表面分析流程而保留的工具。只不过因为Spatial Analyst的用户基数太大,大家在日常教程里看到的重分类几乎都默认走Spatial Analyst的路径,导致很多人忽略了3D Analyst这边的存在。
3. Reclassify工具实操:参数拆解与完整操作流程
3.1 工具界面与参数逐项解读
执行重分类最简单的方式有两种:一种是在ArcToolbox里找到工具双击打开,另一种是在内容列表里右键目标图层,选择“属性”是不行的,正确方式是右键图层选择“数据” -> “重分类”。两种入口打开的是同一个工具对话框。
工具打开后,你看到的第一个参数是输入栅格(Input raster)。这里可以选择下拉列表里已经加载的栅格图层,也可以点文件夹图标去磁盘里找。需要注意,下拉列表里只会出现栅格数据,普通矢量要素不会出现,也不支持直接拖一个矢量文件进来。
选定输入栅格后,第二个参数是重分类字段(Reclass field)。这个字段下拉框会列出栅格属性表里所有字段。对于单波段栅格,通常默认是“值(Value)”,也就是像元本身的数值。如果这个栅格有属性表且包含其他字段,那么理论上你也能选其他字段作为分类依据。但绝大多数场景下,选Value就够了。
第三个参数是核心区域——重分类表。工具会自动读取你选择的栅格字段的唯一值或值域范围,并生成一张两列的对应表:左侧是旧值(Old values),右侧是新值(New values)。你要做的就是把右侧的新值改成你想要的设定。
参数往下拉,有一个容易被忽略但非常关键的选项——将缺失值更改为NoData(Change missing values to NoData)。这个复选框默认是勾选状态,含义是:凡是没有出现在重分类表旧值列表里的像元值,都会被赋为NoData。如果你不想要这个行为,把原始所有值都覆盖到,就要取消勾选,这时没被覆盖的像元会保持原值。这个选项踩坑率极高,后面专门展开讲。
最后的**输出栅格(Output raster)**就是结果保存路径了。这里有个小细节:输出栅格不能和输入栅格同名同路径,否则会报错,因为ArcGIS的栅格不允许原地覆盖,你得先删除原文件或者换一个路径再跑。
3.2 按“唯一值”重分类与按“分段区间”重分类
重分类表里的旧值有几种不同的呈现方式,取决于输入栅格是整型还是浮点型。
如果输入栅格是整型栅格,比如土地利用分类结果(值是1、2、3这种整数编码),工具会在重分类表里列出每一个唯一值。每一行对应一个值,你可以逐个修改其右侧的新值,也可以多条记录合并成同一个新值。比如有一张地类栅格,值有11、12、21、22、31、32、33,你要把11和12合并成新值1,21、22合并成新值2,31、32、33合并成新值3,直接在新值列分别输入1、1、2、2、3、3、3就行了。
如果输入栅格是浮点型栅格,比如高程、坡度、降雨量这些连续数据,工具没法列出每一个可能的值,它会显示的是一个值域范围,每一行是“起始值-结束值”。比如坡度栅格值从0到89.9,你可以手动分成0-10、10-20、20-35、35-90四段,把每段的新值设为1、2、3、4。
但这里有个非常容易乱的地方:工具默认的分段方式可能不是你想要的。默认情况下,重分类工具会自动按照你设定的分类数量(默认是10类)用某种分类方法(默认是相等间隔)自动分段。很多人不检查重分类表就直接点了确定,跑出来的结果自然和自己业务需求对不上。
所以正确的操作习惯是:拿到重分类表后,先清空(Delete Entries),再手动添加自己的分段(Add Entry),或者直接双击表格行去修改旧值的起止值。这样每一步都在自己控制之中,不会出现莫名其妙的分段。
3.3 一个完整实例:坡度栅格按三级标准重分类
用个最简单的例子串一遍完整流程。假设你有一张坡度栅格,值范围是0到50度,你要把它重分类成三个等级:
- 0-10度:平地与缓坡,新值设为1
- 10-25度:中等坡度,新值设为2
- 25-50度:陡坡,新值设为3
操作路径是:ArcToolbox -> 3D Analyst工具 -> 栅格重分类 -> 重分类,双击打开。
第一步,输入栅格选你的坡度栅格。第二步,重分类字段保持默认的Value。第三步,在重分类表区域,先把自动生成的分类方案清空,然后新增三段,分别设置旧值范围和对应新值:
| 旧值 | 新值 |
|---|---|
| 0 - 10 | 1 |
| 10 - 25 | 2 |
| 25 - 50 | 3 |
设置完之后,下面有个按钮叫“添加分类范围(Add Entry)”,每次添加一行,双击行里的旧值起止值进行修改。注意,连续段之间的临界点是需要注意的:0-10和10-25在数学上交叉在10这个点,如果数据里正好有等于10的像元,它会被归到哪一段?工具内部的处理逻辑是左侧区间包含、右侧区间开,即大于等于起始值、小于结束值的像元归入该段,所以10这个值会归属到0-10这一段。这个规则知道一下就行,平时肉眼分辨不出来差异,但如果你精确到像元级别的统计就会用到。
最后,勾选“将缺失值更改为NoData”保持默认(这里所有值都在0-50范围内,没有缺失,勾不勾无实际影响),输出栅格命名如“slope_reclass”,点确定运行。
运行完成后,把结果栅格加载到内容列表里,用符号系统查看,你应该看到只有1、2、3三个栅格值,每个值对应一个坡度区间。这时候你可以打开属性表或者用“分区统计”工具来看看每个等级的像元数量,验证重分类是否完整覆盖了原始数据范围。
4. 高频踩坑点与排查方法
4.1 “跑完发现几乎所有像元都成了NoData”
这是我见过最多的情况。新手在重分类表里只添加了自己关心的几个分段,其他原始值统统没有覆盖,而“将缺失值更改为NoData”又保持默认勾选,结果就是输出栅格大片空白——那些空白区域实际上全是NoData。
排查方法很简单:重分类结果加载到地图里,用“识别”工具点一下空白区域,看属性是否显示NoData;或者在内容列表右键结果栅格打开属性,看“属性”标签页里的“最小值/最大值”,如果是NoData占主导,统计范围都会异常收缩。
解决办法无非两条路:要么把“将缺失值更改为NoData”取消勾选,让未覆盖的值保持原值(适合你只做部分类别修改的场景);要么老老实实把重分类表里的旧值范围覆盖整个原始值域(适合你做全量分级的场景)。这两条路的业务含义完全不同,选哪个取决于你要什么,没有统一答案。
此类问题在连续型浮点栅格里尤其隐蔽,因为工具自动分段能覆盖全范围,但如果你自己手动改了几个起止值,就容易留下缝隙。比如原栅格最大值是45.7,你设置的最后一段是25-50,看似覆盖了,但如果中间某段你写成了10-20,下一段从20.1开始,原数据里20到20.1之间的像元就成了漏网之鱼。所以每次跑完重分类,我建议都在属性表里看一眼像元值统计,确认输出值域是否和你预想的一致。
4.2 “重分类表里的Old values显示为NoData”
偶尔会碰到这种情况:输入栅格加载进来之后,重分类表里第一行是“NoData - NoData”或者“0 - 0”这样的怪异显示。这通常是输入栅格本身带有大量NoData像元导致的。
栅格数据边缘一般都会有一圈或一片NoData区域,这是正常的。重分类表会把这些NoData作为一类特殊值单独显示。如果你需要保留这些NoData区域,保持默认即可;如果你希望把NoData也纳入某个等级,那就要谨慎了——把NoData映射成一个具体新值,意味着原本没数据的区域会被当成真实数据参与后续分析,这可能会严重扭曲统计结果。
我的建议是:除非有明确的业务理由,否则NoData永远保持NoData。特别是在做地形、气象、遥感类数据分析时,NoData区域意味着“无观测”,你硬给它赋一个等级值,等于在造假数据。这个坑远远比看起来严重得多。
4.3 浮点栅格重分类后出现“值不连续”或“边界锯齿”
重分类本身不会改变像元的空间形状,它只是改值。但你做地形分析时可能会发现,重分类后的栅格边界呈现出锯齿状,看起来很粗糙,跟矢量面比起来不够平滑。
这个现象的本质是:栅格本来就是方形像元组成的,重分类只是按值域重新着色,锯齿不是重分类造成的,而是原始栅格分辨率不够细带来的视觉结果。解决路径有三个:一是增大原始栅格分辨率(不现实,除非重新采集或重采样);二是做栅格平滑处理(比如众数滤波,但会损失精度);三是在后续出图或转矢量时配合制图综合来处理。这里不展开,但你要明白,重分类工具本身没有“平滑”选项,别指望它能解决锯齿问题。
4.4 重分类输出栅格和输入栅格“看起来一样”
有时候跑完重分类,输出结果和输入在屏幕上看起来几乎没区别。这不是工具没生效,而是符号系统的问题。重分类后的栅格默认渲染方式可能和你之前手调过的图层符号刚好接近,让你误以为没变。
排查方式很简单:右键输出栅格 -> 属性 -> 符号系统,把分类数改成你的新等级数(比如3),看看渲染是否正常。同时打开属性表,确认栅格值是不是已经变成新的那套值。如果值变了,渲染看起来差不多只是因为色带接近。你要是想彻底看清变化,手动改一下符号系统里的颜色,差异立刻就很明显。
4.5 重分类结果参与叠加分析时“新值顺序搞反了”
最后一个值得一提的坑是新值方向的业务语义问题。比如你重分类出1、2、3三个等级,叠加分析时权重是1+2+3简单求和的,如果你当初把“最危险”定为3,但叠加模型里权重越大越代表“最适宜”,那整个结果就反了。
这个坑不是工具层面的,是业务理解和参数设置之间的错位。我的习惯是在做重分类之前,先画一张纸质的映射表:原始值 -> 新值 -> 新值含义 -> 在模型中的权重方向。一张表写清楚再动手,基本不会犯方向性错误。文章标题写“栅格重分类(一)”,其他变体工具和进阶技巧后续再补,但那个映射表习惯建议大家从第一篇就开始建立。
5. 实操心得与工具使用的个人经验
在反复使用重分类工具之后,我整理了一些经验,这些不一定能在软件帮助文档里查到,但对实际效率提升很明显。
第一,能用符号系统分类显示解决的事,不要急着重分类。很多人拿到栅格数据,第一件事就是想重分类,但实际上如果只是出图展示,完全可以靠更改渲染符号的分段方式解决。比如你要看坡度分三级的效果,右键图层属性 -> 符号系统 -> 分类,设置成3类,先肉眼看个大概,确认分段临界值合不合理,再去做重分类。这个习惯能帮你减少很多试错,因为你会在重分类前先看到分段效果,而不是跑完一遍再回来调参数。
第二,善用“添加分类范围”和“删除条目”按钮。重分类表里手动逐个改值太慢了,尤其数据类别多的时候。比如土地利用数据有几十个类别,你要合并成8个大类,挨个双击改新值能把你心态搞崩。高效做法是:先把新值列全部设为某个默认值,再按需批量修改。或者更干脆的方案是用“重分类按字段”工具,直接用一个属性表字段作为映射依据,这个后面写第二篇的时候详细展开。
第三,处理大批量数据时用ModelBuilder串联重分类。如果你要做一期历史数据,比如2000年、2005年、2010年、2015年、2020年五期土地利用全部重分类成统一类别,手工跑五次容易漏参数、改错值。正确做法是在ModelBuilder里把重分类工具拖进来,输入设为参数变量,一次搭好模型、跑完所有年份,而且模型里保留了重分类表设置,年份之间不会有偏差。我自己处理多期遥感分类数据时,这个模型基本是固定的,每次换输入数据就能批量出结果。
第四,重分类前先看直方图。处理连续型栅格时,不要凭感觉设置分段区间。右键栅格图层属性 -> 符号系统 -> 分类选项卡,能看到直方图,也就是不同值段的像元数量分布。结合直方图来设置分段起止值,比你纯靠业务经验拍脑袋要稳妥得多。比如坡度0-10虽然只占5%的像元,但在分析里是重要区域,你硬按等间隔分成0-17、17-34、34-50三段,第一段占比太小,显示效果就会很“失真”。
关于重分类的常见问题,我总结了一下速查表,方便平时操作时对照:
| 问题 | 可能原因 | 处理方式 |
|---|---|---|
| 输出大面积NoData | 缺失值勾选为NoData且重分类表未覆盖全部值域 | 取消勾选或补全旧值范围 |
| 重分类后结果没变化 | 符号系统渲染问题或映射新值和原值恰好相同 | 检查栅格值字段,或调整符号颜色对比 |
| 重分类表自动分段不合理 | 没有清空默认分类范围 | 用Delete Entries清空后手动Add Entry添加分段 |
| 浮点栅格找不到想要的精确边界 | 手动输入起止值出现的回车或格式问题 | 双击单元格直接修改数值,注意输入法设置问题 |
| 输出路径报错000725 | 输出栅格与输入栅格同路径或文件名冲突 | 换输出文件名或先删除已有同名栅格,也可以检查路径是否含非法字符 |
这些经验都是实际操作中一次次试出来的。你在自己项目里碰到问题,先按这个顺序排查:第一步看重分类表本身覆盖全不全,第二步看缺失值勾选状态,第三步看符号系统,第四步再往数据源本身找原因。大多数重分类异常,都逃不出前两步。
换个角度想,重分类本质上就是把一张连续或复杂的栅格,翻译成一套分析模型能够理解的语言。翻译得好不好,直接决定了后续叠加分析、权重评价、分级制图的可靠性。与其在叠加分析跑出结果后才发现方向错了,不如在重分类这一步多花几分钟确认映射规则、覆盖范围和NoData处理策略。这一步省下来的返工时间,远远大于你研究工具的时间。