ArcGIS二次开发之读取遥感图像像素值的做法
作者:朱金灿
来源:http://blog.csdn.net/clever101
首先是读取遥感图像的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这里却表示位置。同一种类型的变量却有两种不同的意义,感觉不太好。
ArcGIS二次开发之读取遥感图像像素值的做法的更多相关文章
- NX二次开发-UFUN读取图纸尺寸的值UF_DRF_ask_dimension_text
今天发现UF_DRF_ask_dim_info这个函数不能读带附件文本的尺寸,有附加文本dim_info->text_info->text->full_string;读出来的是附加文 ...
- ArcGIS二次开发AO软件安装破解教程
最近在做ArcGIS二次开发时,采用C#中的WPF技术,在调研中发现ArcGIS 10.3及以上版本支持WPF技术,但是关于ArcGIS10.3的破解教程甚少,自己尝试了不少方法都失败了,淘@宝@商家 ...
- ArcGIS二次开发入门(一)
作者:朱金灿 来源:http://blog.csdn.net/clever101 公司培训ArcGIS二次开发(C#作为开发语言),自己回家动手实践了一下. 1. 首先是二次开发环境的安装(AE 10 ...
- DICOM图像像素值(灰度值)转换为CT值
CT值的单位是Hounsfield,简称为Hu,范围是-1024-3071.用于衡量人体组织对X射线的吸收率,设定水的吸收率为0Hu. 在DICOM图像读取的过程中,我们会发现图像的像素值有可能不是这 ...
- c#图像处理入门(-bitmap类和图像像素值获取方法)
c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...
- 【ArcGIS二次开发】CreateFeature报错(HRESULT E_FAIL)
在VS2010下基于ArcGIS 10.1做二次开发时遇到个奇怪的问题,对于MXD工程文档中已经存在的图层,获取其FeatureClass可以调用CreateFeature()函数生成要素,但是对于通 ...
- visual studio2010中C#生成的,ArcGIS二次开发的basetool的dll,注册为COM组件tlb文件,并在arcmap中加载使用
写了个标题好长啊~~~~ 这两天又认识了一个新玩意,记录一下下,啦啦啦~~~~~ 话说,认识arcgis快十年了,从桌面版到engine的二次开发,其实不过才认识到它的冰山一角, 它总是能带来很多还未 ...
- ArcGIS二次开发的几种方式
1.ArcEngine开发 二次开发的常用方式,开发提供接口齐全,功能强大,比较成熟.但是,开发的软件使用需要指定版本的运行环境才能运行. 2.Addin开发 二次开发与ArcMap嵌入,开发方便,可 ...
- ArcGIS 二次开发总结
个人总结 1. Enterprise10.7新特性 新增共享实例,可以将不常用服务分配共享实例,减少服务器压力.仅支持ArcGIS pro发布的地图服务,且仅开启feature access,kml, ...
随机推荐
- C++的学习 (此博客将一直补充更新下去,C++语法方面的内容不开新随笔了, *【语法学习】)
// #include <sstream> // stringstream 是 C++ 提供的另一个字串型的串流(stream)物件,包含在上述头文件中 // 先谈它在字符串处理方面的应用 ...
- HDU 1081:To The Max
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- MAC 开发 stm32 程序
资料:http://www.cnblogs.com/humaoxiao 大神技术.
- java中的泛型类和泛型方法
1.泛型是什么? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类. 可以在集合框架(Collection fram ...
- Cascaded pose regression
最近再看face alignment的相关文章,目前比较流行的算法都是基于(Cascaded pose regression,CPR)[1]的框架上做的,该算法之所以流行的原因是简单高效.CPR分为训 ...
- atof和atoi
atof:将字串转换成浮点型数 表头文件 #include <stdlib.h> 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而 ...
- Vue Router的配置
1.beforeEnter function requireAuth (route, redirect, next) { if (!auth.loggedIn()) { redirect({ path ...
- linux中vfork对打开文件的处理
vfork和fork fork()函数是拷贝一个父进程的副本,拥有独立的代码段 数据段 堆栈空间 然而vfork是共享父亲进程的代码以及代码段 vfork是可以根据需要复制父进程空间,这样很大程度的提 ...
- android调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so (转载)
转自:http://blog.csdn.net/jiuyueguang/article/details/9449737 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言 1:本文主要作为 ...
- Node学习图文教程之express重写留言本案例
写在前面 小伙伴们大家好,我是你们的pubdreamcc,接着前面的学习,这篇博文出至于我的GitHub仓库:Node学习教程资料,如果你觉得对你有帮助,欢迎star,你们的点赞是我持续更新的动力,谢 ...