以下是使用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格式的字符串,并释放资源。

需要注意的是,上述代码中只考虑了单波段栅格影像,如果是多波段栅格影像,需要在遍历像素时同时遍历所有波段,以保证计算出的覆盖范围包含所有波段的有效像素。

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

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

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