用c++语言实现基于GDAL计算栅格影像覆盖范围不包括0值区域。
以下是基于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;
}
原文地址: https://www.cveoy.top/t/topic/b9Od 著作权归作者所有。请勿转载和采集!