# NOT RUN {
# More examples might be avaible in the official lidR vignettes or
# on the github book <https://jean-romain.github.io/lidRbook/>
## =========================================================================
## Example 1: detect all the tree tops over an entire catalog
## (this is basically a reproduction of the existing lidR function 'tree_detection')
## =========================================================================
# 1. Build the user-defined function that analyzes each chunk of the catalog.
# The function's first argument is a LAScluster object. The other arguments can be freely
# choosen by the user.
my_tree_detection_method <- function(cluster, ws)
{
# The cluster argument is a LAScluster object. The user does not need to know how it works.
# readLAS will load the region of interest (chunk) with a buffer around it, taking advantage of
# point cloud indexation if possible. The filter and select options are propagated automatically
las <- readLAS(cluster)
if (is.empty(las)) return(NULL)
# Find the tree tops using a user-developed method (here simply a LMF).
ttops <- find_trees(las, lmf(ws))
# ttops is a SpatialPointsDataFrame that contains the tree tops in our region of interest
# plus the trees tops in the buffered area. We need to remove the buffer otherwise we will get
# some trees more than once.
bbox <- raster::extent(cluster)
ttops <- raster::crop(ttops, bbox)
return(ttops)
}
# 2. Build a project (here, a single file catalog for the purposes of this dummmy example).
LASfile <- system.file("extdata", "MixedConifer.laz", package="lidR")
prj <- readLAScatalog(LASfile)
plot(prj)
# 3. Set some processing options.
# For this dummy example, the chunk size is 100 m and the buffer is 10 m
opt_chunk_buffer(prj) <- 10
opt_chunk_size(prj) <- 100 # small because this is a dummy example.
opt_chunk_alignment(prj) <- c(-50, -35) # Align such as it creates 2 chunks only.
opt_select(prj) <- "xyz" # Read only the coordinates.
opt_filter(prj) <- "-keep_first" # Read only first returns.
# 4. Apply a user-defined function to take advantage of the internal engine
opt <- list(need_buffer = TRUE, # catalog_apply will throw an error if buffer = 0
automerge = TRUE) # catalog_apply will merge the outputs into a single object
output <- catalog_apply(prj, my_tree_detection_method, ws = 5, .options = opt)
spplot(output)
# }
# NOT RUN {
## ===================================================
## Example 2: compute a rumple index on surface points
## ===================================================
rumple_index_surface = function(cluster, res)
{
las = readLAS(cluster)
if (is.empty(las)) return(NULL)
las <- filter_surfacepoints(las, 1)
rumple <- grid_metrics(las, ~rumple_index(X,Y,Z), res)
bbox <- raster::extent(cluster)
rumple <- raster::crop(rumple, bbox)
return(rumple)
}
LASfile <- system.file("extdata", "Megaplot.laz", package="lidR")
prj <- readLAScatalog(LASfile)
opt_chunk_buffer(prj) <- 1
opt_chunk_size(prj) <- 140 # small because this is a dummy example.
opt_select(prj) <- "xyz" # read only the coordinates.
opt <- list(raster_alignment = 20, # catalog_apply will adjust the chunks if required
automerge = TRUE) # catalog_apply will merge the outputs into a single raster
output <- catalog_apply(prj, rumple_index_surface, res = 20, .options = opt)
plot(output, col = height.colors(50))
# }
Run the code above in your browser using DataLab