gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:42:40 24 4
gpt4 key购买 nike

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

现在我将处理链移动到 python,我想知道是否有一种方法可以跳过将 GeoTiffs 写入磁盘的步骤gdal 模块。

要清楚,问题是:

我可以执行 gdalwarp 严格使用来自 gdal 模块的 python 绑定(bind)而不写入磁盘吗?

我已经做了一些研究,最接近我的问题的答案是这些帖子:

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

第二种方法看起来更有前途,它使用函数 AutoCreateWarpedVRT,这似乎正是我想要的。尽管与答案中的示例相反,我的结果与引用不匹配(独立于任何错误阈值)。

在我之前直接调用 gdalwarp 的实现中,除了目标引用系统之外,我还指定了目标分辨率。所以我认为这可能会有所作为 - 但我无法在 python 的 gdal 绑定(bind)中设置它。

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

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

因此您可以看到,使用 gdal.AutoCreateWarpedVRT 函数会生成具有不同维度和分辨率的数据集。

最佳答案

如果您想模仿对 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 以外的文件,变形结果实际上将存储在内存中。

关于python:使用gdal绑定(bind)在内存中执行gdalwarp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48706402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com