Ich versuche, einige Rasterdaten (alle .tif) mit gdalwarp in Python bis zu einer gröberen Auflösung (von 0,05 bis 0,25 Grad) zusammenzufassen, aber der Befehl funktioniert nicht. Anstatt eine Ausgabe mit einem großen Wertebereich zu erhalten, sind alle Werte der Ausgabe 0. Die Auflösung und die Pixeltiefe / der Pixeltyp sind korrekt, die Werte jedoch nicht.
Hier ist die Dokumentation zum Befehl gdalwarp: http://www.gdal.org/gdalwarp.html
Ich habe zwei Eingabedateien, die ich mit einer Auflösung von bis zu 0,25 Grad zusammenfassen möchte, um mehrere Ausgaben zu erzeugen:
'NDVI_raster': Die erste Eingabe ist ein 16-Bit-Raster mit Vorzeichen, das NDVI darstellt, mit Werten zwischen -10.000 und 10.000 und Knotenwerten von -15.000.
'nodata_mask': Die zweite ist eine NoData-Maske, 32-Bit-Float, wobei 1 = Werte für "gute" Daten und 0 = NoData.
Mit 'NDVI_raster' als Eingabe möchte ich 7 verschiedene Ausgaben erzeugen, die jeweils eine andere Statistik darstellen. Dazu rufe ich gdalwarp siebenmal auf und setze die Resampling-Methode (-r) jedes Mal auf einen der folgenden Werte: Durchschnitt, Modus, Max, Min, Median, Q1, Q2. Ich werde die Ausgänge NDVI_ave.tif, NDVI_mode.tif usw. aufrufen. Im Moment verwende ich GDAL 1.10.1, das nur Durchschnitt und Modus zulässt, also teste ich jetzt nur mit diesen beiden Statistiken.
Mit 'nodata_mask' als Eingabe möchte ich letztendlich eine QAL (Qualitätssicherungsschicht) erstellen. Zu diesem Zweck verwende ich gdalwarp, wobei der Resampling-Modus auf "Durchschnitt" eingestellt ist, um bis zu 0,25 Grad zu aggregieren. Dies führt dazu, dass jedes Pixel das Verhältnis von guten Pixeln zu Gesamtpixeln von der Eingabe darstellt. Nennen wir den Ausgang QAL.
Folgendes ist in meinem Code enthalten (am Beispiel des Modus für die erste Eingabe):
os.system('gdalwarp -tr .25 .25 -r mode -srcnodata -15000 %s %s' % (NDVI_raster, NDVI_mode))
Und für die QS-Schicht:
os.system('gdalwarp -tr .25 .25 -r average -srcnodata -15000 %s %s' % (nodata_mask, QAL))
Das Ergebnis sind Raster mit der richtigen Auflösung, Projektion und Pixeltiefe, aber die Pixelwerte sind alle 0.
Weiß jemand, der mit Python / GDAL vertraut ist, was los ist?
Wenn ich den Befehl gdalwarp über die Befehlszeile (Linux) aufrufe, erhalte ich das gewünschte Ergebnis. Wenn ich mit os.system gdalwarp von Python aus aufrufe, erhalte ich leere Raster. Vielleicht stimmt etwas mit meinen GDAL / Python-Bindungen nicht?
Anstatt den Befehl über os.system aufzurufen, habe ich einen Unterprozess verwendet. Das Tool über diese Methode scheint ebenfalls reibungslos zu funktionieren, aber das Ergebnis ist dasselbe: ein Raster voller Nullen.
Ich habe versucht, den gdalwarp-Aufruf in ein Bash-Shell-Skript einzufügen und dieses Shell-Skript von Python aus aufzurufen, aber das Ergebnis ist eine Reihe von -1s anstelle von 0s. Seltsamerweise hatte ich es schon einmal getestet und bin mir ziemlich sicher, dass es funktioniert hat, aber der Test wurde von meinem Server gelöscht und jetzt kann ich ihn aus irgendeinem Grund nicht neu erstellen.
Wenn Sie den Befehl gdalwarp in ein Bash-Shell-Skript einfügen und dieses Shell-Skript dann über die Befehlszeile aufrufen, erhalte ich das gewünschte Ergebnis. Das Aufrufen des gleichen Shell-Skripts aus Python ist jedoch nicht möglich. Es sieht so aus, als ob etwas mit Python nicht stimmt, aber was und wie behebe ich es?
os.system
Startet tatsächlich eine Shell und führt den angegebenen Befehl aus. Zusätzlich zum Rückgabewert sollten Sie wahrscheinlich die Variablen überprüfen, die Sie übergeben möchten (z. B. Probleme beim Zitieren? Usw.)
os.system
zu subprocess
dem das aktuelle Modul und enthält eine Reihe von (Sicherheits-) Verbesserungen.
-ot Float32
für die Qualitätsmaske etwas Ähnliches angeben müssen , da Sie mit einem ganzzahligen Raster keine Brüche darstellen können.