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.