Raster data¶
Introduction¶
The sp
package supports raster (gridded) data with with the
SpatialGridDataFrame
and SpatialPixelsDataFrame
classes.
However, we will focus on classes from the raster
package for raster
data. The raster package is built around a number of classes of which
the RasterLayer
, RasterBrick
, and RasterStack
classes are
the most important. When discussing methods that can operate on all
three of these objects, they are referred to as ’Raster*’ objects.
The raster
package has functions for creating, reading,
manipulating, and writing raster data. The package provides, among other
things, general raster data manipulation functions that can easily be
used to develop more specific functions. For example, there are
functions to read a chunk of raster values from a file or to convert
cell numbers to coordinates and back. The package also implements raster
algebra and many other functions for raster data manipulation.
RasterLayer¶
A RasterLayer
object represents single-layer (variable) raster data.
A RasterLayer
object always stores a number of fundamental
parameters that describe it. These include the number of columns and
rows, the spatial extent, and the Coordinate Reference System. In
addition, a RasterLayer
can store information about the file in
which the raster cell values are stored (if there is such a file). A
RasterLayer
can also hold the raster cell values in memory.
Here I create a RasterLayer
from scratch. But note that in most
cases where real data is analyzed, these objects are created from a
file.
library(raster)
r <- raster(ncol=10, nrow=10, xmx=-80, xmn=-150, ymn=20, ymx=60)
r
## class : RasterLayer
## dimensions : 10, 10, 100 (nrow, ncol, ncell)
## resolution : 7, 4 (x, y)
## extent : -150, -80, 20, 60 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
Object r
only has the skeleton of a raster data set. That is, it
knows about its location, resolution, etc., but there are no values
associated with it. Let’s assign some values. In this case I assign a
vector of random numbers with a length that is equal to the number of
cells of the RasterLayer.
values(r) <- runif(ncell(r))
r
## class : RasterLayer
## dimensions : 10, 10, 100 (nrow, ncol, ncell)
## resolution : 7, 4 (x, y)
## extent : -150, -80, 20, 60 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## source : memory
## names : layer
## values : 0.01307758, 0.9926841 (min, max)
You can also assign cell numbers (in this case overwriting the previous values)
values(r) <- 1:ncell(r)
r
## class : RasterLayer
## dimensions : 10, 10, 100 (nrow, ncol, ncell)
## resolution : 7, 4 (x, y)
## extent : -150, -80, 20, 60 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## source : memory
## names : layer
## values : 1, 100 (min, max)
We can plot this object.
plot(r)
# add polygon and points
lon <- c(-116.8, -114.2, -112.9, -111.9, -114.2, -115.4, -117.7)
lat <- c(41.3, 42.9, 42.4, 39.8, 37.6, 38.3, 37.6)
lonlat <- cbind(lon, lat)
pols <- spPolygons(lonlat, crs='+proj=longlat +datum=WGS84')
points(lonlat, col='red', pch=20, cex=3)
plot(pols, border='blue', lwd=2, add=TRUE)
RasterStack and RasterBrick¶
It is quite common to analyze raster data using single-layer objects.
However, in many cases multi-variable raster data sets are used. The
raster
package has two classes for multi-layer data the
RasterStack
and the RasterBrick
. The principal difference
between these two classes is that a RasterBrick
can only be linked
to a single (multi-layer) file. In contrast, a RasterStack
can be
formed from separate files and/or from a few layers (‘bands’) from a
single file.
In fact, a RasterStack
is a collection of RasterLayer
objects
with the same spatial extent and resolution. In essence it is a list of
RasterLayer
objects. A RasterStack
can easily be formed form a
collection of files in different locations and these can be mixed with
RasterLayer
objects that only exist in the RAM memory (not on disk).
A RasterBrick
is truly a multi-layered object, and processing a
RasterBrick
can be more efficient than processing a RasterStack
representing the same data. However, it can only refer to a single file.
A typical example of such a file would be a multi-band satellite image
or the output of a global climate model (with e.g., a time series of
temperature values for each day of the year for each raster cell).
Methods that operate on RasterStack
and RasterBrick
objects
typically return a RasterBrick
object.
Thus, the main difference is that a RasterStack
is loose collection
of RasterLayer
objects that can refer to different files (but must
all have the same extent and resolution), whereas a RasterBrick
can
only point to a single file.
Here is an example how you can make a RasterStack from multiple layers.
r2 <- r * r
r3 <- sqrt(r)
s <- stack(r, r2, r3)
s
## class : RasterStack
## dimensions : 10, 10, 100, 3 (nrow, ncol, ncell, nlayers)
## resolution : 7, 4 (x, y)
## extent : -150, -80, 20, 60 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## names : layer.1, layer.2, layer.3
## min values : 1, 1, 1
## max values : 100, 10000, 10
plot(s)
And you can make a RasterBrick from a RasterStack.
b <- brick(s)
b
## class : RasterBrick
## dimensions : 10, 10, 100, 3 (nrow, ncol, ncell, nlayers)
## resolution : 7, 4 (x, y)
## extent : -150, -80, 20, 60 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## source : memory
## names : layer.1, layer.2, layer.3
## min values : 1, 1, 1
## max values : 100, 10000, 10