Python equivalente a gdalbuildvrt

12

¿Hay alguna manera de realizar la misma tarea que la utilidad gdalbuildvrt usando enlaces GDAL Python? Hasta ahora no he encontrado ninguna manera de hacer esto que no sea crear un vrt de un único conjunto de datos y editar manualmente el xml. Me gustaría crear un vrt a partir de múltiples rásteres (esencialmente realizando un mosaico). ¿Es esto posible usando Python puro? Mi otra opción es usar un subproceso para simplemente llamar a gdalbuildvrt.

Brian
fuente

Respuestas:

10

Honestamente, es más fácil hacer esto usando gdalbuildvrt en una subprocesso os.system.

Si desea hacer esto a través de Python, puede hacerlo. Usando 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 VRT conjuntos de datos son uno de los pocos tipos de conjuntos de datos que pueden aceptar AddBandlos argumentos.

vrt.AddBand(gdal.GDT_Float32)
band = vrt.GetRasterBand(1)

Ahora para cada banda tenemos que configurar 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)

SetMetadatItemtoma dos argumentos, el primero una cadena del elemento de metadatos, el segundo el elemento en sí. Esto significa que no puede subconjugar un elemento de metadatos, por lo que para las fuentes de datos debe establecer todo el contenido como una cadena.

Tenga en cuenta que podemos usar este método para crear fuentes complejas ( ComplexSource) que contengan tablas de valores de búsqueda, fuentes de filtro de Kernel ( KernelFilteredSource) de tamaños y formas arbitrarias y bandas de máscara ( MaskBand).

om_henners
fuente
Gracias @om_henners - Terminé usando un 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 meterse con la creación de cadenas XML como usted describió. Sin embargo, es bueno saber que puedo hacer eso si es necesario en el futuro.
Brian
Acabo de encontrar un caso de uso para tener un equivalente en Python: agregar características no compatibles. Por ejemplo, el formato de archivo vrt admite un overviewselemento, pero gdalbuildvrt no lo usa. Gracias por proporcionar un código auxiliar de cómo se podría agregar esto en Python.
Matt Wilkie
@om_henners ¿hay alguna forma de drv.CreateCopy ('ruta / a / archivo.vrt', input_ds) con ruta absoluta al archivo input_ds en python? existe la opción relativeToVRT = "1", pero ¿cómo cambiarla o establecerla al crear VRT?
Dmitriy Litvinov
8

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

Por ejemplo:

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

Es el equivalente de:

from osgeo import gdal

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

Las opciones de CLI disponibles se asignan directamente a los parámetros de BuildVRTOptions , además de que hay algunos extras como devoluciones de llamada de progreso disponibles.

rcoup
fuente
Esto parece ser solo para ciertas herramientas CLI. Por ejemplo, estoy tratando de hacer que gdaladdo funcione pero no aparece. Lo mismo con gdalwarp. ¿Sabes si planean apoyar esto también? Sería muy útil
fpolig01
@ fpolig01, la mayoría de ellos están allí; consulte RegenerateOverviews()y Warp()en la referencia de la API . Los argumentos generalmente coinciden con los comandos de la CLI.
Rcoup
@rccoup Gracias por la respuesta. ¿RegenerateOverviews () es lo mismo que gdaladdo? ¿Tienes un ejemplo de que funciona? Estoy tratando de hacer algo similar a gdaladdo -r promedio "D: \ image.tif"
fpolig01
@ fpolig01 sugiere esta publicaciónBuildOverviews() (que en realidad es lo que busqué cuando encontré RegenerateOverviews), ¿tal vez intentarlo?
Rcoup 01 de
8

La respuesta de @rcoup solo funcionó para mí, si la modifica 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.

JensL
fuente
JensL gracias! ¿Puedes explicar la intuición de my_vrt = None para escribir en el disco? Parece realmente extraño
mmann1123
3
@ mmann1123 : De lo contrario, no funcionó y tuve en cuenta que el Tutorial API de GDAL decía: "Tenga en cuenta que el método CreateCopy () devuelve un conjunto de datos grabable y que debe cerrarse correctamente para completar la escritura y vaciar el conjunto de datos en el disco En el caso de Python, esto ocurre automáticamente cuando "dst_ds" queda fuera de alcance ". Como no hay closingpython, debe poner su vrtfuera de alcance asignándolo a None.
JensL
En realidad, simplemente solucionaron este problema (ver osgeo-org.1560.x6.nabble.com/… )
umbe1987