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);
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.
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,
TryGetLockedBlockRef
una función de no bloqueo que devuelve una referencia de bloque inmediatamente si está disponible yGetLockedBlockRef
una 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 utilizarTryGetLockedBlockRef
para evitar bloquear otros subprocesos. En un entorno de subproceso único, se puede utilizarGetLockedBlockRef
.
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 * GetIndexColorTranslationTo(GDALRasterBand *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;
}
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).
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;
}