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);
                }
            }
        }