Menambahkan band ke GeoTiff yang ada menggunakan GDAL?

15

Sepertinya ini harus langsung tetapi saya tidak bisa seumur hidup saya mencari tahu.

Mengingat GeoTiff yang ada berisi satu band, bagaimana Anda bisa menambahkan band lain ke GeoTiff itu? Apakah satu-satunya cara untuk melakukan ini menggunakan GDALCreate () untuk membuat file output baru dengan band tambahan dan kemudian menyalin band yang ada dari file asli ke file baru? Itulah satu-satunya solusi yang saya buat sejauh ini tetapi sepertinya harus ada cara sederhana untuk menambahkan band ke dataset yang ada.

TheOx
sumber
Hai @TheOx, saya punya masalah yang sama. Saya ingin membuat warna gambar komposit dari pita 2,3,4 pita tunggal LDCM. Apakah Anda memiliki solusi untuk pertanyaan Anda?
Jackie
1
@Jackie melihat komentar kyle dalam jawaban yang diterima tentang menggunakan driver vrt untuk membuat salinan, menambahkan band, lalu membuat salinannya kembali ke geotiff dengan driver GeoTiff.
TheOx

Jawaban:

8

Solusinya, jika driver mendukungnya, adalah memanggil GDALOpen () dengan GA_Update akses kemudian gunakan GDALAddBand atau GDALDataset :: AddBand . Namun, driver geotiff tidak mendukung AddBand.

pengguna2856
sumber
2
Sangat sedikit driver yang mendukung penambahan band, saya tidak percaya driver geotiff melakukannya. Satu-satunya yang saya tahu yang mendukungnya adalah vrt.
Yah @kyle benar - driver geotiff tidak mendukung AddBand, tetapi metode dalam jawaban ini benar jika driver mendukungnya dan itu yang saya cari jadi saya menerimanya.
TheOx
Doh! Lupa detail kecil itu. @TheOx Saya tidak berpikir Anda harus menerima jawaban saya karena itu tidak benar. pertanyaan asli yang secara khusus terkait dengan geotiff.
user2856
@ Lukas: Edit jawaban Anda untuk menentukan itu solusi umum jika driver mendukungnya dan saya akan menerimanya. Tampaknya tidak ada cara lain untuk melakukan ini untuk GeoTiff singkat dari metode di pertanyaan awal saya.
TheOx
1
Gunakan driver vrt, CreateCopy (), AddBand (), CreateCopy () dengan Geotiff Driver.
8

Untuk memperluas jawaban Luke dan memberikan contoh konkret dengan Python, berikut ini cuplikan yang menambahkan pita alfa ke raster sumber dan menyimpannya sebagai PNG.

from osgeo import gdal

src_ds = gdal.OpenShared(input_path)
mask_ds = gdal.OpenShared(mask_path)
mask = mask_ds.GetRasterBand(1).ReadAsArray()

tmp_ds = gdal.GetDriverByName('MEM').CreateCopy('', src_ds, 0)
tmp_ds.AddBand()
tmp_ds.GetRasterBand(4).WriteArray(mask)

dst_ds = gdal.GetDriverByName('PNG').CreateCopy(output_path, tmp_ds, 0)
del dst_ds

Saya menggunakan MEMdriver bukan VRTkarena yang terakhir tidak mendukung WriteRaster()dan WriteArray()(kesalahan "Menulis melalui VRTSourcedRasterBand tidak didukung."). Menggunakan driver vrt mungkin masih dimungkinkan melalui beberapa metode lain, saya kira.

Martin Valgur
sumber