C++ GDAL: 计算栅格影像覆盖范围(排除 0 值区域)
#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;
}
原文地址: https://www.cveoy.top/t/topic/jGUT 著作权归作者所有。请勿转载和采集!