GDAL C++ API ruta de aprendizaje (1) Autoaprendizaje de traducción de ejemplo de código GDALRasterBand

Clase GDALRasterBand < gdal_priv.h >

GDALRasterBandes una clase utilizada en GDAL para representar una banda en un conjunto de datos ráster. Un conjunto de datos ráster generalmente consta de múltiples bandas, y cada banda contiene información de datos específica, como elevación, rojo, verde, azul, etc.

Se utiliza para representar diferentes características de una imagen. Se proporcionan varias funciones para acceder y manipular los datos de píxeles de una banda y la información relacionada. Es una de las clases principales para el procesamiento de datos ráster en la API GDAL C++, que proporciona funciones potentes y flexibilidad para el procesamiento y análisis de datos ráster.

 

Funciones publicas

ObtenerTamañoX

int  ObtenerXTamaño ()                

Obtener el XSize del ráster                

Devuelve: el ancho de esta banda en píxeles

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 获取 X 方向大小
    int xSize = band->GetXSize();

    // 输出 X 方向大小
    std::cout << "X Size: " << xSize << std::endl;

ObtenerTamañoY

int  ObtenerTamaño ( )

Obtener el tamaño Y del ráster

Devuelve: la altura de esta banda en píxeles

lo mismo que arriba

Obtener Banda

int  Obtener Banda ( )

Obtener el número de la banda

Devuelve: número de banda (1+) o 0 (si se desconoce el número de banda)

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 获取当前波段的频段编号
    int bandNumber = band->GetBand();

    // 输出频段编号
    std::cout << "Band Number: " << bandNumber << std::endl;

ObtenerRasterDataType

GDALDataType  GetRasterDataType (vacío )

Obtener el tipo de datos de píxel de esta banda

Devuelve: el tipo de datos de píxel de esta banda

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 获取当前波段的像素数据类型
    GDALDataType dataType = band->GetRasterDataType();

    // 输出像素数据类型的字符串表示
    const char* dataTypeStr = GDALGetDataTypeName(dataType);
    std::cout << "Raster Data Type: " << dataTypeStr << std::endl

GDALDatasetEs posible que diferentes bandas ( ) en un conjunto de datos ( GDALRasterBand) tengan diferentes tipos de datos de píxeles. En aplicaciones prácticas, diferentes bandas en un conjunto de datos multibanda pueden representar información diferente, por lo que sus tipos de datos de píxeles pueden ser diferentes.

Por ejemplo, para una imagen en color, normalmente hay tres bandas: roja, verde y azul. Las bandas roja, verde y azul pueden tener diferentes tipos de datos de píxeles, por ejemplo, la banda roja puede ser un número entero sin signo de 8 bits (GDT_Byte), la banda verde puede ser un número entero sin signo de 16 bits (GDT_UInt16) y la banda azul puede ser un número de punto flotante de 32 bits ( GDT_Float32).

Por lo tanto, cuando trabaje con conjuntos de datos multibanda, debe conocer el tipo de datos de píxel para cada banda para garantizar que los valores de píxel se interpreten y manejen correctamente. Puede obtener el tipo de datos de píxeles de cada banda a través de las funciones GDALRasterBandde la clase y luego procesar diferentes tipos de valores de píxeles.GetRasterDataType()

ObtenerTamañoBloque

anular  GetBlockSize (int*, int * )

Obtenga el tamaño de bloque "natural" para esta banda

parámetro:

  • pnXSize  -- Entero para poner tamaño de bloque X o NULL.

  • pnYSize  : entero para poner el tamaño del bloque Y o NULL 

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 获取当前波段的数据块大小
    int blockWidth, blockHeight;
    band->GetBlockSize(&blockWidth, &blockHeight);

    // 输出数据块大小
    std::cout << "Block Width: " << blockWidth << std::endl;
    std::cout << "Block Height: " << blockHeight << std::endl;

ObtenerTamañoBloqueActual

CPLErr  GetActualBlockSize (int, int, int*, int * )

Obtiene el tamaño de bloque real para un desplazamiento de bloque dado, maneja bloques parciales en el borde del ráster y devuelve el número real de píxeles

parámetro:

  • nXBlockOff  : el desplazamiento de bloque horizontal utilizado para calcular el número efectivo de píxeles, cero significa el bloque más a la izquierda, 1 significa el siguiente bloque, y así sucesivamente.

  • nYBlockOff  : el desplazamiento del bloque vertical, cero significa el bloque más a la izquierda, 1 significa el siguiente bloque, y así sucesivamente.

  • pnXValid  : puntero a un número entero en el que se almacenará el número de píxeles válidos en la dirección x

  • pnYValid  : puntero a un número entero en el que se almacenará el número de píxeles válidos en la dirección y

