CPLErr GDALRasterBand::RasterIO ( GDALRWFlag eRWFlag,
int
nXOff,int
nYOff,int
nXSize,int
nYSize,void
*
pData,int
nBufXSize,int
nBufYSize,GDALDataType eBufType,int nPixelSpace,int nLineSpace
)
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,
int nPixelSpace
,int nLineSpace,
int nBandSpace
)
第一个参数
RWFlag
来指定是读数据还是写入数据,
其值只能有两个即:
GF_Read
和
GF_Write
,分别表示读取数据和写入数据。
第二个和第三个参数
nXOff,
nYOff
表示
读取或者写入图像数据的起始坐标图像的左上
角坐标为(
0
,
0
)
。
第四个和第五个参数
nXSize, nYSize
表示
读取或者写入图像数据的窗口大小
,
nXSize
表示宽度,
nYSize
表示高度,均使用像素为单位,该宽度和高度是从第二个和第三个参数
处开始计算。
这两个参数和第二第三个参数一起表示就是,
读取和写入图像的窗口位置和大
小。
第六个参数
pData
是指向存储数据的一个指针。
如果是写入数据,那么会将
pData
中
的数据写入到栅格图像中去
;
如果是读取数据,那么会将栅格数据中的数据读入到
pData
中。
pData
的真实数据类型是通过后面的
eBufType
参数来指定的。
如
GDT_Byte
就是代表
的是一个
8U
的数据类型,如果是
GDT_Float32
就表示的是一个
32F
(
float
)的数据类型。
RasterIO
会自动将读入的数据按照参数
eBufType(
第九个参数
)
指定的数据类型进行转换,
需要注意的是,
将浮点数转换为整数时,
将对数据进行四舍五入处理;
而且从一个大的存储
单位转换到一个较小的存储单位是所进行的操作是截断操作而不是按照比例缩小操作,
比如
原来的实际数据中
float
的存取数据范围超过了缓冲数据指定的数据
byte
类型的最大存储范
围,操作将把超过
byte
存储的范围外的数据进行丢弃处理,而不是将
float
缩小到
0
~
255
。
第七个和第八个参数
nBufXSize
和
nBufYSize
参数指定缓冲区的大小
。注意
pData
的大小应当是
nBufXSize×
nBufYSize
。当读取的数据是完整分辨率的数据(原始数据,没
有进行缩放操作)
,他们应该设置和取值窗口的大小相同,也就是与第四个和第五个参数相
等,
但是在读取时使用了缩小或者放大系数,
那么他们需要根据这个缩放系数进行调整。
在
这种情况下,
RasterIO
将会使用缩略图组
overviews
(金字塔)
中某个合适的缩略图来进行
读取数据。
第九个和第十个参数(对于
GDALDataset
来说还有第十一个参数
nBandSpace
)
nPixelSpace
和
nLineSpace
(以及
nBandSpace
)参数一般情况下是将
0
作为缺省值。但
是,他们可以用于
控制存取的内存数据的排列顺序
,可以使用这两个参数将图像数据按照
另一种组织形式读取内存缓冲区中。
也就是说这两个
(三个)
参数可以读取或者写入非常规
组织的缓冲数据。
这个首先可以用于在一个缓冲区中包含多个波段数据,
并且各个数据之间
是交叉排列的,比如一个图像中的数据组织是
RGBRGBRGB…
,而普通的数据可能是
RRR…GGG…BBB…
,我们一般读取到的数据就是
RGBRGBRGB…
这种排列,现在需要
使用
RRR…GGG…BBB…
这样的排列,一般想法就是自己写个
for
循环之类的,重新组织
一次,其实完全没有必要,只要设置这两个(三个)参数就可以达到这个目的。
nPixelSpace
表示的是在一个扫描行中一个像元的字节偏移起始点到下一个像元字节
偏移起始点之间的字节间隔,如果默认使用
0
,那么将使用
eBufType
作为实际的两个像元
之间的字节间隔。