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.Réponses:
Les exemples de données de Jeffrey
Utilisez maintenant l'extrait
Si vous avez plusieurs rasters, utilisez d'abord la pile pour les combiner (s'ils ont la même étendue et la même résolution)
Pour obtenir la zone de polygone réelle, vous ne devez pas utiliser l'approche de la fente (i, «zone»). Pour les données planes, vous pouvez utiliser rgeos :: gArea (polys, byid = TRUE) Pour les données sphériques (lon / lat), vous pouvez utiliser geosphere :: areaPolygon
la source
Je ne sais pas si vous voulez que le rapport soit basé sur la "valeur réelle" des zones de polygone (s) ou des zones des cellules qui les coupent. Voici un exemple de code qui utilise toutes les cellules coupant les polygones (essentiellement, le rapport des cellules NA aux cellules non NA). Il s'agit d'un exemple factice et vous devrez écrire votre propre fonction.
Vous pouvez utiliser cet extrait de code pour ajouter une colonne de zone à vos données de polygone en extrayant de l'emplacement de zone. Cela peut être utilisé si vous souhaitez effectuer un ratio à l'aide de la zone de polygone "réelle".
L'alternative la plus efficace et considérablement plus rapide aux boucles for sont des fonctions de type "appliquer". Il existe un certain nombre de ceux-ci disponibles dans R qui sont utilisés pour différentes classes d'objets ou structures de données. Dans ce cas, puisque extract renvoie une liste, nous utiliserons lapply (list apply). Il s'agit d'un moyen d'appliquer une fonction de base ou personnalisée à un objet de liste. La classe d'objets stockée dans la liste est un vecteur, la fonction est assez simple. Si vous utilisez l'extraction sur un objet raster de brique ou de pile, les objets résultants stockés dans la liste sont des objets data.frame.
la source
Je n'ai pas accès à vos fichiers, mais d'après ce que vous avez décrit, cela devrait fonctionner:
la source