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

int main() { GDALAllRegister();

// 打开栅格文件
GDALDataset *poDataset;
poDataset = (GDALDataset *) GDALOpen('input.tif', GA_ReadOnly);

// 获取栅格波段数量
int nBands = poDataset->GetRasterCount();

// 获取栅格大小
int nXSize = poDataset->GetRasterXSize();
int nYSize = poDataset->GetRasterYSize();

// 获取栅格地理变换
double adfGeoTransform[6];
poDataset->GetGeoTransform(adfGeoTransform);

// 创建掩码栅格
GDALDataset *poMaskDataset;
GDALDriver *poDriver;
poDriver = GetGDALDriverManager()->GetDriverByName('GTiff');
poMaskDataset = poDriver->Create('mask.tif', nXSize, nYSize, 1, GDT_Byte, NULL);

// 设置栅格地理变换
poMaskDataset->SetGeoTransform(adfGeoTransform);

// 设置栅格投影
poMaskDataset->SetProjection(poDataset->GetProjectionRef());

// 创建缓冲区用于读取栅格数据
int nBufferSize = nXSize * nYSize;
float *pafBuffer = (float *) CPLMalloc(sizeof(float) * nBufferSize);

// 逐波段读取栅格数据
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);

    // 设置非零值的掩码
    for (int j = 0; j < nBufferSize; j++)
    {
        if (pafBuffer[j] != 0)
        {
            pafBuffer[j] = 1;
        }
    }

    // 将掩码数据写入掩码栅格
    GDALRasterBand *poMaskBand = poMaskDataset->GetRasterBand(1);
    poMaskBand->RasterIO(GF_Write, 0, 0, nXSize, nYSize, pafBuffer, nXSize, nYSize, GDT_Byte, 0, 0);
}

// 计算栅格覆盖范围
double adfExtent[4];
GDALRasterBand *poMaskBand = poMaskDataset->GetRasterBand(1);
poMaskBand->GetExtent(adfExtent);

// 打印覆盖范围
printf('Coverage extent: (%.2f, %.2f) - (%.2f, %.2f)\n', adfExtent[0], adfExtent[2], adfExtent[1], adfExtent[3]);

// 清理
CPLFree(pafBuffer);
GDALClose(poDataset);
GDALClose(poMaskDataset);

return 0;

}

C++ GDAL: 计算栅格影像覆盖范围(排除 0 值区域)

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

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