Adicionando banda ao GeoTiff existente usando GDAL?

15

Parece que isso deve ser direto, mas não consigo descobrir pela vida.

Dado um GeoTiff existente contendo uma banda única, como você pode adicionar outra banda ao GeoTiff? A única maneira de fazer isso é usar GDALCreate () para criar um novo arquivo de saída com uma banda adicional e copiar a banda existente do arquivo original para o novo arquivo? Essa é a única solução que eu encontrei até agora, mas parece que deve haver uma maneira simples de adicionar uma banda ao conjunto de dados existente.

O boi
fonte
Olá @TheOx, tenho o mesmo problema. Quero criar uma cor de imagem composta da banda 2,3,4 das bandas simples do LDCM. Você já tem solução para sua pergunta?
Jackie
1
@Jackie veja o comentário de kyle na resposta aceita sobre o uso do driver vrt para criar uma cópia, adicione uma banda e crie uma cópia disso novamente em um geotiff com o driver GeoTiff.
TheOx

Respostas:

8

A solução, se o driver a complementar, é chamar GDALOpen () com acesso ao GA_Update e usar GDALAddBand ou GDALDataset :: AddBand . No entanto, o driver geotiff não suporta AddBand.

user2856
fonte
2
Muito poucos drivers suportam banda de adição, não acredito que o driver geotiff faça. O único que eu sei que suporta é o vrt.
Bem, o @kyle está certo - o driver geotiff não suporta AddBand, mas o método nesta resposta está correto se o driver o suportar e for o que eu estava procurando, então estou aceitando.
TheOx
Doh! Esqueceu esse pequeno detalhe. @TheOx Eu não acho que você deva aceitar minha resposta, pois não está correto. a questão original relacionada especificamente aos geotiffs.
User2856
@ Lucas: Edite sua resposta para especificar que é a solução geral se o driver suportar e eu a aceitar. Parece não haver outra maneira de fazer isso com o GeoTiff abaixo do método na minha pergunta original.
TheOx
1
Use o driver vrt, CreateCopy (), AddBand (), CreateCopy () com o driver Geotiff.
8

Para expandir a resposta de Luke e fornecer um exemplo concreto em Python, aqui está um trecho que adiciona uma banda alfa a uma varredura de origem e a salva como 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

Eu usei o MEMdriver em vez de, VRTjá que o último não suporta WriteRaster()e WriteArray()(erro "A gravação através do VRTSourcedRasterBand não é suportada."). O uso do driver vrt ainda pode ser possível por meio de outros métodos, suponho.

Martin Valgur
fonte