Ajouter une bande au GeoTiff existant en utilisant GDAL?

15

Cela semble être simple mais je ne peux pas le comprendre pour la vie de moi.

Étant donné un GeoTiff existant contenant une seule bande, comment pouvez-vous ajouter une autre bande à ce GeoTiff? Est-ce la seule façon de le faire pour utiliser GDALCreate () pour créer un nouveau fichier de sortie avec une bande supplémentaire, puis copier la bande existante du fichier d'origine dans le nouveau fichier? C'est la seule solution que j'ai trouvée jusqu'à présent, mais il semble juste qu'il devrait y avoir un moyen simple d'ajouter une bande à l'ensemble de données existant.

Le boeuf
la source
Salut @TheOx, j'ai un même problème. Je veux créer une couleur d'image composite à partir de la bande 2,3,4 des bandes simples LDCM. Avez-vous encore une solution à votre question?
Jackie
1
@Jackie voir le commentaire de kyle dans la réponse acceptée sur l'utilisation du pilote vrt pour créer une copie, ajouter une bande, puis créer une copie de celle-ci dans un géotiff avec le pilote GeoTiff.
TheOx

Réponses:

8

La solution, si le pilote le supporte, consiste à appeler GDALOpen () avec un accès GA_Update puis à utiliser GDALAddBand ou GDALDataset :: AddBand . Cependant, le pilote geotiff ne prend pas en charge AddBand.

user2856
la source
2
Très peu de pilotes prennent en charge l'ajout de bande, je ne pense pas que le pilote geotiff le fasse. Le seul que je connaisse qui le supporte est le vrt.
Eh bien @kyle a raison - le pilote geotiff ne prend pas en charge AddBand, mais la méthode de cette réponse est correcte si le pilote la prend en charge et correspond à ce que je cherchais, donc je l'accepte.
TheOx
Ah! Oublié ce petit détail. @TheOx Je ne pense pas que vous devriez accepter ma réponse car elle n'est pas correcte. la question d'origine qui concernait spécifiquement les géotiffes.
user2856
@Luke: Modifiez votre réponse pour spécifier que c'est la solution générale si le pilote la prend en charge et je l'accepterai. Il ne semble pas y avoir d'autre moyen de le faire pour GeoTiff que la méthode de ma question d'origine.
TheOx
1
Utilisez le pilote vrt, CreateCopy (), AddBand (), CreateCopy () avec Geotiff Driver.
8

Pour développer la réponse de Luke et fournir un exemple concret en Python, voici un extrait qui ajoute une bande alpha à un raster source et l'enregistre au format 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

J'ai utilisé le MEMpilote à la place VRTcar ce dernier ne prend pas en charge WriteRaster()et WriteArray()(erreur "L'écriture via VRTSourcedRasterBand n'est pas prise en charge."). L'utilisation du pilote vrt pourrait encore être possible grâce à d'autres méthodes, je suppose.

Martin Valgur
la source