python:使用gdal绑定在内存中执行gdalwarp

时间:2018-02-09 12:56:47

标签: python gis gdal

我目前在R中有一个处理链,它下载MODIS数据,然后从系统调用gdalwarp以将特定的子数据集(例如NDVI)重新投影到WGS1984中。然后将生成的GeoTiffs收集到HDF5文件中以进行进一步处理。

现在我将处理链移到python,我想知道是否有办法跳过将GeoTiffs写入磁盘的步骤{ {1}}模块。

要明确的是,问题是:

我是否可以严格使用gdal模块中的python绑定而无需写入磁盘来执行gdalwarp

我一直在研究,我的问题最接近的答案就是这些帖子:

第一种方法需要一个模板,所以不是我真正想要的。

第二种方法看起来更有前途,它使用的功能gdal似乎是我想要的。虽然,与答案中的示例相反,我的结果与参考不匹配(与任何错误阈值无关)。

在我之前直接调用AutoCreateWarpedVRT的实现中,除了目标参考系统之外,我还指定了目标分辨率。所以我认为这可能会有所不同 - 但我还没有能够在python中的gdal绑定中设置它。

这是我尝试的内容(抱歉,没有MODIS数据时无法重现):

gdalwarp

这是供参考:

import gdal
import osr

ds = gdal.Open('/data/MOD13A2.A2016305.h18v07.005.2016322013359.hdf')

t_srs = osr.SpatialReference()
t_srs.ImportFromEPSG(4326)

src_ds = gdal.Open(ds.GetSubDatasets()[0][0], gdal.GA_ReadOnly)

dst_wkt =t_srs.ExportToWkt()
error_threshold = 0.125
resampling=gdal.GRA_NearestNeighbour

tmp_ds = gdal.AutoCreateWarpedVRT( src_ds,
                                  None, # src_wkt : left to default value --> will use the one from source
                                   dst_wkt,
                                   resampling,
                                   error_threshold)

# create tiff

dst_ds = gdal.GetDriverByName('GTiff').CreateCopy('warp_test.tif', tmp_ds)
dst_ds = None

比较:

gdalwarp -ot Int16 -tr 0.00892857142857143 0.00892857142857143 -t_srs EPSG:4326 "HDF4_EOS:EOS_GRID:MOD13A2.A2016305.h18v07.005.2016322013359.hdf:MODIS_Grid_16DAY_1km_VI:1 km 16 days NDVI" MOD13A2.A2016305.h18v07.005.2016322013359_MODIS_Grid_16DAY_1km_VI_1_km_16_days_NDVI.tif

因此,您可以看到,使用i1 = gdal.Open('warp_test.tif') i2 = gdal.Open('MOD13A2.A2016305.h18v07.005.2016322013359_MODIS_Grid_16DAY_1km_VI_1_km_16_days_NDVI.tif') # test print(i1.RasterXSize,i1.RasterYSize) 1267 1191 #reference print(i2.RasterXSize,i2.RasterYSize) 1192 1120 i1.GetRasterBand(1).Checksum() == i2.GetRasterBand(1).Checksum() False 函数会生成具有不同维度和分辨率的数据集。

1 个答案:

答案 0 :(得分:8)

如果您想模仿对gdalwarp的“参考”调用,可以使用:

import gdal

ds = gdal.Warp('warp_test.tif', infile, dstSRS='EPSG:4326',
               outputType=gdal.GDT_Int16, xRes=0.00892857142857143, yRes=0.00892857142857143)
ds = None

如果您不想输出到磁盘上的文件,可以转换为内存中的VRT文件,例如:

ds = gdal.Warp('', infile, dstSRS='EPSG:4326', format='VRT',
               outputType=gdal.GDT_Int16, xRes=0.00892857142857143, yRes=0.00892857142857143)

你当然可以扭曲到内存中的任何格式,但对于VRT以外的文件,扭曲的结果实际上会存储在内存中。