誰かがRasterioやGDALを使用して複数の.tifファイルを複数のバンドスタックにスタックする雄弁な方法を持っていますか?
私はgdal_merge.pyのようなサブプロセスコマンドの使用を避け、それを私のpythonスクリプトの一部として持つ方法を探しています。
RasterioとGDALの両方が.tifファイルを配列として読み取ることを知っていますが、それらの配列をスタックして、結果を別々のバンドとして書き出すにはどうすればよいですか?
誰かがRasterioやGDALを使用して複数の.tifファイルを複数のバンドスタックにスタックする雄弁な方法を持っていますか?
私はgdal_merge.pyのようなサブプロセスコマンドの使用を避け、それを私のpythonスクリプトの一部として持つ方法を探しています。
RasterioとGDALの両方が.tifファイルを配列として読み取ることを知っていますが、それらの配列をスタックして、結果を別々のバンドとして書き出すにはどうすればよいですか?
回答:
rasterio
あなたが使用できる
import rasterio
file_list = ['file1.tif', 'file2.tif', 'file3.tif']
# Read metadata of first file
with rasterio.open(file_list[0]) as src0:
meta = src0.meta
# Update meta to reflect the number of layers
meta.update(count = len(file_list))
# Read each layer and write it to stack
with rasterio.open('stack.tif', 'w', **meta) as dst:
for id, layer in enumerate(file_list, start=1):
with rasterio.open(layer) as src1:
dst.write_band(id, src1.read(1))
もちろん、入力レイヤーがすでに同じ範囲、解像度、データ型を共有していることを前提としています
GDALを使用している場合2.1+それは同じくらい簡単だとしてgdal.BuildVRT
、その後gdal.Translate
:
from osgeo import gdal
outvrt = '/vsimem/stacked.vrt' #/vsimem is special in-memory virtual "directory"
outtif = '/tmp/stacked.tif'
tifs = ['a.tif', 'b.tif', 'c.tif', 'd.tif']
#or for all tifs in a dir
#import glob
#tifs = glob.glob('dir/*.tif')
outds = gdal.BuildVRT(outvrt, tifs, separate=True)
outds = gdal.Translate(outtif, outds)