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

Clase GDALRasterBand <gdal_priv.h>

GDALRasterBand es 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

GetLockedBlockRef

GDALRasterBlock * GetLockedBlockRef (int nXBlockOff, int nYBlockOff, int bJustInitialize = FALSO )

Obtiene un puntero al bloque ráster en caché interno

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.

  • bJustInitialize  : si es VERDADERO, el bloque se asignará e inicializará, pero en realidad no se leerá desde la fuente. Esto es útil cuando está completamente configurado y reescrito.

Devuelve: puntero a objeto de bloque o NULL en caso de error

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

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

    // 获取锁定的数据块的引用
    GDALRasterBlock* block = band->GetLockedBlockRef(blockXOff, blockYOff);

TryGetLockedBlockRef

GDALRasterBlock * TryGetLockedBlockRef (int nXBlockOff, int nYBlockYOff )

tratar de obtener cotización en bloque

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.

Devuelve: NULL si el bloque no está disponible o un puntero de bloque bloqueado

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

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

    // 尝试获取锁定的数据块的引用
    GDALRasterBlock* block = band->TryGetLockedBlockRef(blockXOff, blockYOff);
  1. TryGetLockedBlockRef: esta función intenta obtener una referencia al bloque de datos bloqueado en la ubicación especificada, pero no bloqueará el acceso de otros subprocesos o procesos al bloque de datos. Si la referencia del bloque de datos bloqueado no se puede adquirir inmediatamente, devolverá inmediatamente un puntero nulo ( nullptr). De esta forma, otros hilos o procesos pueden continuar ejecutándose sin esperar la disponibilidad de bloques de datos. Esta función es adecuada para su uso en un entorno de subprocesos múltiples para evitar esperas y condiciones de carrera.

  2. GetLockedBlockRef: Esta función también se usa para obtener una referencia al bloque de datos bloqueado en la ubicación especificada, pero es una llamada de bloqueo. Si una referencia de bloque de datos bloqueada no se puede adquirir de inmediato, espera a que un bloque de datos esté disponible y se bloquea hasta que esté disponible un bloque de datos. Esto significa que otros subprocesos o procesos se bloquean hasta que adquieren una referencia al bloque de datos bloqueado. Por lo tanto, esta función debe usarse en un entorno de subproceso único o para asegurarse de que no provoque condiciones de carrera.

En resumen, TryGetLockedBlockRefuna función de no bloqueo que devuelve una referencia de bloque inmediatamente si está disponible y GetLockedBlockRefuna función de bloqueo que espera a que el bloque esté disponible. Debe elegir qué función usar en función de su escenario de aplicación específico. En un entorno de subprocesos múltiples, se recomienda utilizar TryGetLockedBlockRefpara evitar bloquear otros subprocesos. En un entorno de subproceso único, se puede utilizar GetLockedBlockRef.

FlushBlock

CPLErr  FlushBlock (int, int, int bWriteDirtyBlock = TRUE )

Borrar bloques de la caché de bloques

parámetro:

  • nXBlockOff  -- bloque x desplazamiento

  • nYBlockOff  -- compensación de bloque

  • bWriteDirtyBlock  : si el bloque debe escribirse en el disco si está sucio.

Devuelve: CE_None si tiene éxito, de lo contrario, un código de error

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

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

    // 获取锁定的数据块的引用
    GDALRasterBlock* block = band->GetLockedBlockRef(blockXOff, blockYOff);

    if (block != nullptr)
    {
        // 在此处处理锁定的数据块
        // 例如,可以修改数据块的像素值

        // 将修改后的数据块写入数据集
        CPLErr err = band->FlushBlock(blockXOff, blockYOff, TRUE);

        if (err != CE_None)
        {
            std::cout << "Error writing raster block." << std::endl;
        }
        else
        {
            std::cout << "Data block written successfully." << std::endl;
        }

        // 释放数据块的引用
        band->DropLock(blockXOff, blockYOff);
    }

