GDAL C++ API ラーニング パス (1) GDALRasterBand コードサンプル翻訳の自習

GDALRasterBand クラス < gdal_priv.h >

GDALRasterBandGDAL でラスター データセット内のバンドを表すために使用されるクラスです。通常、ラスター データセットは複数のバンドで構成されており、各バンドには標高、赤、緑、青などの特定のデータ情報が含まれています。

画像のさまざまな特徴を表すために使用されます。バンドのピクセル データおよび関連情報にアクセスして操作するために、多数の関数が提供されています。これは、GDAL C++ API でラスター データを処理するためのコア クラスの 1 つであり、ラスター データの処理と分析に強力な機能と柔軟性を提供します。

 

公的行事

GetXSize

int  GetXSize ()                

ラスターのXSizeを取得します。                

戻り値: このバンドの幅 (ピクセル単位)

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

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

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

GetYSize

int  GetYSize ( )

ラスターのYSizeを取得します。

戻り値: このバンドの高さ (ピクセル単位)

同上

GetBand

int  GetBand ( )

バンド番号を取得する

戻り値: バンド番号 (1+) または 0 (バンド番号が不明な場合)

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

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

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

GetRasterDataType

GDALDataType  GetRasterDataType(void

このバンドのピクセル データ タイプを取得します

戻り値: このバンドのピクセル データ型

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

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

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

データセット ( )GDALDataset内の異なるバンド ( ) がGDALRasterBand異なるピクセル データ タイプを持つ可能性があります。実際のアプリケーションでは、マルチバンド データセット内の異なるバンドは異なる情報を表す可能性があるため、ピクセル データ タイプが異なる場合があります。

たとえば、カラー画像の場合、通常、赤、緑、青の 3 つのバンドがあります。赤、緑、青のバンドは異なるピクセル データ タイプを持つ場合があります。たとえば、赤のバンドは 8 ビットの符号なし整数 (GDT_Byte)、緑のバンドは 16 ビットの符号なし整数 (GDT_UInt16)、青のバンドは 16 ビットの符号なし整数 (GDT_UInt16) です。バンドは 32 ビット浮動小数点 (GDT_Float32) である場合があります。

したがって、マルチバンド データセットを操作する場合は、ピクセル値が正しく解釈され処理されるように、各バンドのピクセル データ タイプを認識する必要があります。GDALRasterBandクラス のGetRasterDataType()関数を通じて各バンドのピクセル データ タイプを取得し、さまざまなタイプのピクセル値を処理できます。

GetBlockSize

void  GetBlockSize (int*, int * )

このバンドの「自然な」ブロック サイズを取得します

パラメータ:

  • pnXSize  -- X ブロック サイズを入れる整数、または NULL。

  • pnYSize  – Y ブロック サイズを入れる整数、または 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;

GetActualBlockSize

CPLErr  GetActualBlockSize(int、 int、 int*、 int *

指定されたブロック オフセットの実際のブロック サイズを取得し、ラスターの端にある部分ブロックを処理し、実際のピクセル数を返します。

パラメータ:

  • nXBlockOff  -- 有効ピクセル数の計算に使用される水平ブロック オフセット。0 は左端のブロックを意味し、1 は次のブロックを意味します。

  • nYBlockOff  -- 垂直ブロック オフセット。0 は左端のブロックを意味し、1 は次のブロックを意味します。

  • pnXValid  -- x 方向の有効なピクセル数が格納される整数へのポインタ

  • pnYValid  -- y 方向の有効なピクセル数が格納される整数へのポインタ

戻り値: 入力パラメータが有効かどうかは CE_None、それ以外の場合は CE_Failure

GDALS 推奨ブロックアクセスパターン

virtual GDALSuggestedBlockAccessPattern GetSuggestedBlockAccessPattern() const

ブロックへの推奨/最も効率的なアクセス モードを返します (読み取り操作の場合)

  1. GF_READ: 読み取り専用モード。このモードでは、データ ブロックを読み取ることはできますが、書き込むことはできません。

  2. GF_WRITE: 書き込み専用モード。このモードでは、データ ブロックは書き込むことができますが、読み取ることはできません。

  3. GF_READWRITE: 読み取りおよび書き込みモード。このモードでは、データ ブロックの読み取りと書き込みの両方が可能です。

    // 获取第一个波段
    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;
    }

アクセスを取得

GDALアクセス GetAccess ( )

このバンドの更新権があるかどうかを確認する

戻り値: GA_Update または 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;
    }

