以下是基于GDAL计算栅格影像覆盖范围的C++代码,不包括0值区域:

#include "gdal_priv.h"
#include "cpl_conv.h" // for CPLMalloc()

int main()
{
    GDALAllRegister();

    // Open the raster file
    GDALDataset *poDataset;
    poDataset = (GDALDataset *) GDALOpen("input.tif", GA_ReadOnly);

    // Get raster band count
    int nBands = poDataset->GetRasterCount();

    // Get raster size
    int nXSize = poDataset->GetRasterXSize();
    int nYSize = poDataset->GetRasterYSize();

    // Get raster geotransform
    double adfGeoTransform[6];
    poDataset->GetGeoTransform(adfGeoTransform);

    // Create a mask raster
    GDALDataset *poMaskDataset;
    GDALDriver *poDriver;
    poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");
    poMaskDataset = poDriver->Create("mask.tif", nXSize, nYSize, 1, GDT_Byte, NULL);

    // Set raster geotransform
    poMaskDataset->SetGeoTransform(adfGeoTransform);

    // Set raster projection
    poMaskDataset->SetProjection(poDataset->GetProjectionRef());

    // Create a buffer for reading raster data
    int nBufferSize = nXSize * nYSize;
    float *pafBuffer = (float *) CPLMalloc(sizeof(float) * nBufferSize);

    // Read raster data band by band
    for (int i = 1; i <= nBands; i++)
    {
        GDALRasterBand *poBand = poDataset->GetRasterBand(i);
        poBand->RasterIO(GF_Read, 0, 0, nXSize, nYSize, pafBuffer, nXSize, nYSize, GDT_Float32, 0, 0);

        // Set mask for non-zero values
        for (int j = 0; j < nBufferSize; j++)
        {
            if (pafBuffer[j] != 0)
            {
                pafBuffer[j] = 1;
            }
        }

        // Write mask data to mask raster
        GDALRasterBand *poMaskBand = poMaskDataset->GetRasterBand(1);
        poMaskBand->RasterIO(GF_Write, 0, 0, nXSize, nYSize, pafBuffer, nXSize, nYSize, GDT_Byte, 0, 0);
    }

    // Calculate raster coverage extent
    double adfExtent[4];
    GDALRasterBand *poMaskBand = poMaskDataset->GetRasterBand(1);
    poMaskBand->GetExtent(adfExtent);

    // Print coverage extent
    printf("Coverage extent: (%.2f, %.2f) - (%.2f, %.2f)\n", adfExtent[0], adfExtent[2], adfExtent[1], adfExtent[3]);

    // Clean up
    CPLFree(pafBuffer);
    GDALClose(poDataset);
    GDALClose(poMaskDataset);

    return 0;
}
用c++语言实现基于GDAL计算栅格影像覆盖范围不包括0值区域。

原文地址: https://www.cveoy.top/t/topic/b9Od 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录