GP工具可以较为简单的实现栅格数据重分类,要注意参数设置准确。
重分类时要用到获取栅格数据最大最小值,
等间距重分类
步骤:
- 获取栅格数据最大最小值
- 定义与初始化GP工具
- 定义重分类工具
- 重分类工具初始化
- 执行重分类
- 加载执行结果
获取栅格数据最大最小值
//获取取值范围
IRaster pRaster = pRasterLayer.Raster;
IRasterBandCollection pRBC = (IRasterBandCollection)pRaster;
IRasterBand pRasterband = pRBC.Item(0); //第一坡道
IRasterStatistics pRS = pRasterband.Statistics;
double max = pRS.Maximum;
double min = pRS.Minimum;
定义与初始化GP工具
Geoprocessor GP = new Geoprocessor();
GP.OverwriteOutput = true;
定义重分类工具
Reclassify pRec = new Reclassify();
重分类工具初始化
pRec.in_raster = pRasterLayer;
pRec.reclass_field = "Value";
string remap = "";
double dis = (max + min) / 10;
for(double i = 0; i < 10; i++) //此处注意,一定要为double类型
{
//注意数字和数字一起算
//注意字符跟字符一起算
double from = min + dis * i/10;
double to = min + dis * (i + 1)/10;
remap += from + " " + to + " " + i + ";";
}
pRec.remap = remap;
执行重分类、加载执行结果
try
{
GP.Execute(pRec, null);
IRasterLayer resRasterLayer = new RasterLayer();
resRasterLayer.CreateFromFilePath(Application.StartupPath + "\\reclass.tif");
axMapControl1.AddLayer(resRasterLayer);
object sev = null;
MessageBox.Show(GP.GetMessages(ref sev));
}
catch
{
object sev = null;
MessageBox.Show(GP.GetMessages(ref sev));
}
注意:
int型数据运算后会被取整,涉及小数运算时们一定要将数据定义为double或float
数据加减运算与字符串加减要分开,防止混淆,无法执行。
全部代码(函数):
private void 重分类ToolStripMenuItem_Click(object sender, EventArgs e)
{
//获取输入数据
ILayer pLayer = axMapControl1.get_Layer(3);
IRasterLayer pRasterLayer = pLayer as IRasterLayer;
//获取取值范围
IRaster pRaster = pRasterLayer.Raster;
IRasterBandCollection pRBC = (IRasterBandCollection)pRaster;
IRasterBand pRasterband = pRBC.Item(0); //第一坡道
IRasterStatistics pRS = pRasterband.Statistics;
double max = pRS.Maximum;
double min = pRS.Minimum;
Geoprocessor GP = new Geoprocessor();
GP.OverwriteOutput = true;
//定义重分类工具
Reclassify pRec = new Reclassify();
pRec.in_raster = pRasterLayer;
pRec.reclass_field = "Value";
string remap = "";
double dis = (max + min) / 10;
for(double i = 0; i < 10; i++) //此处注意,一定要为double类型
{
//注意数字和数字一起算
//注意字符跟字符一起算
double from = min + dis * i/10;
double to = min + dis * (i + 1)/10;
remap += from + " " + to + " " + i + ";";
}
pRec.remap = remap;
MessageBox.Show(remap);
pRec.out_raster = Application.StartupPath + "\\reclass.tif";
try
{
GP.Execute(pRec, null);
IRasterLayer resRasterLayer = new RasterLayer();
resRasterLayer.CreateFromFilePath(Application.StartupPath + "\\reclass.tif");
axMapControl1.AddLayer(resRasterLayer);
object sev = null;
MessageBox.Show(GP.GetMessages(ref sev));
}
catch
{
object sev = null;
MessageBox.Show(GP.GetMessages(ref sev));
}
}