Ich wurde beauftragt, eine Eignungsanalyse der Wellenbedingungen im Golf von Mexiko zu erstellen. Ich habe ungefähr zweitausend Rasterdateien mit jeweils ca. 8 MB (2438 Spalten, 1749 Zeilen, 1 km Zellengröße). Der Parameter in den Rasterdateien ist die Wellenperiode, und ich möchte alle Raster so umklassifizieren, dass if 4<= wave period <=9 then make cell = 1
, else cell = 0. Dann alle Raster zu einem endgültigen Raster zusammenfassen und durch die Gesamtzahl der Raster dividieren, um a zu erhalten Gesamtprozentsatz geeigneter Beobachtungen und Exportergebnisse in ein ESRI-kompatibles Format ... möglicherweise etwas, das Floats bei Bedarf unterstützen kann. Ich habe weder mit Python noch mit R viel gearbeitet, aber nach der Online-Suche scheint es sinnvoll, diesen Prozess in einer dieser Sprachen durchzuführen. Ich habe mir bisher einen Code in R ausgedacht, bin aber verwirrt darüber, wie das funktioniert.
library(rgdal)
raster_data <- list.files(path=getwd()) #promt user for dir containing raster files
num_files <- length(raster_data)
for (i in raster_data) { #read in rasters
my_data <- readGDAL(raster_data[i])
An diesem Punkt bin ich verwirrt, ob ich auch die Daten innerhalb dieser Schleife neu klassifizieren und summieren soll oder nicht. Meine Vermutung wäre ja, da ich sonst denke, dass mir möglicherweise der Speicher auf meinem Computer ausgehen würde, aber ich bin mir einfach nicht sicher. Ich bin mir auch nicht sicher, wie ich die Daten neu klassifizieren soll.
Bei Online-Recherchen denke ich, ich würde verwenden reclass(my_data, c(-Inf,3,0, 4,9,1, 10,Inf,0))
, aber sieht das richtig aus?
Und zum Summieren würde ich das verwenden sum(stack(my_data))
und irgendwie ausgeben. Auch ... wenn dies effizienter ausgeführt oder in Python geschrieben werden könnte, wäre ich auch dafür offen. Ich bin wirklich ein Anfänger, wenn es um Programmierung geht.
Antworten:
Dies ist eine kurze Möglichkeit, dies in R zu tun --- hier ohne Zwischendateien:
quelle
R
zum Erstellen im RAM bleiben müssens
. (Wahrscheinlich wird doppelt so viel RAM benötigt, da ess
wahrscheinlich nicht ersetzt wirdraster_data
.) Ich hoffe, Sie haben viel RAM! Ihre Lösung kann praktikabel gemacht werden, indem Sie die 2000 Gitter in kleinere Gruppen aufteilen, die Berechnung für jede Gruppe durchführen und diese Berechnungen dann kombinieren.stack
undcalc
arbeitete wie die meisten anderenR
Funktionen, indem ich zuerst alle Daten in den RAM lud.Wie ich in den Kommentaren bemerkt habe, sollten Sie R im Allgemeinen aufgrund von Leistungsproblemen in bestimmten Aspekten für nicht statistische Zwecke vermeiden (das Arbeiten mit Zyklen ist ein Beispiel). Hier ist ein Codebeispiel für Sie in Pyhton (dank dieses Artikels ) zur Neuklassifizierung einer einzelnen Datei mit einem einzelnen Band. Sie können es problemlos für die Stapelverarbeitung ändern, wenn Sie wissen, wie Sie alle Dateien aus dem Verzeichnis abrufen . Beachten Sie, dass Raster als Arrays dargestellt werden. Sie können daher Array-Methoden verwenden, um die Leistung gegebenenfalls zu verbessern. Informationen zum Arbeiten mit Arrays in Python finden Sie in der Numpy-Dokumentation .
UPD: Der Code, den ich ursprünglich gepostet habe, war eine abgeschnittene Version eines benutzerdefinierten Filters, der pro Pixelverarbeitung benötigt wurde. Bei dieser Frage erhöht die Verwendung von Numpy jedoch die Leistung (siehe Code).
quelle
Verwenden Sie nicht readGDAL. Es liest in ein Spatial * -Objekt ein, was möglicherweise keine gute Idee ist.
Verwenden Sie das
raster
Paket. Es kann GDAL-Dinge in Raster-Objekte einlesen. Das ist eine gute Sache.r = raster("/path/to/rasterfile.tif")
werde es in lesenr
.Ihre Klassifizierung ist dann
t = r > 4 & r <= 9
Die große Frage ist, ob diese in neue Rasterdateien ausgegeben und dann der Zusammenfassungsschritt in einer anderen Schleife ausgeführt werden sollen. Wenn Sie den Speicher haben, würde ich sie in neue Dateien schreiben, nur weil Sie erneut starten müssen, wenn Ihre Schleife fehlschlägt (weil eine dieser 2000 Dateien Junk ist). Verwenden
writeRaster
Sie diese Option, um Raster mit Schwellenwerten zu erstellen, wenn Sie sich dazu entschließen.Ihre Schleife ist dann nur so etwas wie
diese.
Die Speicherverwaltung von R könnte Sie hier treffen - wenn Sie dies tun, erstellt
count=count+r
R möglicherweise eine neue Kopie voncount
. Das sind also möglicherweise 2000 Kopien davon - aber die Speicherbereinigung wird aktiviert und aufgeräumt, und hier war die Schleife von R früher sehr schlecht.In Bezug auf das Timing dauert auf meinem 4-jährigen PC der Schwellenwert op bei einem Raster dieser Größe von Zufallszahlen zwischen null und zwanzig etwa 1,5 Sekunden. Times 2000 = Sie rechnen. Erstellen Sie wie immer einen kleinen Testsatz für die Entwicklung des Codes, starten Sie ihn dann mit Ihren realen Daten und trinken Sie einen Kaffee.
quelle
R
2.15.0) dauert das Lesen eines 1,6-Megapixel-Rasters (im nativen ESRI-Gleitkommaformat) 0,19 Sekunden und das Ausführen der fünf Schleifenoperationen - zwei Vergleiche, eine Konjunktion, eine Addition und ein Speicher - dauert eine weitere 0,09 Sekunden für 0,28 Sekunden pro Iteration. Wenn stattdessen die Schleife ausgeführt wird, indem jeweils 100 Gitter in einem Array zwischengespeichert werden undrowSums
die Summen verwendet werden, steigt natürlich die RAM-Auslastung. Ebenso offensichtlich gibt es jedoch keine Speicherbereinigung. Das Timing sinkt nur auf 0,26 Sekunden pro Iteration.