CPLErr GDALDataset::RasterIO(
GDALRWFlag eRWflag, // GF_Read 或 GF_Write 读或写,这里只说 读数据
int nDSXOff, // 读取区域的起始列号
int nDSYOff, // 读取区域的起始行号
int nDSXSize, // 读取区域的宽
int nDSYSize, // 读取区域的高
void* pBuffer, // 目标缓存指针
int nBXSize, // 目标缓存的宽
int nBYSize, // 目标缓存的高
GDALDataType eBDataType, // 目标缓存的数据类型
int nBandCount, // 需要读取的波段数
int* panBandMap, // 波段序列,可以定义波段读取顺序
GSpacing nPixelSpace, // 一个波段中的数据在pBuffer中的列间隔
GSpacing nLineSpace, // 一个波段中的数据在pBuffer中的行间隔
GSpacing nBandSpace // 波段之间的在pBuffer中的间隔
)
前 9 个参数:读取(GF_Read )数据集中的一块矩形区域,矩形区域由(nDSXOff,nDSYOff,nDSXSize,nBYSize)确定,将矩形区域自动缩放到 pBuffer中,pBuffer的宽高由 (nBXSize, nBYSize)确定,eBDataType 为 pBuffer的数据类型, GDAL会 将数据集自动转换成 eBDataType 存储到pBuffer中,
后5个参数:
对于N个波段的GDT_Byte数据集,(N>=nBandCount),GDT_Byte对应于C++中的 unsigned char
定义一个目标缓存 unsigned char* pBuffer = new unsigned char[nBXSize*nBYSize*nBandCount]
来存储源数据集中的一块数据(nBandCount = 3),读其中的三个波段。
//读取2,3,4波段的数据到pBuffer中,读取顺序为 4,3,2 ,GDAL中波段编号从1开始的
则可以定义 int panBandMap[] = {4,3,2};
假设第4个波段为r, 第3个波段为g, 第2个波段为b
一、默认读法,波段连续
如果 nPixelSpace = 0,等同于 nPixelSpace = sizeof(unsigned char)
如果 nLineSpace = 0, 等同于 nLineSpace = nPixelSpace *nBXSize ***注意是目标缓存的宽
如果 nBandSpace = 0, 等同于 nBandSpace = nLineSpace *nBYSize ***注意是目标缓存的高
此种读法,pBuffer 中的数据顺序相当于按波段连续 rrrrrrrr.....ggggggggg....bbbbbbb.....
1、同一波段列间隔是 r与r(g与g,b与b)之间的间隔,等于 sizeof(unsigned char) * 1
2、同一波段行间隔自然就是 nPixelSpace *nBXSize
3、波段之间的间隔是 第一个r与第一个g(g与b,相邻波段)之间的间隔,等于pBuffer存储一个波段的大小 nLineSpace *nBYSize
二、波段交叉,读取rgb,可直接生成图片
如果 nPixelSpace = sizeof(unsigned char) * 3
如果 nLineSpace = nPixelSpace * nBXSize
如果 nBandSpace = sizeof(unsigned char) * 1
此种读法,pBuffer 中的数据顺序相当于按波段交叉 rgbrgbrgbrgb....
1、同一波段列间隔是 r与r(g与g,b与b)之间的间隔,等于 sizeof(unsigned char) * 3
2、同一波段行间隔自然就是 nPixelSpace *nBXSize
3、波段之间的间隔是 第一个r与第一个g(g与b,按顺序来)之间的间隔,等于 sizeof(unsigned char) * 1
总结: 1)nBandCout 用于确定读取 几个波段的数据
2)int* panBandMap 确定读取哪些波段数据,当然也可以重复 panBandMap[] = {1,1,1}也行
3)后面三个 GSpacing 类型的参数,定义了波段中的数据在pBuffer中的存储位置
4)nPixelSpace定义了同一波段数据在pBuffer中的相邻像素的间隔, nLineSpace = nPixelSpace*nBXSize;
nBandSpace 定义了相邻波段在pBuffer中的间隔(首元素)