Menggunakan Rasterio atau GDAL untuk menumpuk banyak band tanpa menggunakan perintah subproses

11

Apakah ada yang punya cara fasih menumpuk banyak file .tif ke dalam beberapa tumpukan band menggunakan Rasterio dan / atau GDAL?

Saya mencari cara untuk menghindari menggunakan perintah subproses seperti gdal_merge.py dan lebih suka memilikinya sebagai bagian dari skrip python saya.

Saya tahu bahwa Rasterio dan GDAL membaca file .tif sebagai array, tetapi bagaimana cara menumpuk array tersebut dan menuliskan hasilnya sebagai band terpisah?

Jens Hiestermann
sumber

Jawaban:

20

Menggunakan rasterioyang bisa Anda lakukan

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

Tentu saja mengasumsikan bahwa layer input Anda sudah berbagi tingkat, resolusi, dan tipe data yang sama

Loïc Dutrieux
sumber
1
Ya, inilah yang pada dasarnya dilakukan oleh program rio-stack Rasterio : github.com/mapbox/rasterio/blob/master/rasterio/rio/… .
sgillies
Apakah efisien untuk menyimpan tumpukan di memori (untuk melakukan beberapa fungsi pada berbagai band) daripada menulis file yang ditumpuk? Atau haruskah itu ditulis ke file dan kemudian dimanipulasi?
Shawn
sayangnya saya mendapatkan kesalahan ini "RasterioIOError: '/' tidak dikenali sebagai format file yang didukung."
ilFonta
@ilFonta, buat pertanyaan baru dengan contoh kode minimal yang dapat direproduksi.
bugmenot123
13

Jika menggunakan GDAL 2.1+ semudah gdal.BuildVRTitu 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)
pengguna2856
sumber