Detect patches (clumps). Patches are groups of cells that are surrounded by cells that are NA. Set zeroAsNA to TRUE to also identify patches separated by cells with values of zero.
directions: integer indicating which cells are considered adjacent. Should be 8 (Queen's case) or 4 (Rook's case)
values: logical. If TRUE use cell values to distinguish patches. If FALSE, all cells that are not NA are considered identical
zeroAsNA: logical. If TRUE treat cells that are zero as if they were NA. Ignored if byvalue=TRUE
allowGaps: logical. If TRUE there may be gaps in the patch IDs (e.g. you may have patch IDs 1, 2, 3 and 5, but not 4). If it is FALSE, these numbers will be recoded from 1 to the number of patches (4 in this example)
filename: character. Output filename
...: options for writing files as in writeRaster
Returns
SpatRaster. Cell values are patch numbers
See Also
focal, boundaries
Examples
r <- rast(nrows=18, ncols=36, xmin=0)r[1:2,5:8]<-1r[5:8,2:6]<-1r[7:12,22:36]<-1r[15:16,18:29]<-1p <- patches(r)# zero as background instead of NAr <- rast(nrows=10, ncols=10, xmin=0, vals=0)r[3,3]<-10r[4,4]<-10r[5,5:8]<-12r[6,6:9]<-12# treat zeros as NAp4 <- patches(r, zeroAsNA=TRUE)p8 <- patches(r,8, zeroAsNA=TRUE)### patches for different valuesp <- patches(r, values=TRUE)### patch ID values are not guaranteed to be consecutiver <- rast(nrows=5, ncols=10, xmin=0)set.seed(0)values(r)<- round(runif(ncell(r))*0.7)rp <- patches(r, directions=8, zeroAsNA=TRUE)plot(rp, type="classes"); text(rp)## unless you set allowGaps=FALSErp <- patches(r, directions=8, zeroAsNA=TRUE, allowGaps=FALSE)plot(rp, type="classes"); text(rp)### use zonal to remove small patches f <- system.file("ex/elev.tif", package="terra")r <- rast(f)x <- classify(r, cbind(-Inf,400,NA))y <- patches(x)# remove patches smaller than 100 harz <- zonal(cellSize(y, unit="ha"), y, sum, as.raster=TRUE)s <- ifel(rz <250,NA, y)