Tenga en cuenta que a partir de 2021, esta respuesta a continuación es ahora la forma "oficial" de hacerlo, y está soportada directamente en los enlaces de GDAL Python. Ya no es necesario generar manualmente el VRT.
Honestamente es más fácil hacer esto usando gdalbuildvrt en un subprocess
o os.system
.
Si se desea hacer esto a través de Python se puede hacer. Utilizando los métodos de creación de conjuntos de datos estándar dentro de GDAL Python podemos crear fácilmente el conjunto de datos base VRT .
from osgeo import gdal
drv = gdal.GetDriverByName("VRT")
vrt = drv.Create("test.vrt", x_size, y_size, 0)
Tenga en cuenta que estamos creando el conjunto de datos sin bandas inicialmente. A partir de la documentación sobre VRTs que los conjuntos de datos VRT son uno de los pocos tipos de datos que pueden aceptar AddBand
argumentos.
vrt.AddBand(gdal.GDT_Float32)
band = vrt.GetRasterBand(1)
Ahora, para cada banda tenemos que establecer los elementos de metadatos manualmente:
simple_source = '<SourceFilename relativeToVRT="1">%s</SourceFilename>' % source_path + \
'<SourceBand>%i</SourceBand>' % source_band + \
'<SourceProperties RasterXSize="%i" RasterYSize="%i" DataType="Real" BlockXSize="%i" BlockYSize="%i"/>' % (x_size, y_size, x_block, y_block) + \
'<SrcRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (x_offset, y_offset, x_source_size, y_source_size) + \
'<DstRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (dest_x_offset, dest_y_offset, x_dest_size, y_dest_size)
band.SetMetadataItem("SimpleSource", simple_source)
band.SetMetadataItem("NoDataValue", -9999)
SetMetadatItem
toma dos argumentos, el primero una cadena del elemento de metadatos, el segundo el propio elemento. Esto significa que no se puede subconjuntar un elemento de metadatos, por lo que para las fuentes de datos hay que establecer todo el contenido como una cadena.
Tenga en cuenta que podemos utilizar este método para crear fuentes complejas ( ComplexSource
) que contienen tablas de búsqueda de valores, fuentes de filtros del núcleo ( KernelFilteredSource
) de tamaños y formas arbitrarias, y Bandas de Máscara ( MaskBand
).