Ich bin mit ArcGIS ZonalStats auf alle möglichen Probleme gestoßen und dachte, R könnte eine großartige Möglichkeit sein. Ich bin ziemlich neu in R, habe aber einen Codierungshintergrund.
Die Situation ist, dass ich mehrere Raster und ein Polygon-Shapefile mit vielen Features unterschiedlicher Größe habe (obwohl alle Features größer als eine Rasterzelle sind und die Polygon-Features auf das Raster ausgerichtet sind). Ich habe herausgefunden, wie der Mittelwert für jedes Polygon-Feature mithilfe der Raster-Bibliothek mit Extrakt ermittelt werden kann:
#load packages required
require(rgdal)
require(sp)
require(raster)
# ---Set the working directory-------
datdir <- "/test_data/"
#Read in grid of water depth
ras <- raster("test_data/raster/pl_sm_rp1000/w001001.adf")
#read in polygon shape file
proxNA <- shapefile("test_data/proxy/PL_proxy_WD_NA_test")
#calc mean depth per polygon feature
#unweighted - only assigns grid to district if centroid is in that district
proxNA$RP1000 <- extract(ras, proxNA, fun = mean, na.rm = TRUE, weights = FALSE)
#plot depth values
spplot(proxNA[,'RP1000'])
Das Problem, das ich habe, ist, dass ich auch ein flächenbasiertes Verhältnis zwischen der Fläche des Polygons und allen Nicht-NA-Zellen im selben Polygon benötige. Ich weiß, wie groß die Zellen des Rasters sind, und ich kann die Fläche für jedes Polygon ermitteln, aber das fehlende Glied ist die Anzahl aller Nicht-NA-Zellen in jedem Feature. Ich habe es geschafft, die Zellennummer aller Zellen im Polygon zu ermitteln, proxNA@data$Cnumb1000 <- cellFromPolygon(ras, proxNA)
und ich bin sicher, dass es eine Möglichkeit gibt, den tatsächlichen Wert der Rasterzelle zu ermitteln, für die dann eine Schleife erforderlich ist, um die Anzahl aller Nicht-NA-Zellen zu ermitteln eine Zählung usw. ABER ich bin sicher, dass es einen viel besseren und schnelleren Weg gibt, das zu tun! Wenn jemand von euch eine Idee hat oder mich in die richtige Richtung weisen kann, wäre ich sehr dankbar!
ras
Halten von NA-Flags einen legitimen Wert? Es scheint, als könnten Sie entweder nach diesem Wert filtern oder diese Werte nachträglich zählen.Antworten:
Die Beispieldaten von Jeffrey
Verwenden Sie nun Extrakt
Wenn Sie viele Raster haben, kombinieren Sie diese zuerst mit dem Stapel (wenn sie den gleichen Umfang und die gleiche Auflösung haben).
Um den tatsächlichen Polygonbereich zu erhalten, sollten Sie nicht den Slot-Ansatz (i, 'area') verwenden. Für planare Daten können Sie rgeos :: gArea (polys, byid = TRUE) verwenden. Für sphärische Daten (lon / lat) können Sie geosphere :: areaPolygon verwenden
quelle
Ich bin mir nicht sicher, ob Sie das Verhältnis basierend auf dem "realen Wert" der Polygonbereiche oder der Bereiche der Zellen, die sie schneiden, möchten. Hier ist ein Beispielcode, der alle Zellen verwendet, die die Polygone schneiden (im Grunde das Verhältnis von NA-Zellen zu Nicht-NA-Zellen). Es ist ein Dummy-Beispiel und Sie müssen Ihre eigene Funktion schreiben.
Mit diesem Codeausschnitt können Sie Ihren Polygondaten eine Bereichsspalte hinzufügen, indem Sie sie aus dem Bereichsbereich extrahieren. Dies kann verwendet werden, wenn Sie das Verhältnis unter Verwendung des "echten" Polygonbereichs verwenden möchten.
Die effizienteste und wesentlich schnellere Alternative zu for-Schleifen sind "Apply" -ähnliche Funktionen. In R sind einige davon verfügbar, die für verschiedene Objektklassen oder Datenstrukturen verwendet werden. In diesem Fall verwenden wir lapply (Liste gilt), da der Extrakt eine Liste zurückgibt. Auf diese Weise können Sie eine Basis- oder benutzerdefinierte Funktion auf ein Listenobjekt anwenden. Die in der Liste gespeicherte Objektklasse ist ein Vektor, die Funktion ist recht einfach. Wenn Sie Extrakt für ein Baustein- oder Stapelrasterobjekt verwenden, sind die in der Liste gespeicherten resultierenden Objekte data.frame-Objekte.
quelle
Ich habe keinen Zugriff auf Ihre Dateien, aber basierend auf dem, was Sie beschrieben haben, sollte dies funktionieren:
quelle