最近做项目需要实现栅格重分类功能,纠结了许久,转遍了CSDN、PUDN,下载了N多源码,终于实现了简单的栅格重分类,泪目。
首先是需要时刻提醒自己注意的几个地方:
- 复制别人代码的时候,一定要把按钮、尤其是事件的功能重写!!!
- 重分类结果的保存路径必须是数据库,不能是文件夹。这个在ArcMap可以自行体会。
- 代码的实现主要参考了牟乃夏老师的课件,果然运气也是实力的一部分
简单地说,重分类就是对原有栅格像元值重新分类从而得到一组新值并输出。
在ArcGIS Engine中,通过RasterReclassOpClass实现栅格数据的重分类,该类继承了两个主要的接口,分别是IRasterAnalysisEnvironment接口和IReclassOp接口,IReclassOp接口中包含了以下几种提取分析方法,分别为:
(1)Reclass(使用表重分类)
(2)ReclassByASCIIFile(使用ASCII文件重分类)
(3)Slice(分割)
(4)Lookup(查找表)
(5)ReclassByRemap(定义重映射进行重分类)
使用表重分类
使用表重分类需要调用IReclassOp接口的ReClass方法,该方法的原型为:
public IGeoDataset Reclass ( IGeoDatasetgeo Dataset, ITableremap Table, string fromField, string toField, string OutField,bool retainMissingValues);
该方法有六个参数,分别是:
(1)IGeoDataset geoDataset 输入栅格。
(2)ITable remapTable输入重映射表。
(3)string fromField 来自值字段。
(4)string toField 到值字段。
(5)string OutField 输出值字段。
(6)bool retainMissingValues 是否将缺失值改为NoData。
进行使用表重分类时需要用到IWorkSpace、ITable和IFields接口,通过这些接口获取重分类信息表和表中所有的字段。
使用表重分类的实现思路如下:
(1)获取输入栅格IGeoDataset;
(2)调用IWorkSpace、ITable等接口得到重映射表;
(3)选择表中的来自值字段(fromField)、到值字段(toField)和 输出值字段(OutField);
(4)调用IReclassOp接口的Reclass方法,返回重分类结果;
(5)显示重分类后的结果。
使用ASCII文件重分类
使用ASCII文件进行重分类前,需要先编辑ASCII文件,而ASCII文件必须满足特定的格式:
(1)注释行以“#”符号为起始字符,输入的注释不受限制。
(2)每个分配行都可将输入栅格内的某一个值或一定范围内的值映射为输出值。分配行只接受数值。
(3)ASCII 重映射文件中所有分配行的格式都必须相同。
使用ASCII文件重分类需要调用IReclassOp接口的ReclassByASCIIFile方法,该方法的原型为:
public IGeoDataset ReclassByASCIIFile (IGeoDatase tinRaster,strings RemapFile,bool retainMissingValues);
该方法有三个参数,分别是:
(1)IGeoDataset GeoDataset 输入栅格数据集。
(2)strings RemapFile ASCII文件路径,ASCII文件允许使用的扩展名有.rmp、.txt 和 *.asc。
(3)bool retainMissingValues 是否将缺失值改为NoData。
使用ASCII文件重分类的实现思路如下: <