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?

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


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.