
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:
sudo apt-get install libgdal-dev libgeos-dev libproj-dev libudunits2-dev libsqlite3-devEverything 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 overviewPlease see CONTRIBUTING.md for information on how to
contribute to this project.