library(lidR)
library(terra)
library(here)Tree detection
Tree detection
Goal is to detect tree tops using a variable window size and using the ndom raster in the BI plots in Solling 2023.
Load ndom previously clipped to BI plots in Solling (BI 2023)
ndom_bi <- rast(here("R_session", "data", "ndom_bi_plots_solling_2023.tif"))
mapview(ndom_bi)Make tiles because data too big for R
tiles <- makeTiles(x=ndom_bi, 
          y=c(3000,3000),
          filename=
            here("R_session", "output","tiles","ndom_bi_.tif"), 
          na.rm=TRUE)
# In case the tiles are already there
tiles <-list.files(here("R_session", "output","tiles"), pattern='*\\.tif', recursive=TRUE, full.names=TRUE)Tree detection function with variable window size. Any points below 2 m will equate to a window size of 3 m, while points above 20 meters equate to a window size of 5 m. Anything between 2 and 20 meter will have a non-linear relationship.
f <- function(x) {
  y <- 2.6 * (-(exp(-0.08*(x-2)) - 1)) + 3 
  # from https://r-lidar.github.io/lidRbook/itd.html
  y[x < 2] <- 3
  y[x > 20] <- 5
  return(y)
}
heights <- seq(-5,30,0.5)
ws <- f(heights)
plot(heights, ws, type = "l",  ylim = c(0,5))Tree detection using function for variable window size
out <- sapply(tiles, \(tile) {
        x <- rast(tile)
        ttops <- lidR::locate_trees(x, lidR::lmf(f))
        vect(ttops)
    })
out <- vect(out)Save tree tops
writeVector(out, here("R_session", "output","ttops_ndom_.gpkg"), overwrite=TRUE)