美文网首页
GDALDataset::RasterIO()

GDALDataset::RasterIO()

作者: NullUser | 来源:发表于2023-03-21 12:00 被阅读0次

参数

函数原型:

CPLErr 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
)
  • eRWFlag - 枚举,GF_Read代表将数据读取到缓存中,GF_Write代表将数据从缓存写入栅格。

  • nXOff - 栅格像素在x轴上的偏移起始位置

  • nYOff - 栅格像素在y轴上的偏移起始位置

  • nXSize - 需要读/写的栅格宽度

  • nYSize - 需要读/写的栅格高度
    如:在一个4x4像素的栅格中,通过以上四个参数指定出红色的4个像素。


    示例.png
  • pData - 缓冲区,eRWFlag为GF_Read时,栅格数据被读取进该缓冲区;当eRWFlag为GF_Write时,此缓冲区的数据写入栅格。

  • nBufXSize - 缓冲区的宽度

  • nBufYSize - 缓冲区的高度

  • eBufType - 像素的数据类型,此类型会决定了pData的真实类型。

  • nBandCount - 波段数量,指定要读/写的波段数

  • panBandMap - 波段数组,指定要读/写的具体波段

  • nPixelSpace - 指定在pData中存放源栅格一个像素开始到下一个像素的字节偏移量,默认(0)则是eBufType的大小。

  • nLineSpace - 指定pData中存放原栅格一行到下一行的字节偏移量,默认(0)则是eBufType * nBufXSize的大小。

  • nBandSpace - 指定一个波段到下一个波段的字节偏移量,默认(0)则是eBufType * nBufXSize * nBufYSize。

通过参数指定波段

源码分析:

    int anBandMap[] = { 1, 2, 3, 4 };
    if( panBandMap == nullptr )
    {
        if( nBandCount > 4 )
        {
            panBandMap =
                static_cast<int *>(VSIMalloc2(sizeof(int), nBandCount));
            if (panBandMap == nullptr)
            {
                ReportError(CE_Failure, CPLE_OutOfMemory,
                            "Out of memory while allocating band map array");
                return CE_Failure;
            }

            for( int i = 0; i < nBandCount; ++i )
                panBandMap[i] = i + 1;

            bNeedToFreeBandMap = true;
        }
        else
        {
            panBandMap = anBandMap;
        }
    }

从GDALDataset::RasterIO()源码中可以看出,其默认了有四个波段,当未指定具体波段时(即传入panBandMap为空指针),会根据传入的波段数使用默认的波段数组。

指定IO规则

通过指定nPixelSpace、nLineSpace、nBandSpace,可以以不同的规则进行IO。

关于nPixelSpace、nBandSpace、nLineSpace参数和pData内存的关系可见下图:
nPixelSpace指定栅格像素在pData中所占的空间,即指定行列号所对应的像素占用的空间。
nBandSpace指定栅格一个波段到下一个波段的偏移大小。
如图中所示,假设nPixelSpace为3,nBandSpace为1,即一个行列号所对应像素的空间为3,一个波段空间为1,那么可以在pData连续内存内储存一个像素的3个波段数据(3 / 1 = 3),如果栅格有5个波段,那么第4、5个波段的数据将无法储存。
nLineSpace指定栅格中的一行在pData中的空间,假设pLineSpace为10,那么可以在pData连续内存内储存一行中的三个像素(10 / 3 = 3),如果一行有4个像素,那么第四个像素的值将不会被放入pData.


pData.png

IO示例:

以读取为例,假定样例栅格为:
3x3,2个波段。
假设1波段数据为:

11,12,13,
14,15,16,
17,18,19,

2波段数据为:

21,22,23,
24,25,26,
27,28,29,
    1. 情形一,nPixelSpace=1byte, nLineSpace=3byte,nBandSpace=9byte。
    int nPixelSpace = sizeof(GByte);
    int nLineSpace = sizeof(GByte) * nXSize;
    int nBandSpace = sizeof(GByte) * nXSize * nYSize;
    //int nBandSpace = sizeof(GByte);
    GByte* pData= (GByte*)VSI_MALLOC2_VERBOSE(sizeof(GByte), nXSize * nYSize * 2);
    poDs->RasterIO(GF_Read,
        0, 0, nXSize, nYSize,
        pData, nXSize, nYSize, GDT_Byte,
        2, nullptr,
        nPixelSpace, nLineSpace, nBandSpace, nullptr);
    int index = 0;
    for (; index < nXSize * nYSize * 2; index++)
    {
        printf("%d,", pData[index]);
    }
    printf("\n");

输出:

11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,

分析:

    1. 情形二,nPixelSpace=2byte, nLineSpace=6byte,nBandSpace=1byte。
    int nPixelSpace = sizeof(GByte) * 2 ;   //2
    int nLineSpace = sizeof(GByte) * 2 * nXSize; //6
    int nBandSpace = sizeof(GByte);   //1

输出:

11,21,12,22,13,23,14,24,15,25,16,26,17,27,18,28,19,29
  • 情形三,nPixelSpace=3byte, nLineSpace=3byte,nBandSpace=1byte。
    int nPixelSpace = sizeof(GByte) * 3;        //3
    int nLineSpace = sizeof(GByte)  * nXSize;   //3
    int nBandSpace = sizeof(GByte);             //1

输出:

11,21,0,14,24,0,17,27,0,18,28,0,19,29,0,0,0,0

分析:像素占用空间为3字节,栅格一行占用空间3字节,此时栅格中的一行数据只允许储存一个像素(3 / 3 =1),也就是说栅格每行的第2,3个像素将被舍弃,不会放入pData。而band的偏移为1字节,所以一个像素可以放三个波段的数据(3 / 3=1),而源栅格只有两个波段,所有每个像素对应的三个字节中,第三个字节输出为0.

相关文章

  • rasterio的安装和使用

    前言 很久没更新公众号啦,给看客老爷们汇报下我最近都在忙啥。由于工作和自己的原因,需要搞一点科研,这一直是我的短板...

  • python中快速生成多边形掩膜的方法

    使用Sentinel等遥感数据,生成的时序植被指数数据的波段数通常较大。gdal和rasterio都可以读取栅格数...

  • ENVI制作土地利用转移矩阵

    前言 上次我们介绍了rasterio和arcgis来制作土地利用转移矩阵,这次我们就来看看envi是如何制作的吧。...

  • conda环境迁移

    在离线环境安装rasterio一直不成功,没法了只好把在线环境迁移到离线环境中去,步骤如下:1、安装打包工具 2、...

网友评论

      本文标题:GDALDataset::RasterIO()

      本文链接:https://www.haomeiwen.com/subject/dhlmrdtx.html