GetIndexColorTranslationTo

carácter sin firmar * GetIndexColorTranslationToGDALRasterBand  *poReferenceBand, carácter sin firmar *pTranslationTable = nullptr, int *pApproxMatch =  nullptr )

Calcule la tabla de conversión para el mapa de colores

parámetro:

  • poReferenceBand  -- banda de trama

  • pTranslationTable  : una tabla de traducción ya asignada (al menos 256 bytes), o NULL para permitir que el método la asigne

  • pApproxMatch  : puntero a indicador para establecer cuándo la coincidencia es aproximada. Puede estar vacío.

Devuelve: una tabla de conversión si las dos bandas son índices de paleta y no coinciden, NULL en caso contrario. Si se pasa NULL para pTranslationTable, la tabla debe liberarse usando CPLFree

    // 获取第一个波段和参考波段(假设参考波段索引为 2)
    GDALRasterBand* band = dataset->GetRasterBand(1);
    GDALRasterBand* referenceBand = dataset->GetRasterBand(2);

    // 获取当前波段的颜色索引到参考波段的颜色索引的转换表
    int colorTableSize = band->GetColorTable()->GetColorEntryCount(); // 获取颜色表的大小
    unsigned char* translationTable = new unsigned char[colorTableSize];
    int approxMatch;

    band->GetIndexColorTranslationTo(referenceBand, translationTable, &approxMatch);

FlushCache

virtual  CPLErr  FlushCache (bool bAtClosing =  falso )

Vaciar caché de datos ráster Esta llamada restaura la memoria utilizada para almacenar en caché los bloques de datos para esta banda ráster y garantiza que las nuevas solicitudes se remitan al controlador subyacente.

parámetro:

bAtClosing  : si se llama desde  el  destructor GDALDataset

Devolución: CE_Ninguno éxito

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

    // 读取数据块或执行其他操作,导致波段的缓存被更新

    // 刷新波段的缓存,将缓存中的数据写入数据集
    CPLErr err = band->FlushCache();

ObtenerNombresDeCategoría

carácter virtual  ** GetCategoryNames ( )

Obtener una lista de nombres de categoría para este ráster

Devuelve: lista de nombres, o NULL si no hay ninguno

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

    // 获取波段的分类名称
    char** categoryNames = band->GetCategoryNames();

Establecer nombres de categoría

virtual  CPLErr  SetCategoryNames(char **papszNames )

Establecer el nombre de clase para esta banda

parámetro:

papszNames  : lista terminada en NULL de cadenas de nombres de categoría. Solo borrar las listas existentes puede ser NULL.

Devuelve: CE_None para éxito, CE_Failure para falla. Si el controlador no lo admite, se devuelve CE_Failure, pero no se informa ningún mensaje de error.

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

    // 设置分类名称
    char* categoryNames[] = { "Category A", "Category B", "Category C" };
    CPLErr err = band->SetCategoryNames(categoryNames);

ObtenerNoDataValue

 doble  virtual GetNoDataValue (int *pbSuccess =  nullptr )

Obtener el valor sin datos para esta banda

parámetro:

pbSuccess  : puntero a booleano que indica si un valor está realmente asociado con esta capa. Puede ser NULL (el valor predeterminado).

Devoluciones: ningún valor de datos para esta banda

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

    // 获取波段的无数据值
    int pbSuccess;
    double noDataValue = band->GetNoDataValue(&pbSuccess);

    if (pbSuccess)
    {
        std::cout << "NoData Value: " << noDataValue << std::endl;
    }
    else
    {
        std::cout << "No NoData Value found for the band." << std::endl;
    }

GetNoDataValueAsInt64

virtual  int64_t  GetNoDataValueAsInt64 (int *pbSuccess =  nullptr )

Obtenga el        valor método solo debe llamarse en rásteres con tipo de datos GDT_Int64.

parámetro:

