2017-10-23 27 views
1

複数のGeoTIFFファイル(*.tif)に格納されているラスタ時系列を1つのNetCDFファイルに変換したいのですが、データはuint16です。複数のGeoTIFF画像のラスタ時系列をNetCDFに変換する

私はおそらく使用したnetCDFする各画像を変換するgdal_translateを使用することができます。

gdal_translate -of netcdf -co FORMAT=NC4 20150520_0164.tif foo.nc 

NCOとし、いくつかのスクリプトをファイル名から日付を抽出して連結するが、私はより効果的にこれを行う可能性があるかどうかを疑問に思いましたPythonでxarrayを使用していて、新しいrasterioバックエンドです。

私は簡単にファイルを読み取ることができます。

import glob 
import xarray as xr 
f = glob.glob('*.tif') 
da = xr.open_rasterio(f[0]) 
da 

<xarray.DataArray (band: 1, y: 5490, x: 5490)> 
[30140100 values with dtype=uint16] 
Coordinates: 
    * band  (band) int64 1 
    * y  (y) float64 5e+05 5e+05 5e+05 5e+05 5e+05 4.999e+05 4.999e+05 ... 
    * x  (x) float64 8e+05 8e+05 8e+05 8e+05 8.001e+05 8.001e+05 ... 
Attributes: 
    crs:  +init=epsg:32620 

を返し、私はNetCDFファイルにこれらのいずれかを書くことができます

ds.to_netcdf('foo.nc') 

理想的に、私はできるだろうがxr.open_mfdatasetのようなものを使用するには、(ファイル名から抽出した)時間値を書き込んだ後、集約全体はnetCDFになります。そして、daskにコア外メモリの問題を処理させてください。 :-)

xarraydaskでこれを行うことはできますか?

答えて

1

Xarrayがあなたのために連結ステップを実行できるはずです。私はあなたの例を少し変更しました。ファイル名を解析して有用なものにすることは、あなた次第です。

import glob 
import pandas as pd 
import xarray as xr 

def time_index_from_filenames(filenames): 
    '''helper function to create a pandas DatetimeIndex 
     Filename example: 20150520_0164.tif''' 
    return pd.DatetimeIndex([pd.Timestamp(f[:8]) for f in filenames]) 

filenames = glob.glob('*.tif') 
time = xr.Variable('time', time_index_from_filenames(filenames)) 
chunks = {'x': 5490, 'y': 5490, 'band': 1} 
da = xr.concat([xr.open_rasterio(f, chunks=chunks) for f in filenames], dim=time) 
+0

これは素晴らしい作品 - そして今、私はhttp://xarray.pydata.org/en/stable/generated/xarray.open_rasterio.htmlでopen_rasterioのドキュメントを読んでいることを私はチャンク引数を提供することを理解しデータをdask配列にロードします。 –

+0

うれしいことはあなたのために働いた。このようなものはおそらくここで良いレシピになるでしょう:http://xarray.pydata.org/en/stable/auto_gallery/index.html – jhamman

関連する問題