Devuelve: CE_None si el parámetro de entrada es válido, de lo contrario CE_Failure

GDALSuggestedBlockAccessPattern

GDALSuggestedBlockAccessPattern virtual GetSuggestedBlockAccessPattern() const

Devuelve el modo de acceso recomendado/más eficiente al bloque (para operaciones de lectura)

  1. GF_READ: modo de sólo lectura. En este modo, los bloques de datos se pueden leer, pero no escribir.

  2. GF_WRITE: modo de solo escritura. En este modo, los bloques de datos se pueden escribir, pero no leer.

  3. GF_READWRITE: modo de lectura y escritura. En este modo, los bloques de datos se pueden leer y escribir.

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 获取数据块的访问模式
    GDALSuggestedBlockAccessPattern accessPattern = band->GetSuggestedBlockAccessPattern();

    // 根据获取的访问模式进行操作
    switch (accessPattern)
    {
    case GF_READ: // 仅读取模式
        std::cout << "Block Access Pattern: Read Only" << std::endl;
        break;
    case GF_READWRITE: // 读写模式
        std::cout << "Block Access Pattern: Read and Write" << std::endl;
        break;
    case GF_WRITE: // 仅写入模式
        std::cout << "Block Access Pattern: Write Only" << std::endl;
        break;
    default:
        std::cout << "Block Access Pattern: Unknown" << std::endl;
        break;
    }

Tener acceso

GDALAccess  GetAccess ( )

Averigüe si tenemos derechos de actualización para esta banda

Devolución: ya sea GA_Update o GA_ReadOnly

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 获取数据块的访问模式
    GDALAccess access = band->GetAccess();

    // 根据获取的访问模式进行操作
    switch (access)
    {
    case GA_ReadOnly:
        std::cout << "Band Access Mode: Read Only" << std::endl;
        break;
    case GA_Update:
        std::cout << "Band Access Mode: Read and Write" << std::endl;
        break;
    default:
        std::cout << "Band Access Mode: Unknown" << std::endl;
        break;
    }

RasterIO

CPLErr  RasterIO ( GDALRWFlag , int, int, int, void*, int, int,  GDALDataTypeGSpacing  ,  GSpacingGDALRasterIOExtraArg  *psExtraArg  )

Área de datos de imagen de lectura/escritura para esta banda

parámetro:

  • eRWFlag  : GF_Read lee el área de datos o GF_Write escribe el área de datos.

  • nXOff  : compensación en píxeles de la esquina superior izquierda de la región de la banda a la que se accede. A partir de la izquierda será cero.

  • nYOff  : la línea desplazada hacia la esquina superior izquierda de la región de la banda a la que se accede. Comenzando en la parte superior, será cero.

  • nXSize  : ancho en píxeles de la región de la banda a la que se accede.

  • nYSize  : la altura de la región de la banda para acceder en unidades de fila.

  • pData  --  [inout]  El búfer en el que se deben leer o escribir los datos. Este búfer debe contener al menos nBufXSize * nBufYSize palabras de tipo eBufType. Está organizado en orden de píxeles de izquierda a derecha y de arriba a abajo. El espaciado está controlado por los parámetros nPixelSpace y nLineSpace.

  • nBufXSize  : el ancho de la imagen del búfer para leer o escribir en la región deseada.

  • nBufYSize  : la altura de la imagen del búfer para leer o escribir en la región deseada.

  • eBufType  : el tipo de valores de píxeles en el búfer de datos pData. Los valores de píxeles se convertirán automáticamente al tipo de datos GDALRasterBand según sea necesario   .

  • nPixelSpace  : el desplazamiento de bytes desde el inicio de un valor de píxel en pData hasta el inicio del siguiente valor de píxel dentro de la línea de exploración. Si es el valor predeterminado (0), se utiliza el tamaño del tipo de datos eBufType.

  • nLineSpace  : el desplazamiento en bytes desde el comienzo de una línea de exploración hasta el comienzo de la siguiente línea de exploración en pData. Si el valor predeterminado es (0), se utiliza el tamaño del tipo de datos eBufType * nBufXSize.

  • psExtraArg  --  [in] (Nuevo en GDAL 2.0) Puntero a  una  estructura GDALRasterIOExtraArg con parámetros adicionales para especificar remuestreo y devoluciones de llamada de progreso, o NULL para el comportamiento predeterminado. También es posible definir la opción de configuración GDAL_RASTERIO_RESAMPLING para anular el remuestreo predeterminado a uno de bilineal, cúbico, tipo cúbico, lanzos, promedio o modo.

