Comment trouver la valeur raster moyenne d'une zone définie par un fichier de formes à l'aide de R?

19

J'ai un ensemble d'images raster qui représentent un mois spécifique au fil des ans, et je veux faire une chronologie des valeurs moyennes d'une zone à l'aide d'un fichier de formes.

Comment extraire les valeurs des rasters et les importer dans R de manière à pouvoir les utiliser?

nickves
la source

Réponses:

23

Voici un exemple de code. Il est assez simple d'adapter ce code pour fonctionner en boucle pour traiter tous vos rasters. Si vos rasters partagent une étendue et une résolution communes, vous pouvez créer une pile de rasters et parcourir les bandes de la pile. Pour créer un vecteur contenant tous les rasters dans un répertoire, dans un format spécifique, vous pouvez utiliser "list.files" puis passer ce vecteur pour l'empiler.

Exemple:

rlist=list.files(getwd(), pattern="img$", full.names=TRUE) 

r <- stack(rlist)   


    # Add required libraries
    require(raster)
    require(sp)
    require(rgdal)

    # Set working directory, raster, in and out shapefiles
    setwd("C:/test")
    inshp="MyPolys"
    outshp="PolyMeans"
    rdata <- "Year2012.img"

    # Read polygon feature class shapefile
    sdata <- readOGR(dsn=getwd(), layer=inshp)

    # Read raster
    r <- raster(rdata)

    # Extract raster values to list object
    r.vals <- extract(r, sdata)

    # Use list apply to calculate mean for each polygon
    r.mean <- lapply(r.vals, FUN=mean)

    # Join mean values to polygon data
    sdata@data <- data.frame(sdata@data, m2012=r.mean)

    # Write results
    writeOGR(sdata, getwd(), outshp, driver="ESRI Shapefile", check_exists=TRUE, 
         overwrite_layer=TRUE)
Jeffrey Evans
la source
1
+1 - excellente solution, bien présentée et réponse complète.
Simbamangu
Si j'ai un data.frame(sdata@data, m2012=r.mean)fichier multipolygone: comment le polygone sait-il à quelle valeur attribuer?
Stophface
pour que r.mean soit correctement ajouté aux sdata, je devais d'abord annuler la liste de r.mean: r.mean <- annuler la liste (lapply (r.vals, FUN = mean))
cmbarbu
6

Lire le fichier de formes dans une SpatialPolygonsDataFrame( readOGRfonction du package rgdal)

Lire le raster dans un Rasterobjet ( rasterfonction du package raster)

Utilisez extract(raster, spdf)pour obtenir les cellules de la grille sous chaque polygone. Ensuite, courez meandessus.

Répétez sur votre ensemble d'images raster ...

Spacedman
la source
comment écrire le fichier de formes (avec les valeurs extraites de l'image raster)?
Stophface