現在、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
関数を使用すると、さまざまなディメンションと解像度のデータセットが生成されます。
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以外のファイルの場合、ワープされた結果は実際にはメモリに保存されます。