介绍 GDALDataset::RasterIO 函数如何读取数据

本文深入解析GDAL库中的RasterIO函数,阐述其参数意义与数据读取机制,包括如何通过不同参数设置实现波段数据的连续或交叉读取,适用于遥感影像处理与地理信息系统开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中的间隔(首元素)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值