Python-Äquivalent von gdalbuildvrt

12

Gibt es eine Möglichkeit, dieselbe Aufgabe wie das Dienstprogramm gdalbuildvrt mithilfe von GDAL-Python-Bindungen auszuführen? Bisher habe ich keine andere Möglichkeit gefunden, als ein vrt eines einzelnen Datasets zu erstellen und die XML manuell zu bearbeiten. Ich möchte ein vrt aus mehreren Rastern erstellen (im Wesentlichen ein Mosaik ausführen). Ist das mit reinem Python möglich? Meine andere Option ist die Verwendung eines Unterprozesses, um einfach gdalbuildvrt aufzurufen.

Brian
quelle

Antworten:

10

Ehrlich gesagt ist es einfacher, dies zu tun, indem Sie gdalbuildvrt in einem subprocessoder verwenden os.system.

Wenn Sie dies über Python tun möchten, können Sie dies tun. Mit den Standardmethoden zur Erstellung von Datensätzen in GDAL Python können wir die Basis-Dataset- VRT einfach erstellen .

from osgeo import gdal

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

Beachten Sie, dass wir den Datensatz zunächst ohne Bänder erstellen. Aus der Dokumentation zu VRTs geht hervor, dass VRT-Datasets einer der wenigen Dataset-Typen sind, die AddBandArgumente akzeptieren können .

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

Jetzt müssen wir für jedes Band die Metadatenelemente manuell einstellen:

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)

SetMetadatItemEs werden zwei Argumente verwendet, das erste eine Zeichenfolge des Metadatenelements und das zweite das Element selbst. Dies bedeutet, dass Sie ein Metadatenelement nicht unterteilen können. Für Datenquellen müssen Sie daher den gesamten Inhalt als Zeichenfolge festlegen.

Beachten Sie, dass wir diese Methode verwenden können, um komplexe Quellen ( ComplexSource) zu erstellen , die Nachschlagetabellen mit Werten, Kernelfilterquellen ( KernelFilteredSource) mit beliebigen Größen und Formen und Maskenbänder ( MaskBand) enthalten.

om_henners
quelle
Vielen Dank an @om_henners. Am Ende habe ich den Unterprozess verwendet, um gdalbuildvrt aufzurufen. Ich habe mehr Erfahrung mit Python als mit der Befehlszeile, daher hatte ich gehofft, dass ich dies direkt in Python tun kann, aber es lohnt sich nicht, die von Ihnen beschriebenen XML-Zeichenfolgen zu erstellen. Es ist sicherlich gut zu wissen, dass ich das tun kann, wenn es in Zukunft nötig ist.
Brian
Ich habe gerade einen Anwendungsfall für ein Python-Äquivalent gefunden: Hinzufügen nicht unterstützter Funktionen. Zum Beispiel unterstützt das vrt-Dateiformat ein overviewsElement, aber gdalbuildvrt verwendet es nicht. Vielen Dank, dass Sie einen Stub bereitgestellt haben, wie dies in Python hinzugefügt werden kann.
Matt Wilkie
@om_henners Gibt es eine Möglichkeit zu drv.CreateCopy ('path / to / file.vrt', input_ds) mit dem absoluten Pfad zur Datei input_ds in Python? Es gibt die Option relativeToVRT = "1", aber wie kann sie beim Erstellen von VRT geändert oder festgelegt werden?
Dmitriy Litvinov
7

Seit GDAL 2.1 sind die CLI-Tools als Bibliotheksfunktionen verfügbar, und genau das rufen die CLI-Tools jetzt intern auf.

Beispielsweise:

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

Ist das Äquivalent von:

from osgeo import gdal

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

Die verfügbaren CLI-Optionen werden direkt den Parametern von BuildVRTOptions zugeordnet. Außerdem sind einige Extras wie Fortschrittsrückrufe verfügbar.

rcoup
quelle
7

Die Antwort von @rcoup hat nur bei mir funktioniert, wenn Sie sie wie folgt ändern:

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

Andernfalls wird die Datei nicht auf die Festplatte geschrieben.

JensL
quelle
JensL danke! Können Sie die Intuition von my_vrt = None erklären, auf die Festplatte zu schreiben?
Scheint
3
@ mmann1123 : Andernfalls hat es nicht funktioniert und ich dachte daran, dass das GDAL-API-Tutorial Folgendes sagte: "Beachten Sie, dass die CreateCopy () -Methode ein beschreibbares Dataset zurückgibt und dass es ordnungsgemäß geschlossen werden muss, um das Schreiben und Leeren des Datasets auf die Festplatte abzuschließen Im Python-Fall tritt dies automatisch auf, wenn "dst_ds" den Gültigkeitsbereich verlässt. " Da es closingfür Python keine gibt , müssen Sie Ihre vrtaußerhalb des Gültigkeitsbereichs bringen, indem Sie sie zuweisen None.
JensL
Eigentlich haben sie dieses Problem gerade behoben (siehe osgeo-org.1560.x6.nabble.com/… )
umbe1987