RasterioまたはGDALを使用して、サブプロセスコマンドを使用せずに複数のバンドをスタックする


11

誰かがRasterioやGDALを使用して複数の.tifファイルを複数のバンドスタックにスタックする雄弁な方法を持っていますか?

私はgdal_merge.pyのようなサブプロセスコマンドの使用を避け、それを私のpythonスクリプトの一部として持つ方法を探しています。

RasterioとGDALの両方が.tifファイルを配列として読み取ることを知っていますが、それらの配列をスタックして、結果を別々のバンドとして書き出すにはどうすればよいですか?

回答:


20

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))

もちろん、入力レイヤーがすでに同じ範囲、解像度、データ型を共有していることを前提としています


1
はい、これは本質的にRasterioのrio-stackプログラムが行うことです:github.com/mapbox/rasterio/blob/master/rasterio/rio/…
sgillies 2017年

スタックされたファイルを書き出す代わりに、スタックをメモリに保持する(さまざまなバンドでいくつかの機能を実行する)ことは効率的ですか?または、ファイルに書き込んでから操作する必要がありますか?
Shawn

悲しいかな私はこのエラー「RasterioIOError: '/'はサポートされているファイル形式として認識されません。」を受け取ります。
ilFonta

@ilFonta、再現可能な最小限のコード例で新しい質問を作成します。
bugmenot123

13

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.