Aggiunta di banda a GeoTiff esistente utilizzando GDAL?


15

Sembra che dovrebbe essere semplice, ma non riesco a capirlo per la vita di me.

Dato un GeoTiff esistente contenente una singola banda, come puoi aggiungere un'altra banda a quel GeoTiff? È l'unico modo per utilizzare GDALCreate () per creare un nuovo file di output con una banda aggiuntiva e quindi copiare la banda esistente dal file originale nel nuovo file? Questa è l'unica soluzione che ho trovato finora, ma sembra che ci dovrebbe essere un modo semplice per aggiungere una banda al set di dati esistente.


Ciao @TheOx, ho lo stesso problema. Voglio creare un colore di immagine composita dalla banda 2,3,4 delle singole bande LDCM. Hai ancora una soluzione per la tua domanda?
Jackie l'

1
@Jackie vedi il commento di kyle nella risposta accettata sull'uso del driver vrt per creare una copia, aggiungere una banda, quindi crearne una copia su un geotiff con il driver GeoTiff.
TheOx,

Risposte:


8

La soluzione, se il driver lo supporta, è chiamare GDALOpen () con accesso GA_Update, quindi utilizzare GDALAddBand o GDALDataset :: AddBand . Tuttavia, il driver geotiff non supporta AddBand.


2
Pochissimi driver supportano l'aggiunta di banda, non credo che il driver geotiff lo faccia. L'unico che conosco che lo supporta è il vrt.

Bene @kyle ha ragione: il driver geotiff non supporta AddBand, ma il metodo in questa risposta è corretto se il driver lo supporta ed era quello che stavo cercando, quindi lo accetto.
TheOx,

Doh! Dimenticato quel piccolo dettaglio. @TheOx Non credo che dovresti accettare la mia risposta in quanto non è corretta. la domanda orig che si riferiva specificamente ai geotiff.
user2856

@Luke: modifica la tua risposta per specificare che è la soluzione generale se il driver la supporta e la accetterò. Sembra che non ci sia altro modo per farlo per GeoTiff a corto di metodo nella mia domanda originale.
TheOx,

1
Utilizzare il driver vrt, CreateCopy (), AddBand (), CreateCopy () con Geotiff Driver.

8

Per espandere la risposta di Luke e fornire un esempio concreto in Python, ecco uno snippet che aggiunge una banda alfa a un raster sorgente e lo salva come 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

Ho usato il MEMdriver anziché VRTperché quest'ultimo non supporta WriteRaster()e WriteArray()(errore "Scrivere tramite VRTSourcedRasterBand non è supportato."). L'uso del driver VRT potrebbe essere ancora possibile attraverso alcuni altri metodi, suppongo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.