Raster algebra¶
Many generic functions that allow for simple and elegant raster algebra
have been implemented for Raster*
objects, including the normal
algebraic operators such as +
, -
, *
, /
, logical
operators such as >
, >=
, <
, ==
, !
} and functions
such as abs
, round
, ceiling
, floor
, trunc
, sqrt
,
log
, log10
, exp
, cos
, sin
, max
, min
,
range
, prod
, sum
, any
, all
. In these functions you
can mix raster
objects with numbers, as long as the first argument
is a raster
object.
# create an empty RasterLayer
library(raster)
r <- raster(ncol=10, nrow=10)
# assign values to cells
values(r) <- 1:ncell(r)
s <- r + 10
s <- sqrt(s)
s <- s * r + 5
r[] <- runif(ncell(r))
r <- round(r)
r <- r == 1
You can also use replacement functions:
s[r] <- -0.5
s[!r] <- 5
s[s == 5] <- 15
If you use multiple Raster*
objects (in functions where this is
relevant, such as range), these must have the same resolution and
origin. The origin of a Raster*
object is the point closest to (0,
0) that you could get if you moved from a corners of a Raster*
object towards that point in steps of the x
and y
resolution.
Normally these objects would also have the same extent, but if they do
not, the returned object covers the spatial intersection of the objects
used.
When you use multiple multi-layer objects with different numbers or layers, the ‘shorter’ objects are ‘recycled’. For example, if you multuply a 4-layer object (a1, a2, a3, a4) with a 2-layer object (b1, b2), the result is a four-layer object (a1b1, a2b2, a3b1, a3b2).
r <- raster(ncol=5, nrow=5)
r[] <- 1
s <- stack(r, r+1)
q <- stack(r, r+2, r+4, r+6)
x <- r + s + q
x
## class : RasterBrick
## dimensions : 5, 5, 25, 4 (nrow, ncol, ncell, nlayers)
## resolution : 72, 36 (x, y)
## extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## source : memory
## names : layer.1, layer.2, layer.3, layer.4
## min values : 3, 6, 7, 10
## max values : 3, 6, 7, 10
Summary functions (min, max, mean, prod, sum, Median, cv, range, any,
all) always return a RasterLayer
object. Perhaps this is not
obvious when using functions like min, sum or mean.
a <- mean(r,s,10)
b <- sum(r,s)
st <- stack(r, s, a, b)
sst <- sum(st)
sst
## class : RasterLayer
## dimensions : 5, 5, 25 (nrow, ncol, ncell)
## resolution : 72, 36 (x, y)
## extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## source : memory
## names : layer
## values : 11.5, 11.5 (min, max)
Use cellStats
if instead of a RasterLayer
you want a single
number summarizing the cell values of each layer.
cellStats(st, 'sum')
## layer.1.1 layer.1.2 layer.2.1 layer.2.2 layer.3
## 25.0 25.0 50.0 87.5 100.0
cellStats(sst, 'sum')
## [1] 287.5