Devuelve: CE_Failure si falla el acceso, de lo contrario CE_None

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 定义读取的数据范围和数据类型
    int xOff = 0;            // 读取数据的起始列
    int yOff = 0;            // 读取数据的起始行
    int xSize = 100;         // 读取数据的列数
    int ySize = 100;         // 读取数据的行数
    int nbufXSize = xSize;    // 输出缓冲区的列数(设置与 xSize 相同)
    int nbufYSize = ySize;    // 输出缓冲区的行数(设置与 ySize 相同)
    GDALDataType dataType = GDT_Float32;  // 读取的数据类型

    // 分配输出缓冲区
    float* buffer = new float[xSize * ySize];

    // 定义读取选项
    GDALRasterIOExtraArg options;
    options.eResampleAlg = GRIORA_NearestNeighbour; // 设置重采样算法

    // 执行数据读取
    CPLErr err = band->RasterIO(GF_Read, xOff, yOff, xSize, ySize, buffer, nbufXSize, nbufYSize, dataType, 0, 0, &options);

    // 检查读取是否成功
    if (err != CE_None)
    {
        std::cout << "Error reading raster data." << std::endl;
    }
    else
    {
        // 在此处处理读取的数据
        // 例如,可以输出前 10 个像素的值
        for (int i = 0; i < 10; i++)
        {
            std::cout << "Pixel " << i << ": " << buffer[i] << std::endl;
        }
    }

    // 释放资源并关闭数据集
    delete[] buffer;

Bloque de lectura

CPLErr  ReadBlock (int, int, void  * )

Lectura eficiente de bloques de datos de imagen

parámetro:

  • nXBlockOff  : el desplazamiento del bloque horizontal, cero significa el bloque más a la izquierda, 1 significa el siguiente bloque, y así sucesivamente.

  • nYBlockOff  -- Desplazamiento de bloque vertical, cero significa el bloque superior, 1 significa el siguiente bloque, y así sucesivamente.

  • pImage  : el búfer en el que se leerán los datos. El búfer debe ser lo suficientemente grande como para contener  palabras GetBlockXSize()*GetBlockYSize() del tipo GetRasterDataType() .

Retorno: CE_Ninguno éxito o error CE_Failure

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 定义数据块的左上角坐标
    int blockXOff = 0;  // 数据块的起始列
    int blockYOff = 0;  // 数据块的起始行

    // 获取数据块的大小
    int blockXSize = band->GetBlockXSize();  // 数据块的列数
    int blockYSize = band->GetBlockYSize();  // 数据块的行数

    // 分配输出缓冲区
    float* buffer = new float[blockXSize * blockYSize];

    // 执行数据读取
    CPLErr err = band->ReadBlock(blockXOff, blockYOff, buffer);
    
    //执行某些操作

    // 释放资源并关闭数据集
    delete[] buffer;

EscribirBloque

CPLErr  WriteBlock (int, int, void  * )

Escritura eficiente de bloques de datos de imagen

parámetro:

  • nXBlockOff  : el desplazamiento del bloque horizontal, cero significa el bloque más a la izquierda, 1 significa el siguiente bloque, y así sucesivamente.

  • nYBlockOff  : el desplazamiento del bloque vertical, cero significa el bloque más a la izquierda, 1 significa el siguiente bloque, y así sucesivamente.

  • pImage  : el búfer desde el que se escribirán los datos. El búfer debe ser lo suficientemente grande como para contener  palabras GetBlockXSize()*GetBlockYSize() del tipo GetRasterDataType() .

Retorno: CE_Ninguno éxito o error CE_Failure

    // 获取第一个波段
    GDALRasterBand* band = dataset->GetRasterBand(1);

    // 定义数据块的左上角坐标
    int blockXOff = 0;  // 数据块的起始列
    int blockYOff = 0;  // 数据块的起始行

    // 获取数据块的大小
    int blockXSize = band->GetBlockXSize();  // 数据块的列数
    int blockYSize = band->GetBlockYSize();  // 数据块的行数

    // 分配输入缓冲区,用于存储要写入数据块的栅格数据
    float* buffer = new float[blockXSize * blockYSize];

    // 在此处填充输入缓冲区,例如,将缓冲区中的数据设置为一定值

    // 执行数据写入
    CPLErr err = band->WriteBlock(blockXOff, blockYOff, buffer);

    //执行某些操作

    // 释放资源并关闭数据集
    delete[] buffer;

​​​​​​​

Supongo que te gusta

Origin blog.csdn.net/qq_69574549/article/details/132042221
Recomendado
Clasificación