ラスターIO

CPLErr  RasterIOGDALRWFlag、 int、 int、 int、 void*、 int、 int、  GDALDataType、  GSpacing  、  GSpacing、  GDALRasterIOExtraArg  *psExtraArg  )

このバンドの画像データ領域の読み取り/書き込み

パラメータ:

  • eRWFlag  -- GF_Read はデータ領域を読み取り、GF_Write はデータ領域に書き込みます。

  • nXOff  – アクセスするバンド領域の左上隅のピクセル単位のオフセット。左から始めるとゼロになります。

  • nYOff  – アクセスするバンド領域の左上隅へのライン オフセット。上から順に、これはゼロになります。

  • nXSize  – アクセスされるバンド領域の幅 (ピクセル単位)。

  • nYSize  – 行単位でアクセスするバンド領域の高さ。

  • pData  --  [inout] データの読み取りまたは書き込みが行われるバッファー。このバッファには、少なくとも nBufXSize * nBufYSize タイプの eBufType ワードが含まれている必要があります。左から右、上から下のピクセル順に編成されています。間隔は、nPixelSpace パラメータと nLineSpace パラメータによって制御されます。

  • nBufXSize  -- 目的の領域から読み書きするバッファ イメージの幅。

  • nBufYSize  -- 目的の領域から読み書きするバッファ イメージの高さ。

  • eBufType  -- pData データ バッファー内のピクセル値のタイプ。ピクセル値は、必要に応じて GDALRasterBandデータ型に自動的に変換されます 。

  • nPixelSpace  -- pData 内の 1 つのピクセル値の先頭からスキャンライン内の次のピクセル値の先頭までのバイト オフセット。デフォルト (0) の場合、データ型 eBufType のサイズが使用されます。

  • nLineSpace  -- pData 内の 1 つのスキャンラインの先頭から次のスキャンラインの先頭までのバイト単位のオフセット。デフォルト (0) の場合、データ型 eBufType * nBufXSize のサイズが使用されます。

  • psExtraArg  --  [in] (GDAL 2.0 の新機能) リサンプリングおよび進行コールバックを指定するための追加パラメータを持つGDALRasterIOExtraArg構造体へのポインタ  、またはデフォルト動作の場合は NULL。GDAL_RASTERIO_RESAMPLING 構成オプションを定義して、デフォルトのリサンプリングをバイリニア、キュービック、キュービックライク、ランゾ、平均、モードのいずれかにオーバーライドすることもできます。

戻り値: アクセスが失敗した場合は CE_Failure、それ以外の場合は 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;

読み取りブロック

CPLErr  ReadBlock(int、 int、 void  * )

画像データブロックの効率的な読み取り

パラメータ:

  • nXBlockOff  -- 水平ブロック オフセット。0 は左端のブロックを意味し、1 は次のブロックを意味します。

  • nYBlockOff  -- 垂直ブロック オフセット。0 は最上位のブロックを意味し、1 は次のブロックを意味します。

  • pImage  -- データが読み込まれるバッファー。バッファーは、  GetRasterDataType() 型の GetBlockXSize()*GetBlockYSize() ワードを保持するのに十分な大きさである必要があります

戻り値: CE_None 成功または 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;

ライトブロック

CPLErr  WriteBlock(int、 int、 void  * )

画像データブロックの効率的な書き込み

パラメータ:

  • nXBlockOff  -- 水平ブロック オフセット。0 は左端のブロックを意味し、1 は次のブロックを意味します。

  • nYBlockOff  -- 垂直ブロック オフセット。0 は左端のブロックを意味し、1 は次のブロックを意味します。

  • pImage  -- データが書き込まれるバッファー。バッファーは、  GetRasterDataType() 型の GetBlockXSize()*GetBlockYSize() ワードを保持するのに十分な大きさである必要があります

戻り値: CE_None 成功または 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;

​​​​​​​

おすすめ

転載: blog.csdn.net/qq_69574549/article/details/132042221