Fast calculation of adjacencies between classes in a raster
Arguments
- landscape
A categorical raster object: SpatRaster; Raster* Layer, Stack, Brick; stars or a list of SpatRasters.
- neighbourhood
The number of directions in which cell adjacencies are considered as neighbours: 4 (rook's case), 8 (queen's case) or a binary matrix where the ones define the neighbourhood. The default is 4.
- what
Which adjacencies to calculate: "full" for a full adjacency matrix, "like" for the diagonal, "unlike" for the off diagonal part of the matrix and "triangle" for a triangular matrix counting adjacencies only once.
- upper
Logical value indicating whether the upper triangle of the adjacency matrix should be returned (default FALSE).
Details
A fast implementation with Rcpp to calculate the adjacency matrix for raster. The adjacency matrix is most often used in landscape metrics to describe the configuration of landscapes, is it is a cellwise count of edges between classes.
The "full" adjacency matrix is double-count method, as it contains the pairwise counts of cells between all classes. The diagonal of this matrix contains the like adjacencies, a count for how many edges a shared in each class with the same class.
The "unlike" adjacencies are counting the cellwise edges between different classes.
Examples
landscape <- terra::rast(landscapemetrics::landscape)
# calculate full adjacency matrix
get_adjacencies(landscape, 4)
#> $layer_1
#> 1 2 3
#> 1 542 44 137
#> 2 44 696 159
#> 3 137 159 1562
#>
# equivalent with the terra package:
adjacencies <- terra::adjacent(landscape, 1:terra::ncell(landscape), "rook", pairs = TRUE)
table(terra::values(landscape, mat = FALSE)[adjacencies[,1]],
terra::values(landscape, mat = FALSE)[adjacencies[,2]])
#>
#> 1 2 3
#> 1 542 44 137
#> 2 44 696 159
#> 3 137 159 1562
# count diagonal neighbour adjacencies
diagonal_matrix <- matrix(c(1, NA, 1,
NA, 0, NA,
1, NA, 1), 3, 3, byrow = TRUE)
get_adjacencies(landscape, diagonal_matrix)
#> $layer_1
#> 1 2 3
#> 1 486 56 169
#> 2 56 592 215
#> 3 169 215 1406
#>