pbSuccess  : puntero a booleano que indica si un valor está realmente asociado con esta capa. Puede ser NULL (el valor predeterminado).

Devoluciones: ningún valor de datos para esta banda

GetNoDataValueAsUInt64

virtual  uint64_t  GetNoDataValueAsUInt64 (int *pbSuccess =  nullptr )

Obtenga el valor sin datos para esta banda. Este método solo debe llamarse en rásteres de tipo de datos GDT_UInt64

Obtener Mínimo

 doble  virtual GetMinimum (int *pbSuccess =  nullptr )

Obtener el valor mínimo de esta banda

parámetro:

pbSuccess  : puntero a booleano que indica si el valor de retorno es un mínimo ajustado. Puede ser NULL (el valor predeterminado).

Devoluciones: valor de ráster mínimo (excluyendo píxeles sin datos)

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

    // 获取波段的最小值
    int pbSuccess;
    double minValue = band->GetMinimum(&pbSuccess);

    if (pbSuccess)
    {
        std::cout << "Minimum Value: " << minValue << std::endl;
    }
    else
    {
        std::cout << "Failed to get the minimum value for the band." << std::endl;
    }

ObtenerMáximo

GetMaximum  doble  virtual (int *pbSuccess =  nullptr )

Obtener el valor máximo de esta banda

parámetro:

pbSuccess  : puntero a booleano que indica si el valor de retorno es un mínimo ajustado. Puede ser NULL (el valor predeterminado).

Devoluciones: valor de ráster mínimo (excluyendo píxeles sin datos)

ObtenerCompensación

GetOffset  doble  virtual (int *pbSuccess =  nullptr )

Obtener compensación de valor de ráster       

parámetro:

pbSuccess  : puntero a booleano que indica si el valor devuelto es significativo. Puede ser NULL (el valor predeterminado).

Devoluciones: desplazamiento de cuadrícula

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

    // 获取波段的数据偏移值
    int pbSuccess;
    double offset = band->GetOffset(&pbSuccess);

    if (pbSuccess)
    {
        std::cout << "Offset Value: " << offset << std::endl;
    }
    else
    {
        std::cout << "Failed to get the offset value for the band." << std::endl;
    }

ObtenerEscala

GetScale  doble  virtual (int *pbSuccess =  nullptr )

Obtener          valor de unidad de escala de valor ráster = (valor original * escala) + desplazamiento

parámetro:

pbSuccess  : puntero a booleano que indica si el valor devuelto es significativo. Puede ser NULL (el valor predeterminado).

Devoluciones: escala de cuadrícula

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

    // 获取波段的数据比例尺
    int pbSuccess;
    double scale = band->GetScale(&pbSuccess);

    if (pbSuccess)
    {
        std::cout << "Scale Value: " << scale << std::endl;
    }
    else
    {
        std::cout << "Failed to get the scale value for the band." << std::endl;
    }
  1. Datos de imagen de teledetección:

    • Imagen en escala de grises: por lo general, use una escala constante, como 0,1, lo que significa que cada valor de píxel se multiplica por 0,1 para obtener el valor real medido.
    • Imágenes de coma flotante sin unidades: normalmente utilizan una escala constante, como 0,01, lo que significa que cada valor de píxel se multiplica por 0,01 para obtener el valor físico real (como el resplandor).
    • Imágenes de punto flotante con unidades: generalmente usan una escala constante, como 0,001, lo que significa que cada valor de píxel se multiplica por 0,001 para obtener el valor físico real (como la temperatura).
  2. Datos vectoriales SIG:

    • Datos de puntos: las barras de escala se utilizan a menudo para convertir coordenadas geográficas (latitud-longitud o coordenadas proyectadas) en longitudes reales (como metros).
    • Datos de línea y datos de polígono: las barras de escala se utilizan para convertir las coordenadas geográficas en longitudes reales.

ObtenerTipoUnidad

 carácter constante virtual  * GetUnitType ( )

