¿Agregar banda a GeoTiff existente usando GDAL?

15

Parece que debería ser sencillo, pero no puedo entenderlo por mi vida.

Dado un GeoTiff existente que contiene una sola banda, ¿cómo puede agregar otra banda a ese GeoTiff? ¿Es la única forma de hacer esto usando GDALCreate () para crear un nuevo archivo de salida con una banda adicional y luego copiar la banda existente del archivo original al nuevo archivo? Esa es la única solución que he encontrado hasta ahora, pero parece que debería haber una manera simple de agregar una banda al conjunto de datos existente.

El buey
fuente
Hola @TheOx, tengo el mismo problema. Quiero hacer un color de imagen compuesta a partir de la banda 2,3,4 de bandas individuales LDCM. ¿Ya tienes solución para tu pregunta?
Jackie
1
@Jackie ve el comentario de kyle en la respuesta aceptada sobre el uso del controlador vrt para crear una copia, agregar una banda y luego crear una copia de eso en un geotiff con el controlador GeoTiff.
TheOx

Respuestas:

8

La solución, si el controlador lo admite, es llamar a GDALOpen () con acceso GA_Update y luego usar GDALAddBand o GDALDataset :: AddBand . Sin embargo, el controlador geotiff no admite AddBand.

usuario2856
fuente
2
Muy pocos controladores admiten agregar banda, no creo que el controlador geotiff lo haga. El único que que lo soporta es el vrt.
Bueno, @kyle tiene razón: el controlador geotiff no admite AddBand, pero el método en esta respuesta es correcto si el controlador lo admite y era lo que estaba buscando, así que lo acepto.
TheOx
Doh! Olvidé ese pequeño detalle. @TheOx No creo que deba aceptar mi respuesta, ya que no es correcta re. La pregunta original que se relaciona específicamente con los geotiffs.
usuario2856
@Luke: Edite su respuesta para especificar que esa es la solución general si el controlador lo admite y lo aceptaré. Parece que no hay otra manera de hacer esto para GeoTiff por debajo del método en mi pregunta original.
TheOx
1
Utilice el controlador vrt, CreateCopy (), AddBand (), CreateCopy () con Geotiff Driver.
8

Para ampliar la respuesta de Luke y proporcionar un ejemplo concreto en Python, aquí hay un fragmento que agrega una banda alfa a un ráster fuente y la guarda 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

Usé el MEMUsé controlador en lugar de hacerlo, VRTya que este último no es compatible WriteRaster()y WriteArray()(error "No se admite la escritura a través de VRTSourcedRasterBand"). El uso del controlador vrt aún podría ser posible a través de otros métodos, supongo.

Martin Valgur
fuente