GDAL:函数GDALDataset::RasterIO说明

来源:互联网 发布:天下3妖孽男捏脸数据 编辑:程序博客网 时间:2024/06/06 13:12

部分内容摘自: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));



0 0