博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArcGIS二次开发之读取遥感图像像素值的做法
阅读量:2432 次
发布时间:2019-05-10

本文共 3146 字,大约阅读时间需要 10 分钟。

作者:朱金灿

来源:

 

        首先是读取遥感图像的R、G、B波段数据的做法。读取R、G、B波段数据的像素值主要通过IRaster接口的Read方法在Raster上读取指定位置的像素块(PixelBlock),然后通过像素块的GetVal方法获取指定Band中位置的像素值。首先我们来看一下IPixelBlock接口的GetVal方法,其语法如下:

public object GetVal( int plane, int X, int Y);

         第一个参数为指定的Band序号,如果该Raster数据只有一个Band,则该处值为0;第二个参数和第三个参数分别用来指定获取像素块中哪一个位置的像素值,如果都为0,则表示获取像素块左上角处的像素值。如IPixelBlock.GetVal(0,0,0)。
CreateCursor方法是用来创建一个游标,CreatePixelBlock方法是根据指定像素块大小来创建一个像素块,Read方法则用于读取Raster中指定位置的像素块。

        IRaster接口的Read方法具有两个参数,如下:

public void Read (IPnt tlc, IPixelBlock block);
       第一个参数用于指定获取像素块的起始位置,第二个参数为像素块。值得注意的是,此处使用的指定获取像素块的起始位置,其值的范围为0到Raster的行数和列数,而不是地图范围。举例说明,如一个Raster数据是由6000*6000个像素块组成,它所表示的地图范围为E95°~E100°、N30°~N35°,即每个像素块的大小为0.00008333°*0.00008333°,通过IRasterProps接口的MeanCellSize方法可以获取每个像素单元的大小。使用IRaster接口的Read方法时,指定获取像素块的位置是从0~6000,而不是E95°~E100°或N30°~N35°,所以,如果要获取指定位置的像素值大小,还需要将地图坐标转换成Raster数据中像素块的相对坐标。示例代码如下:
private void ReadImage_Click(object sender, EventArgs e)        {            ILayer pLayer = axMapControl1.get_Layer(0);//假定第一个图层为Raster数据        IRasterLayer rasterLayer = (IRasterLayer)pLayer;            IRaster pRaster = rasterLayer.Raster;            IRasterProps pRasterProps = (IRasterProps)pRaster;            IPnt pnt = new PntClass();            pnt.SetCoords(10, 5); // 读取第5行第10列的像素            IPnt pntSize = new PntClass();            pntSize.SetCoords(1,1); // 只读取一个像素            IPixelBlock pixelBlock = pRaster.CreatePixelBlock(pntSize);                 pRaster.Read(pnt, pixelBlock);            object obj = pixelBlock.GetVal(0, 0, 0);            MessageBox.Show(Convert.ToUInt32(obj).ToString());        }

        但是遥感图像一般是波段数量是大于3的图像,假如要读取除R、G、B波段外的波段的像素值,那该怎么办?事实上确实有点费劲。不过经过一番摸索也实现了,具体代码如下:

IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactoryClass();                    IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(file.DirectoryName, 0);                    IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;                    IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(file.Name); // 打开遥感图像获取数据集                    IRasterBandCollection bandColl = pRasterDataset as IRasterBandCollection; // 获取波段集合                    IPixelBlock pPixlBlock;                    IPnt pntSize = new PntClass();                    pntSize.SetCoords(width, height); // 设置像素块的大小                    IRasterBand pRasterBand = bandColl.Item(0) as IRasterBand;                    IRawPixels pRawPixels = pRasterBand as IRawPixels;                    pPixlBlock = pRawPixels.CreatePixelBlock(pntSize); bandIndex = listBoxBand.SelectedIndices[b];                            pRasterBand = bandColl.Item(bandIndex) as IRasterBand; pRawPixels = pRasterBand as IRawPixels;                            IPnt pnt = new PntClass();                            pnt.SetCoords(0, 0); // 从0行0列开始读取                            pRawPixels.Read(pnt, pPixlBlock); // 读取数据块 value = pPixlBlock.GetVal(bandIndex, iColumn, iRow); // 获取数据块中指定位置的像素值
      

       IRawPixels接口的Read方法和IRaster接口的Read方法的参数意义是一样的。不过由此我感到ArcGIS的一些接口有歧义的地方,比如pRawPixels.CreatePixelBlock(pntSize);中使用IPnt类型的变量pntSize,这里表示尺寸,而pRawPixels.Read(pnt,pPixlBlock)这里的IPnt类型的变量pnt这里却表示位置。同一种类型的变量却有两种不同的意义,感觉不太好。

转载地址:http://fdimb.baihongyu.com/

你可能感兴趣的文章
中国开源大爆发进行时,你没掉队吧?
查看>>
用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
查看>>
一周内咸鱼疯转 2.4W 次,最终被所有大厂封杀!
查看>>
关于鸿蒙 2.0,那些开发者不知道的一切
查看>>
Google 排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
查看>>
JavaScript 爆红后,微软为何还要开发 TypeScript?
查看>>
软件开发行业,年轻与大龄程序员的生存现状
查看>>
王者荣耀活动精选 Blink 第二弹来袭!
查看>>
打开数“智”化之门,一字之差带来的思考
查看>>
阿里技术人的成长路径是什么?
查看>>
你值得拥有!更省钱地完成数据监听
查看>>
漫画 | TCP,一个悲伤的故事
查看>>
张一鸣无圈胜破圈?
查看>>
抓紧!抓紧!CSDN年终重榜福利来了~人手一份,快来投稿!!
查看>>
干货! AI 推断解决方案栈 Vitis AI 全流程独家解析
查看>>
真相了 | 敲代码时,程序员戴耳机究竟在听什么?
查看>>
回首互联网十年,我们能从八次烧钱大战中学到什么
查看>>
漫画:如何辨别二逼互联网公司!?
查看>>
麒麟信安面向场景化创新,赋能openEuler商业验证
查看>>
王者又连跪了?快让 AI 帮你上分!
查看>>