Python equivalente di gdalbuildvrt


12

Esiste un modo per eseguire la stessa attività dell'utilità gdalbuildvrt utilizzando i collegamenti GDAL Python? Finora non ho trovato alcun modo per farlo se non creare un vrt di un singolo set di dati e modificare manualmente l'xml. Vorrei creare un vrt da più raster (essenzialmente eseguendo un mosaico). È possibile usare Python puro? L'altra mia opzione è usare il sottoprocesso per chiamare semplicemente gdalbuildvrt.

Risposte:


10

Onestamente è più facile farlo usando gdalbuildvrt in a subprocesso os.system.

Se desideri farlo tramite Python, puoi farlo. Utilizzando i metodi standard di creazione del set di dati all'interno di GDAL Python possiamo facilmente creare il set di dati di base VRT .

from osgeo import gdal

drv = gdal.GetDriverByName("VRT")
vrt = drv.Create("test.vrt", x_size, y_size, 0)

Si noti che stiamo creando il set di dati senza bande inizialmente. Dalla documentazione in VRTS che dataset VRT sono uno dei pochi tipi set di dati che possono accettare AddBandargomenti.

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

Ora per ogni banda dobbiamo impostare manualmente gli elementi dei metadati:

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)

SetMetadatItemaccetta due argomenti, il primo una stringa dell'elemento metadati, il secondo l'elemento stesso. Ciò significa che non è possibile sottoinsieme un elemento di metadati, quindi per le origini dati è necessario impostare l'intero contenuto come stringa.

Si noti che è possibile utilizzare questo metodo per creare origini complesse ( ComplexSource) che contengono tabelle di ricerca di valori, origini di filtri del kernel ( KernelFilteredSource) di dimensioni e forme arbitrarie e bande di maschere ( MaskBand).


Grazie @om_henners - Ho finito per usare il sottoprocesso per chiamare gdalbuildvrt. Ho più esperienza con Python piuttosto che con la riga di comando, quindi speravo di poterlo fare direttamente in Python, ma non vale la pena disturbare con la creazione di stringhe XML come hai descritto. È certamente bello sapere che posso farlo se necessario in futuro.
Brian,

Ho appena trovato un caso d'uso per avere un equivalente di Python: aggiungere funzionalità non supportate. Ad esempio, il formato file vrt supporta un overviewselemento, ma gdalbuildvrt non lo utilizza. Grazie per aver fornito uno stub su come questo potrebbe essere aggiunto in Python.
Matt Wilkie,

@om_henners esiste un modo per drv.CreateCopy ('percorso / to / file.vrt', input_ds) con percorso assoluto al file input_ds in Python? c'è un'opzione relativeToVRT = "1", ma come cambiarla o impostarla durante la creazione di VRT?
Dmitriy Litvinov il

8

A partire da GDAL 2.1 gli strumenti CLI sono disponibili come funzioni di libreria, ed è proprio quello che gli strumenti CLI ora chiamano internamente.

Per esempio:

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

È l'equivalente di:

from osgeo import gdal

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

Le opzioni CLI disponibili si associano direttamente ai parametri di BuildVRTOptions , inoltre sono disponibili alcuni extra come i callback di avanzamento.


Questo sembra essere solo per alcuni strumenti della CLI. Ad esempio, sto cercando di far funzionare gdaladdo ma non si presenta. Lo stesso con gdalwarp. Sai se hanno intenzione di supportare anche questi? Sarebbe molto utile
fpolig01

@ fpolig01 la maggior parte sono lì - vedi RegenerateOverviews()e Warp()nel riferimento API . Gli argomenti generalmente corrispondono ai comandi CLI.
rcoup

@rccoup Grazie per la risposta. RegenerateOverviews () è uguale a gdaladdo? Ne hai un esempio funzionante? Sto cercando di fare qualcosa di simile a gdaladdo -r media "D: \ image.tif"
fpolig01

@ fpolig01 questo post suggerisceBuildOverviews() (che in realtà è quello che sono andato a cercare quando l'ho trovato RegenerateOverviews) - forse provarlo?
rcoup

8

La risposta di @rcoup ha funzionato solo per me, se la modifica come segue:

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

Altrimenti, il file non viene scritto sul disco.


JensL grazie! puoi spiegare l'intuizione di my_vrt = None da scrivere sul disco? Sembra davvero strano
mmann1123

3
@ mmann1123 : Altrimenti non ha funzionato e ho pensato che il tutorial sull'API GDAL diceva: "Nota che il metodo CreateCopy () restituisce un set di dati scrivibile e che deve essere chiuso correttamente per completare la scrittura e lo scaricamento del set di dati su disco Nel caso Python questo si verifica automaticamente quando "dst_ds" non rientra nell'ambito. " Siccome non esiste closingPython, devi portarlo vrtfuori dallo scopo, assegnandolo a None.
JensL,

In realtà, hanno appena risolto questo problema (vedi osgeo-org.1560.x6.nabble.com/… )
umbe1987
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.