Extract values from Raster objects
Extract values from a Raster* object at the locations of spatial vector data. There are methods for points, lines, and polygons (classes from 'sp' or 'sf'), for a matrix or data.frame of points. You can also use cell numbers and Extent (rectangle) objects to extract values.
If y
represents points, extract
returns the values of a Raster* object for the cells in which a set of points fall.
If y
represents lines, the extract
method returns the values of the cells of a Raster* object that are touched by a line. If y
represents polygons, the extract
method returns the values of the cells of a Raster* object that are covered by a polygon. A cell is covered if its center is inside the polygon (but see the weights
option for considering partly covered cells; and argument small
for getting values for small polygons).
It is also possible to extract values for point locations from SpatialPolygons.
## S4 method for signature 'Raster,matrix' extract(x, y, method='simple', buffer=NULL, small=FALSE, cellnumbers=FALSE, fun=NULL, na.rm=TRUE, layer, nl, df=FALSE, factors=FALSE, ...) ## S4 method for signature 'Raster,SpatialLines' extract(x, y, fun=NULL, na.rm=FALSE, cellnumbers=FALSE, df=FALSE, layer, nl, factors=FALSE, along=FALSE, sp=FALSE, ...) ## S4 method for signature 'Raster,SpatialPolygons' extract(x, y, fun=NULL, na.rm=FALSE, weights=FALSE, normalizeWeights=TRUE, cellnumbers=FALSE, small=TRUE, df=FALSE, layer, nl, factors=FALSE, sp=FALSE, ...) ## S4 method for signature 'SpatialPolygons,SpatialPoints' extract(x, y, ...)
x |
Raster* object |
y |
points represented by a two-column matrix or data.frame, or |
method |
character. |
buffer |
numeric. The radius of a buffer around each point from which to extract cell values. If the distance between the sampling point and the center of a cell is less than or equal to the buffer, the cell is included. The buffer can be specified as a single value, or as a vector of the length of the number of points. If the data are not projected (latitude/longitude), the unit should be meters. Otherwise it should be in map-units (typically also meters). |
small |
logical. If |
fun |
function to summarize the values (e.g. |
na.rm |
logical. Only useful when an argument |
cellnumbers |
logical. If |
df |
logical. If |
weights |
logical. If |
normalizeWeights |
logical. If |
factors |
logical. If |
layer |
integer. First layer for which you want values (if |
nl |
integer. Number of layers for which you want values (if |
along |
boolean. Should returned values be ordered to go along the lines? |
sp |
boolean. Should the extracted values be added to the data.frame of the Spatial* object |
... |
additional arguments (none implemented) |
A vector for RasterLayer objects, and a matrix for RasterStack or RasterBrick objects. A list (or a data.frame if df=TRUE
) if y
is a SpatialPolygons* or SpatialLines* object or if a buffer
argument is used (but not a fun
argument). If sp=TRUE
and y
is a Spatial* object and fun
is not NULL a Spatial* object is returned. The order of the returned values corresponds to the order of object y
. If df=TRUE
, this is also indicated in the first variable ('ID').
r <- raster(ncol=36, nrow=18, vals=1:(18*36)) ############################### # extract values by cell number ############################### extract(r, c(1:2, 10, 100)) s <- stack(r, sqrt(r), r/r) extract(s, c(1, 10, 100), layer=2, n=2) ############################### # extract values with points ############################### xy <- cbind(-50, seq(-80, 80, by=20)) extract(r, xy) sp <- SpatialPoints(xy) extract(r, sp, method='bilinear') # examples with a buffer extract(r, xy[1:3,], buffer=1000000) extract(r, xy[1:3,], buffer=1000000, fun=mean) ## illustrating the varying size of a buffer (expressed in meters) ## on a longitude/latitude raster z <- extract(r, xy, buffer=1000000) s <- raster(r) for (i in 1:length(z)) { s[z[[i]]] <- i } ## compare with raster that is not longitude/latitude crs(r) <- "+proj=utm +zone=17" xy[,1] <- 50 z <- extract(r, xy, buffer=8) for (i in 1:length(z)) { s[z[[i]]] <- i } plot(s) # library(maptools) # data(wrld_simpl) # plot(wrld_simpl, add=TRUE) ############################### # extract values with lines ############################### r <- raster(ncol=36, nrow=18, vals=1:(18*36)) cds1 <- rbind(c(-50,0), c(0,60), c(40,5), c(15,-45), c(-10,-25)) cds2 <- rbind(c(80,20), c(140,60), c(160,0), c(140,-55)) lines <- spLines(cds1, cds2) extract(r, lines) ############################### # extract values with polygons ############################### cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20)) cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0)) polys <- spPolygons(cds1, cds2) v <- extract(r, polys) # mean for each polygon unlist(lapply(v, function(x) if (!is.null(x)) mean(x, na.rm=TRUE) else NA )) # v <- extract(r, polys, cellnumbers=TRUE) # weighted mean # v <- extract(r, polys, weights=TRUE, fun=mean) # equivalent to: # v <- extract(r, polys, weights=TRUE) # sapply(v, function(x) if (!is.null(x)) {sum(apply(x, 1, prod)) / sum(x[,2])} else NA) ############################### # extract values with an extent ############################### e <- extent(150,170,-60,-40) extract(r, e) #plot(r) #plot(e, add=T)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.