web-dev-qa-db-ja.com

python:gdalバインディングを使用してメモリ内でgdalwarpを実行します

現在、Rに処理チェーンがあり、MODISデータをダウンロードしてから、システムからgdalwarpを呼び出して、特定のサブデータセット(NDVIなど)をWGS1984に再投影します。結果のGeoTiffsは、さらに処理するためにHDF5ファイルに収集されます。

現在、処理チェーンをpythonに移動していますが、GeoTiffsモジュールの機能を使用してディスクにgdalを書き込む手順をスキップする方法があるかどうか疑問に思いました。 。

明確にするために、質問は次のとおりです。

gdalwarpモジュールからのpythonバインディングを厳密に使用し、ディスクに書き込まずにgdalを実行できますか?

私は少し調査してきましたが、私の質問に対する最も近い答えは次の投稿でした。

最初の方法はテンプレートを必要とするので、私が探しているものではありません。

2番目の方法は、より有望に見えます。関数AutoCreateWarpedVRTを使用していますが、これは私が望んでいることのようです。ただし、回答の例とは異なり、私の結果は参照と一致しません(エラーしきい値とは関係ありません)。

gdalwarpを直接呼び出す以前の実装では、ターゲット参照システムに加えてターゲット解像度を指定しました。だから私はそれが違いを生む可能性があるものだと思います-しかし私はそれをPythonのgdalバインディング内に設定することができませんでした。

これが私が試したものです(申し訳ありませんが、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関数を使用すると、さまざまなディメンションと解像度のデータセットが生成されます。

7
Val

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以外のファイルの場合、ワープされた結果は実際にはメモリに保存されます。

13
Rutger Kassies