如何将 GDALResampleAlg 传递给 GDAL 的 RasterIO?

how to pass in a GDALResampleAlg to GDAL's RasterIO?

RasterIO 方法有一个使用 GDALRasterIOExtraArg 结构的 GDALResampleAlg 选项:

http://www.gdal.org/structGDALRasterIOExtraArg.html

GDAL tutorial 有一个这样的示例,用于从栅格波段读取数据:

  poBand->RasterIO( GF_Read, Xoffset, Yoffset, nXSize, nYSize,
                    pafScanline, outXSize, outYSize, GDT_Float32,
                    0, 0);

和其中未使用的第 12 个参数可以采用 GDALRasterIOExtraArg 中的重采样选项。

http://www.gdal.org/classGDALRasterBand.html#a30786c81246455321e96d73047b8edf1

如何编写 C++ 来实际传递选项?我可以从常量实例化选项:

 // how to pass this option in to RasterIO?
  GDALResampleAlg eResampleAlg = GRA_NearestNeighbour;

但我对 C++ 的了解还不够深,无法了解如何实际使用它,而且我找不到任何我可以充分遵循以使其发挥作用的示例。

这里有一个方法,有一个宏 INIT_RASTERIO_EXTRA_ARG 可以设置 extra-arg 结构,在此处列出:

http://www.gdal.org/gdal_8h.html#a16efcda82b88e49244dbbf4d5d2157c4

然后将 eResampleAlg 属性 设置为适当的常量。某些情况下需要一些其他 extra-arg 参数,但这超出了这个问题的范围。

float *pafScanline;

GDALRasterIOExtraArg psExtraArg;
INIT_RASTERIO_EXTRA_ARG(psExtraArg);
// TODO expose the resampling options to user
psExtraArg.eResampleAlg = GRIORA_NearestNeighbour;
pafScanline = (float *) CPLMalloc(sizeof(float)*outXSize*outYSize);
CPLErr err = poBand->RasterIO( GF_Read, Xoffset, Yoffset, nXSize, nYSize,
                pafScanline, outXSize, outYSize, GDT_Float32,
                0, 0, &psExtraArg);

点击这里了解更多http://www.gdal.org/structGDALRasterIOExtraArg.html