GDAL:函数GDALDataset::RasterIO说明

部分内容摘自:http://blog.csdn.net/liminlu0314/article/details/7072224

在使用GDAL库函数RasterIO后,产生很多疑惑,也看过李大神关于此函数的博客(见上网页),但是对该函数最后几个参数的描述还不够细致,自己理解总是不够,所以想在此基础上再补充一些内容,希望以后忘记时能够查找。关于GDALRasterBand::RasterIO与GDALDataset::RasterIO,前者李大神已经介绍的很详细,不再赘述。本文主要介绍GDALDataset::RasterIO的后面几个参数具体是何含义,如何使用(来自http://gdal.org/classGDALDataset.html#ad2a643880bf8b3c492783e1ab5fbc667)。

CPLErr GDALDataset::RasterIO	(	GDALRWFlag 	eRWFlag,
int 	nXOff,
int 	nYOff,
int 	nXSize,
int 	nYSize,
void * 	pData,
int 	nBufXSize,
int 	nBufYSize,
GDALDataType 	eBufType,
int 	nBandCount,
int * 	panBandMap,
GSpacing 	nPixelSpace,
GSpacing 	nLineSpace,
GSpacing 	nBandSpace,
GDALRasterIOExtraArg * 	psExtraArg	 
)	

前九个参数的意义与GDALRasterBand::RasterIO一样,第十个参数nBandCount表示读取的波段的个数,第十一个参数panBandMap表示读取波段的序号。一个栅格数据集往往包含多个波段,如TM包含7个波段(编号为1~7),若想按4,3,2顺序读取该三个波段,需先定义int panBandMap[3]={4,3,2};即可。

     int panBandMap[3]= {4,3,2}; 
     unsigned char *data = new unsigned char[Width*Height*3];  
     poDataset->RasterIO(GF_Read, 0, 0, Width,Height, data,Width,Height, GDT_Byte, 3, panBandMap,0,0,0);

nPixelSpace,nLineSpace与nBandSpace是何意义上面博客也讲得很仔细,但一直以来我都很模糊,不知道具体怎么用。其实默认设置下(即后四位参数均为0的情况下)pData存储或读取像元的顺序为先从左到右,从上到下的读取第一波段,再按该顺序读取第二波段以此类推。加入要读取一幅RGB的图像,读取到pData的顺序即为R(S(0,0),S(0,1),S(0,2),...,S(1,0),S(1,2),S(1,3),...,S(width-1,height-2),S(width-1,height-1))(S为当前图像行列坐标下的值,类似于遥感图像的格式,共有width*height个元素)、G(S(0,0),S(0,1),...,S(width-1,height-1))、B(S(0,0),S(0,1),...,S(width-1,height-1))。但是有时我们可能需要其他的排列方式,要设置这些方式,一般就想写个循环完事,其实通过设置上面三个参数也能实现。如要想将JPG图像按照RGBRGBRGB……(这里的RGB仅代表一个像素,一共有width*height对RGB),首先看到R像素与下一个R元素隔了3个像素,因此nPixelSpace的值为sizeof(DataType)*3;第一行与下一行之间隔了原来的两行数据,因此nLineSpace为sizeof(DataType)*width*3;第一波段与下一波段之间的距离即为一个像素,即为sizeof(DataType)。当数据类型DataType为unsigned char 时,sizeof(unsigned char)为1,sizeof(unsigned short)为2,意味着也可以用具体数值表示。

  int dim=poDataset->GetRasterCount();
  int width=poDataset->GetRasterXSize();
  int height=poDataset->GetRasterYSize();
  unsigned short *data=new unsigned short [height*width*dim];
  poDataset->RasterIO(GF_Read,0,0,width,height,data,width,height,GDT_UInt16,dim,0,
	  dim*sizeof(unsigned short),dim*width*sizeof(unsigned short),sizeof(unsigned short));



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值