J'ai rencontré toutes sortes de problèmes en utilisant ArcGIS ZonalStats et j'ai pensé que R pourrait être un excellent moyen. Dire que je suis assez nouveau pour R, mais j'ai un fond de codage.
La situation est que j'ai plusieurs rasters et un fichier de formes polygonales avec de nombreuses entités de tailles différentes (bien que toutes les entités soient plus grandes qu'une cellule raster et que les entités polygonales soient alignées sur le raster). J'ai trouvé comment obtenir la valeur moyenne de chaque entité surfacique en utilisant la bibliothèque raster avec extrait:
#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'])
Le problème que j'ai est que j'ai également besoin d'un rapport basé sur l'aire entre l'aire du polygone et toutes les cellules non NA du même polygone. Je connais la taille des cellules du raster et je peux obtenir l'aire de chaque polygone, mais le lien manquant est le nombre de toutes les cellules non NA de chaque entité. J'ai réussi à obtenir le numéro de cellule de toutes les cellules du polygone proxNA@data$Cnumb1000 <- cellFromPolygon(ras, proxNA)
et je suis sûr qu'il existe un moyen d'obtenir la valeur réelle de la cellule raster, qui nécessite ensuite une boucle pour obtenir le nombre de toutes les cellules non NA combinées avec un décompte, etc. MAIS, je suis sûr qu'il existe un moyen bien meilleur et plus rapide de le faire! Si l'un d'entre vous a une idée ou peut me diriger dans la bonne direction, je lui en serais très reconnaissant!
ras
tenir les drapeaux NA en utilisant une valeur légitime? Il semble que vous puissiez soit filtrer pour cette valeur, soit obtenir un décompte de ces valeurs après coup.