Extract values from one or more raster layers at species occurrence or community points. Returns a data frame.
extract_raster_at_points <- function(pts, rasters, buffer = NULL) {
if (!requireNamespace("terra", quietly = TRUE)) install.packages("terra")
if (!requireNamespace("sf", quietly = TRUE)) install.packages("sf")
library(terra); library(sf)
if (!inherits(pts, "sf")) {
pts <- st_as_sf(pts, coords = c("lon", "lat"), crs = 4326)
}
pts_v <- vect(pts)
if (!inherits(rasters, "SpatRaster"))
rasters <- rast(rasters)
if (!is.null(buffer)) {
vals <- terra::extract(rasters, pts_v, buffer = buffer, fun = mean, na.rm = TRUE)
} else {
vals <- terra::extract(rasters, pts_v)
}
cbind(as.data.frame(pts)[, 1, drop = FALSE], vals[, -1, drop = FALSE])
}