18 votos

El equivalente en Python de gdalbuildvrt

¿Existe una forma de realizar la misma tarea que la utilidad gdalbuildvrt utilizando los enlaces de GDAL Python? Hasta ahora no he encontrado ninguna forma de hacerlo que no sea crear un vrt de un solo conjunto de datos y editar manualmente el xml. Me gustaría crear un vrt a partir de múltiples rasters (esencialmente realizando un mosaico). ¿Es esto posible usando Python puro? Mi otra opción es usar un subproceso para simplemente llamar a gdalbuildvrt.

24voto

Dan Berezin Puntos 18

La respuesta de @rcoup sólo me ha funcionado, si lo modifico de la siguiente manera:

from osgeo import gdal 

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
my_vrt = gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)
my_vrt = None

De lo contrario, el archivo no se escribe en el disco.

16voto

ESV Puntos 4591

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 ).

0 votos

Gracias @om_henners - Terminé usando subproceso para llamar a gdalbuildvrt. Tengo más experiencia con Python que con la línea de comandos, así que esperaba poder hacer esto directamente en Python, pero no vale la pena complicarse con la creación de cadenas XML como has descrito. Sin embargo, es bueno saber que puedo hacerlo si lo necesito en el futuro.

0 votos

Acabo de encontrar un caso de uso para tener un equivalente en python: añadir características no soportadas. Por ejemplo, el formato de archivo vrt soporta un overviews pero gdalbuildvrt no lo utiliza. Gracias por proporcionar un stub cómo esto podría ser añadido en python.

0 votos

@om_henners ¿hay alguna manera de drv.CreateCopy('path/to/file.vrt',input_ds) con la ruta absoluta al archivo input_ds en python? existe la opción relativeToVRT="1", pero ¿cómo cambiarla o establecerla mientras se crea el VRT?

13voto

trent Puntos 2940

Desde GDAL 2.1 las herramientas CLI están disponibles como funciones de biblioteca, y de hecho eso es lo que las herramientas CLI llaman ahora internamente.

Por ejemplo:

gdalbuildvrt -r cubic -addalpha my.vrt one.tif two.tif

Es el equivalente a:

from osgeo import gdal

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)

El opciones disponibles de la CLI se corresponden directamente con los parámetros de BuildVRTOptions Además, hay algunos extras como las llamadas de progreso disponibles.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X