1 如何读取选中的栅格像元的值(单个像元的值)
思路:需要通过获取地图上点击的点映射的像元,然后获取像元值。
IRaster2接口中的方法有MapToPixel(Converts a location (x, y) in map space into pixel space)可以将map中的XY坐标转换为像元的行列号坐标。再通过IRaster2中的GetPixelValue的方法来获取像元行列号对应的值。
int row;
int column;
//获取像元值
private void button1_Click(object sender, EventArgs e)
{
IRasterLayer lyr = axMapControl1.Map.get_Layer(0) as IRasterLayer;
IRaster rst = lyr.Raster;
IRaster2 rst2 = rst as IRaster2;
object value = rst2.GetPixelValue(0, column, row);//0表示波段索引位置
MessageBox.Show("当前像元的列数为:" + column + "当前像元的行数为:" + row+" value为:"+value.ToString());
}
private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
IRasterLayer lyr = axMapControl1.Map.get_Layer(0) as IRasterLayer;
IRaster rst = lyr.Raster;
IRaster2 rst2 = rst as IRaster2;
//将点击地图上的点的位置转换成行列号存储在全局变量column和row中
rst2.MapToPixel(e.mapX,e.mapY,out column,out row);
}
2 如何读取任意选中的像元N*N邻域像元的值(区域像元的值)
思路:需要先找到选中的像元,然后获取N*N邻域的像元,遍历每个像元获取像元值。
private void button2_Click(object sender, EventArgs e)
{
//指定像元块为3*3
IPnt size = new PntClass();
size.X = 3;
size.Y = 3;
IRasterLayer lyr = axMapControl1.Map.get_Layer(0) as IRasterLayer;
IRaster rst = lyr.Raster;
IPixelBlock ipb = rst.CreatePixelBlock(size);
IPnt itp = new PntClass();
itp.X = column - 1;//左上角X表示列
itp.Y = row - 1;//左上角Y表示行
rst.Read(itp,ipb);//从itp(鼠标点击的栅格行列号开始)读取的数据,将转移到IPixelBlock(ipb)中
IPixelBlock3 ipb3 = ipb as IPixelBlock3;
//0参数表示的是波段索引,获得的是一个3*3的数组,返回一个object
Array pixes = ipb3.get_PixelData(0);
for (int i = 0; i < 3; i++)//列
{
for (int j = 0; j < 3; j++)//行
{
//string value = Convert.ToString(pixes.GetValue(i,j));
string value = pixes.GetValue(i, j).ToString();
MessageBox.Show(value);
}
}
}