Wie finde ich den durchschnittlichen Rasterwert eines durch ein Shapefile definierten Bereichs mit R?

19

Ich habe eine Reihe von Rasterbildern, die einen bestimmten Monat über die Jahre darstellen, und ich möchte mithilfe eines Shapefiles eine Zeitleiste der Durchschnittswerte eines Bereichs erstellen.

Wie extrahiere ich die Werte aus den Rastern und importiere sie in R, sodass ich sie verwenden kann?

nickves
quelle

Antworten:

23

Hier ist Beispielcode. Es ist ziemlich einfach, diesen Code so anzupassen, dass er in einer Schleife zur Verarbeitung aller Ihrer Raster funktioniert. Wenn Ihre Raster eine gemeinsame Ausdehnung und Auflösung haben, können Sie einen Raster-Stapel erstellen und die Bänder im Stapel durchlaufen. Um einen Vektor zu erstellen, der alle Raster in einem Verzeichnis in einem bestimmten Format enthält, können Sie "list.files" verwenden und diesen Vektor an stack übergeben.

Beispiel:

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
quelle
1
+1 - ausgezeichnete Lösung, übersichtlich und vollständige Antwort.
Simbamangu
Wenn ich eine Multipolygon- data.frame(sdata@data, m2012=r.mean)Datei habe : Woher weiß das Whch-Polygon, welchem ​​Wert es zugewiesen werden soll?
Stophface
um r.mean korrekt zu sdata hinzuzufügen musste ich zuerst r.mean abmelden: r.mean <- unlist (lapply (r.vals, FUN = mean))
cmbarbu
6

Liest das Shapefile in ein SpatialPolygonsDataFrame( readOGRFunktion aus Paket rgdal)

Das Raster in ein RasterObjekt einlesen ( rasterFunktion aus Paket raster)

Verwenden Sie extract(raster, spdf), um die Gitterzellen unter jedem Polygon abzurufen. Dann renn meanauf sie los.

Wiederholen Sie diesen Vorgang über Ihren Satz von Rasterbildern ...

Raumfahrer
quelle
Wie schreibe ich das Shapefile aus (mit den aus dem Rasterbild extrahierten Werten)?
Stophface