用c++语言实现基于GDAL计算栅格影像覆盖范围不包括0值区域。返回ogrpolygon
以下是使用C++语言基于GDAL计算栅格影像覆盖范围的示例代码:
#include <gdal_priv.h>
#include <ogrsf_frmts.h>
int main(int argc, char* argv[])
{
GDALAllRegister(); // 注册所有的驱动
// 打开栅格影像
GDALDataset* poDataset = (GDALDataset*)GDALOpen(argv[1], GA_ReadOnly);
if (poDataset == NULL)
{
printf("无法打开栅格影像文件!\n");
exit(1);
}
// 获取影像范围
double adfGeoTransform[6];
poDataset->GetGeoTransform(adfGeoTransform);
double xmin = adfGeoTransform[0];
double ymax = adfGeoTransform[3];
double xmax = xmin + adfGeoTransform[1] * poDataset->GetRasterXSize();
double ymin = ymax + adfGeoTransform[5] * poDataset->GetRasterYSize();
// 创建OGC多边形对象
OGRPolygon polygon;
OGRLinearRing ring;
ring.addPoint(xmin, ymin);
ring.addPoint(xmin, ymax);
ring.addPoint(xmax, ymax);
ring.addPoint(xmax, ymin);
ring.addPoint(xmin, ymin);
polygon.addRing(&ring);
// 获取栅格影像的NoData值
double nodata = poDataset->GetRasterBand(1)->GetNoDataValue();
// 遍历栅格影像像素,计算覆盖范围
for (int j = 0; j < poDataset->GetRasterYSize(); j++)
{
for (int i = 0; i < poDataset->GetRasterXSize(); i++)
{
double value;
poDataset->GetRasterBand(1)->RasterIO(GF_Read, i, j, 1, 1, &value, 1, 1, GDT_Float64, 0, 0);
if (value != nodata && value != 0.0)
{
double x = xmin + adfGeoTransform[1] * i;
double y = ymax - adfGeoTransform[5] * j;
OGRPoint point(x, y);
polygon.intersection(&point);
}
}
}
// 输出结果
OGRGeometry* geometry = &polygon;
OGRSpatialReference* srs = poDataset->GetSpatialRef();
geometry->assignSpatialReference(srs);
char* wkt;
geometry->exportToWkt(&wkt);
printf("覆盖范围为:%s\n", wkt);
// 释放资源
CPLFree(wkt);
GDALClose(poDataset);
return 0;
}
上述代码中,首先使用GDAL库中的GDALAllRegister()函数注册所有的驱动。然后使用GDALOpen()函数打开栅格影像文件,获取影像范围和NoData值。接着,创建OGC多边形对象,并添加影像四个角点,然后遍历栅格影像像素,如果像素值不为NoData值且不为0,则将像素坐标转换为地理坐标,创建OGC点对象,利用多边形对象的intersection()函数计算点对象和多边形对象的交集,从而计算出影像覆盖范围。最后,将覆盖范围输出为WKT格式的字符串,并释放资源。
需要注意的是,上述代码中只考虑了单波段栅格影像,如果是多波段栅格影像,需要在遍历像素时同时遍历所有波段,以保证计算出的覆盖范围包含所有波段的有效像素。
原文地址: http://www.cveoy.top/t/topic/b9Sk 著作权归作者所有。请勿转载和采集!