Devuelve el tipo de unidad de ráster

Devuelve: cadena de nombre del dispositivo

GetUnitType()es la función utilizada para obtener el tipo de unidad de datos,

En cambio GetRasterDataType(), la función utilizada para obtener el tipo de datos del valor de píxel

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

    // 获取波段的单位类型
    const char* unitType = band->GetUnitType();

Obtenerinterpretación del color

 GDALColorInterp  virtual GetColorInterpretation ( )

cómo se debe interpretar esta banda como color

Se devolverá GCI_Undefined cuando el formato no sepa nada sobre la interpretación del color.

Devuelve: el valor de interpretación del color de la banda

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

    // 获取波段的颜色解释方式
    GDALColorInterp colorInterp = band->GetColorInterpretation();

    switch (colorInterp)
    {
        case GCI_Undefined:
            std::cout << "Color Interpretation: Undefined" << std::endl;
            break;
        case GCI_GrayIndex:
            std::cout << "Color Interpretation: Gray Index" << std::endl;
            break;
        case GCI_PaletteIndex:
            std::cout << "Color Interpretation: Palette Index" << std::endl;
            break;
        case GCI_RedBand:
            std::cout << "Color Interpretation: Red Band" << std::endl;
            break;
        case GCI_GreenBand:
            std::cout << "Color Interpretation: Green Band" << std::endl;
            break;
        case GCI_BlueBand:
            std::cout << "Color Interpretation: Blue Band" << std::endl;
            break;
        // 其他颜色解释方式可以继续添加在这里
        default:
            std::cout << "Color Interpretation: Unknown" << std::endl;
            break;
    }

    GCI_Undefined = 0, // método de interpretación de color no definido
    GCI_GrayIndex = 1, // imagen en escala de grises
    GCI_PaletteIndex = 2, // imagen de índice de paleta
    GCI_RedBand = 3, // banda roja
    GCI_GreenBand = 4, // banda verde
    GCI_BlueBand = 5, // azul banda
    GCI_AlphaBand = 6, // banda de transparencia (Alpha)
    GCI_HueBand = 7, // banda de tono (Tono)
    GCI_SaturationBand = 8, // banda de saturación (Saturación)
    GCI_LightnessBand = 9, // Banda de brillo (luminosidad)
    GCI_CyanBand = 10, / / Banda cian (Cyan)
    GCI_MagentaBand = 11, // Banda magenta (Magenta)
    GCI_YellowBand = 12, // Banda amarilla (Yellow)
    GCI_BlackBand = 13, // Banda negra (Black)
    GCI_YCbCr_YBand = 14, // Banda Y de color YCbCr espacio
    GCI_YCbCr_CbBand = 15, // Banda Cb del espacio de color YCbCr
    GCI_YCbCr_CrBand = 16 // Banda Cr del espacio de color YCbCr

 

ObtenerTablaColor

GDALColorTable virtual  * GetColorTable ( )

Obtener el mapa de colores asociado a la banda

Devuelve NULL si no hay un mapa de colores asociado

Devuelve: el mapa de colores interno o NULL

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

    // 获取波段的颜色表
    GDALColorTable* colorTable = band->GetColorTable();

    if (colorTable != nullptr)
    {
        int numColors = colorTable->GetColorEntryCount();
        std::cout << "Number of Colors in Color Table: " << numColors << std::endl;

        // 输出颜色表中的颜色
        for (int i = 0; i < numColors; ++i)
        {
            GDALColorEntry colorEntry;
            colorTable->GetColorEntryAsRGB(i, &colorEntry);

            std::cout << "Color " << i << ": R=" << static_cast<int>(colorEntry.c1) << ", "
                      << "G=" << static_cast<int>(colorEntry.c2) << ", "
                      << "B=" << static_cast<int>(colorEntry.c3) << std::endl;
        }
    }
    else
    {
        std::cout << "No color table found for the band." << std::endl;
    }

Supongo que te gusta

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