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, ...
随机推荐
- MYSQL进阶学习笔记十:MySQL慢查询!(视频序号:进阶_23-24)
知识点十一:MySQL 慢查询的应用(23) 一.慢查询定义 MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询. 查看时间限制 show variables lik ...
- BDB c++例子,从源码编译到运行
第一步先下载源码,解压后 ./dist/configure --enable-cxx编译,然后make, make install --enable-cxx To build the Berkeley ...
- 西交校赛 I. GZP and CS(数位dp)
I. GZP and CS GZP love to play Counter-Strike(CS). One day GZP was playing a mod of CS. The counter- ...
- 编译含有Servlet的java文件
直接在命令行方式下用javac HelloWorld.java编译HellowWorld Servlet是不行的,因为Java SE JDK不含Servlet类库. 解决方法:在环境变量CLASSPA ...
- [Selenium] 操作 HTML5 中的 Canvas 绘制图形
测试 http://literallycanvas.com/ 以 Chrome Driver 为例阐述,通过 Actions 在 Canvas 上绘制一个封闭图形.对于 Canvas 上的操作,推荐 ...
- HBase源码分析:HTable put过程
HBase版本:0.94.15-cdh4.7.0 在 HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入.删除.查询数据都需要先找到相应的 RegionServer ...
- Bootstrap-CL:输入框组
ylbtech-Bootstrap-CL:输入框组 1.返回顶部 1. Bootstrap 输入框组 本章将讲解 Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组 ...
- 【旧文章搬运】Windows句柄表分配算法分析(实验部分)
原文发表于百度空间,2009-03-31========================================================================== 理论结合实 ...
- PhpStorm之服务器篇
打开编辑器,依次点击 Tools->Deloyment->Configuration,进入连接服务器的配置页面 2.点击左上角的 + ,配置一个新的服务器 3.填写添加之后服务器的名称,并 ...
- 鸟哥私房菜基础篇:vim 程序编辑器习题
猫宁!!! 参考链接:http://cn.linux.vbird.org/linux_basic/0310vi.php 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-我用 vi 开启某个档案后,要在 ...