Sử dụng Rasterio hoặc GDAL để xếp chồng nhiều băng tần mà không cần sử dụng các lệnh của quy trình con


11

Có ai có cách sắp xếp hùng hồn nhiều tập tin .tif vào một ngăn xếp nhiều băng tần bằng Rasterio và / hoặc GDAL không?

Tôi đang tìm cách để tránh sử dụng lệnh quy trình con như gdal_merge.py và thay vào đó là một phần của tập lệnh python của tôi.

Tôi biết rằng cả Rasterio và GDAL đều đọc các tệp .tif dưới dạng mảng, nhưng làm cách nào để xếp các mảng đó và viết kết quả thành các dải riêng biệt?

Câu trả lời:


20

Sử dụng rasteriobạn có thể làm

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

Tất nhiên, nó giả định rằng các lớp đầu vào của bạn đã chia sẻ cùng một mức độ, độ phân giải và kiểu dữ liệu


1
Vâng, đây thực chất là những gì chương trình rio-stack của Rasterio thực hiện: github.com/mapbox/rasterio/blob/master/rasterio/rio/ .
sgillies

Có hiệu quả để giữ ngăn xếp trong bộ nhớ (để thực hiện một số chức năng trên các băng tần khác nhau) thay vì ghi tệp xếp chồng ra không? Hoặc nó nên được ghi vào một tập tin và sau đó thao tác?
Shawn

than ôi tôi gặp lỗi này "RasterioIOError: '/' không được công nhận là định dạng tệp được hỗ trợ."
ilFonta

@ilFonta, tạo một câu hỏi mới với một ví dụ mã tối thiểu có thể lặp lại sau đó.
bugmenot123

13

Nếu sử dụng GDAL 2.1+ thì đơn giản như gdal.BuildVRTsau 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.