
Spatial building blocks for landscape simulation models.
SpaDES.tools provides several spatial operations that landscape and agent-based models need repeatedly and that do not generally exist in general-purpose GIS packages: contagious spread across a raster, some helpers for neighbourhoods and distance calculations, correlated random walks, and random landscape generation. Most functions work directly on terra objects and are written to be called thousands of times inside a simulation loop, so they favour cell indices and data.table output over repeated raster allocation.
It is one of the SpaDES packages, but does not depend on the rest of them — you can use it on its own, without SpaDES.core or a discrete event simulation.
Website: https://SpaDES-tools.PredictiveEcology.org
Fire, disease, dispersal, disturbance — anything that propagates from cell to neighbouring cell. spread2() is the workhorse; spread3() handles spread from multiple sources with distinct kernels.
library(SpaDES.tools)
library(terra)
landscape <- rast(nrows = 100, ncols = 100, xmin = 0, xmax = 100, ymin = 0, ymax = 100)
landscape[] <- 1
## one fire, spreading until it goes out on its own
set.seed(2)
fires <- spread2(landscape, start = 5050, spreadProb = 0.24, asRaster = TRUE)
plot(fires)spreadProb can be a single number or a raster of per-cell probabilities, which is how landscape heterogeneity enters the model.
Spread on a lattice is a percolation process, so this one number matters more than its size suggests. Roughly, for 8-neighbour spread:
0.24 on the 100 x 100 grid above, the median event burns a few hundred cells and the largest run to several thousand;That self-stopping band is usually where you want to be, and it is narrow. maxSize, exactSize and iterations are there for when you need to pin the size distribution down rather than let it emerge.
## the 8 neighbours of a cell, as cell indices
adj(landscape, cells = 5050, directions = 8)
## every cell between 5 and 10 cells away -- a donut around a focal cell
donut <- rings(landscape, loci = 5050, minRadius = 5, maxRadius = 10,
returnIndices = TRUE)
head(donut)
#> id initialLocus indices active dists
#> 1: 1 5050 4647 FALSE 5
#> 2: 1 5050 4653 FALSE 5
#> 3: 1 5050 5453 FALSE 5cir() draws circles and spokes() draws rays from focal points; distanceFromEachPoint() and directionFromEachPoint() build distance and direction surfaces from one set of points to another.
## ten agents taking 20 steps of a correlated random walk
set.seed(2)
agents <- vect(cbind(x = runif(10, 0, 100), y = runif(10, 0, 100)))
for (i in 1:20) {
agents <- crw(agents, stepLength = 2, stddev = 15, lonlat = FALSE)
}heading() gives bearings between points, wrapTorus() wraps agents that walk off one edge back onto the other, and specificNumPerPatch() seeds a set number of agents into each patch of a map.
Useful for building and testing a model before the real data arrive.
set.seed(1)
habitat <- neutralLandscapeMap(landscape, roughness = 0.6, rand_dev = 10)
patches <- randomPolygons(numTypes = 5, nrow = 50, ncol = 50)
studyArea <- randomStudyArea(size = 1e7)splitRaster() and mergeRaster() tile a raster for parallel processing and put it back together; rasterizeReduced() expands a compact one-row-per-class table back into a full raster.
For the full categorized list, see ?SpaDES.tools or the reference index.
SpaDES.tools needs R 4.3 or later.
Installing from CRAN on Windows or macOS gives you a pre-built binary and needs nothing else. The notes below apply when you install from source — always the case on Linux, and on any platform when installing the development version from GitHub.
A C++ toolchain, because part of the package is compiled:
xcode-select --install)build-essential on Debian/Ubuntu)GDAL, GEOS and PROJ, because SpaDES.tools depends on terra. The Windows and macOS terra binaries bundle these; on Linux install them first. On Debian/Ubuntu that is:
Everything else is an R package and will be pulled in automatically.
From CRAN:
install.packages("SpaDES.tools")From GitHub:
# install.packages("remotes")
remotes::install_github("PredictiveEcology/SpaDES.tools", ref = "main", dependencies = TRUE)From R-universe — pre-built binaries for Windows and macOS, so no compiler or system libraries are needed:
install.packages("SpaDES.tools",
repos = c("https://predictiveecology.r-universe.dev",
"https://cloud.r-project.org"))From GitHub (builds from source):
# install.packages("remotes")
remotes::install_github("PredictiveEcology/SpaDES.tools", ref = "development", dependencies = TRUE)?SpaDES.tools — categorized overview