## ----setup, include = FALSE--------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 2.5, fig.height = 2.5, dev.args = list(pointsize = 9) ) knitr::knit_hooks$set(time_it = local({ now <- NULL function(before, options) { if (before) { # record the current time before each chunk now <<- Sys.time() } else { # calculate the time difference after a chunk res <- difftime(Sys.time(), now) # return a character string to show the time #if (res > 0.1) #paste("
========================
Time for this code chunk ", options$label, " to run:", round(res,2), "
========================
") } } })) knitr::opts_chunk$set(time_it = TRUE) #rgl::setupKnitr() options(rmarkdown.html_vignette.check_title = FALSE) library(lidR) ## ----data, echo = FALSE------------------------------------------------------- data = structure(list(Max.X = c(332099.99, 333600, 335099.99, 336217.52, 332099.99, 333599.99, 335099.99, 336368.67, 332099.99, 333599.99, 335100, 336217.52), Min.X = c(331016.91, 332100.01, 333600.01, 335100, 331016.91, 332100, 333600, 335100, 331016.92, 332100.01, 333600.01, 335100.01), Max.Y = c(5529993.99, 5529993.99, 5529993.99, 5529993.99, 5528399.99, 5528399.99, 5528399.99, 5528399.99, 5526399.98, 5526399.96, 5526399.99, 5526399.99), Min.Y = c(5528400, 5528400, 5528400, 5528400, 5526400, 5526400, 5526400, 5526400, 5524793.5, 5524793.5, 5524800.38, 5524793.5), Max.Z = c(53.53, 47.59, 48.66, 49.36, 46.13, 48.16, 50.51, 50.86, 45, 74.18, 52.56, 49.33), Min.Z = c(-15.95, -7.87, -3.55, -14.96, -5.94, -11.15, -5.11, -4.12, -9.63, -8.27, -35.88, -20.59), filename = c("folder/file1.las", "folder/file2.las", "folder/file3.las", "folder/file4.las", "folder/file5.las", "folder/file6.las", "folder/file7.las", "folder/file8.las", "folder/file9.las", "folder/file10.las", "folder/file11.las", "folder/file12.las")), row.names = c(NA, -12L), class = "data.frame") geom <- lapply(1:nrow(data), function(i) { mtx <- matrix(c(data$Min.X[i], data$Max.X[i], data$Min.Y[i], data$Max.Y[i])[c(1, 1, 2, 2, 1, 3, 4, 4, 3, 3)], ncol = 2) sf::st_polygon(list(mtx)) }) geom <-sf::st_sfc(geom) sf::st_crs(geom) <- 26917 data <- sf::st_set_geometry(data, geom) ctg <- new("LAScatalog") ctg@data <- data ## ----setbuffer2, echo = FALSE------------------------------------------------- opt_chunk_buffer(ctg) <- 0 ## ----plotctg, fig.show='hold'------------------------------------------------- opt_chunk_size(ctg) <- 0 # Processing by files plot(ctg, chunk = TRUE) opt_chunk_size(ctg) <- 1000 # Processing chunks of 1000 x 1000 plot(ctg, chunk = TRUE) ## ----setbuffer1, echo = FALSE------------------------------------------------- opt_chunk_size(ctg) <- 0 ## ----plotbuffer, fig.show='hold'---------------------------------------------- opt_chunk_buffer(ctg) <- 0 # No buffer plot(ctg, chunk = TRUE) opt_chunk_buffer(ctg) <- 200 # 200 m buffer plot(ctg, chunk = TRUE) ## ----dtmnobuffer, error=TRUE-------------------------------------------------- try({ opt_chunk_buffer(ctg) <- 0 rasterize_terrain(ctg, 1, tin()) }) ## ----alignment, fig.show='hold'----------------------------------------------- opt_chunk_size(ctg) <- 2000 opt_chunk_buffer(ctg) <- 0 plot(ctg, chunk = TRUE) opt_chunk_size(ctg) <- 2000 opt_chunk_buffer(ctg) <- 0 opt_chunk_alignment(ctg) <- c(1000, 1000) plot(ctg, chunk = TRUE) ## ----void, echo = FALSE, rgl=TRUE, dev='png'---------------------------------- #LASfile <- system.file("extdata", "Topography.laz", package="lidR") #ctg = readLAScatalog(LASfile) #opt_progress(ctg) <- FALSE #opt_filter(ctg) <- "-keep_class 2 9" #las = clip_circle(ctg, 273500, 5274500, 40) #m = structure(c(0.921, -0.146, 0.362, 0, 0.386, 0.482, -0.787, 0, #-0.06, 0.864, 0.5, 0, 0, 0, 0, 1), .Dim = c(4L, 4L)) #plot(las) #rgl::view3d(fov = 50, userMatrix = m) ## ----writeondisk, echo = FALSE, eval = FALSE---------------------------------- # LASfile <- system.file("extdata", "MixedConifer.laz", package="lidR") # ctg2 <- readLAScatalog(LASfile) # opt_progress(ctg2) <- FALSE # opt_chunk_size(ctg2) <- 100 ## ----template, eval = FALSE--------------------------------------------------- # # Force the results to be written on disk # opt_output_files(ctg2) <- paste0(tempdir(), "/tree_coordinate_{XLEFT}_{YBOTTOM}") # trees <- locate_trees(ctg2, lmf(3)) # # # The output has been modified by these options and it now gives # # the paths to the written files (here shapefiles) # trees # #> "/tmp/RtmpJQHPNz/tree_coordinate_481200_3812900.shp" "/tmp/RtmpJQHPNz/tree_coordinate_481300_3812900.shp" "/tmp/RtmpJQHPNz/tree_coordinate_481200_3813000.shp" # #> [4] "/tmp/RtmpJQHPNz/tree_coordinate_481300_3813000.shp" ## ----writechm, eval = FALSE--------------------------------------------------- # # Force the results to be written on disk # opt_output_files(ctg2) <- paste0(tempdir(), "/tree_coordinate_{XLEFT}_{YBOTTOM}") # chm <- rasterize_canopy(ctg2, 1, p2r()) # # # Many rasters have been written on disk # # but a light raster has been returned anyway # chm # #> class : RasterLayer # #> dimensions : 90, 90, 8100 (nrow, ncol, ncell) # #> resolution : 1, 1 (x, y) # #> extent : 481260, 481350, 3812921, 3813011 (xmin, xmax, ymin, ymax) # #> crs : +proj=utm +zone=12 +datum=NAD83 +units=m +no_defs # #> source : /tmp/RtmpZVJ2hy/rasterize_canopy.vrt # #> names : tree_coordinate_481260_3812921 # #> values : 0, 32.07 (min, max) ## ----clip, fig.show='hold', eval=FALSE---------------------------------------- # opt_output_files(ctg2) <- "{tempdir()}/plot_{ID}" # new_ctg <- clip_circle(ctg2, x, y, 20) # new_ctg # #> class : LAScatalog (v1.2 format 0) # #> extent : 32.372, 163.136, 38.494, 198.636 (xmin, xmax, ymin, ymax) # #> coord. ref. : NAD83 / UTM zone 17N # #> area : 3895.031 m² # #> points : 44 points # #> density : 8 points/m² # #> num. files : 4 ## ----echo=FALSE--------------------------------------------------------------- opt_chunk_size(ctg) <- 0 opt_output_files(ctg) <- "" opt_wall_to_wall(ctg) <- FALSE opt_progress(ctg) <- TRUE cl <- engine_chunks(ctg) for (i in 1:5){ bbox <- cl[[i]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "green3") } bbox <- cl[[6]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "cornflowerblue") ## ----echo=FALSE--------------------------------------------------------------- opt_chunk_size(ctg) <- 0 opt_output_files(ctg) <- "" opt_wall_to_wall(ctg) <- FALSE opt_progress(ctg) <- TRUE cl <- engine_chunks(ctg) for (i in 1:6){ bbox <- cl[[i]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "green3") } bbox <- cl[[7]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "orange") bbox <- cl[[8]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "cornflowerblue") ## ----echo=FALSE--------------------------------------------------------------- opt_chunk_size(ctg) <- 0 opt_output_files(ctg) <- "" opt_wall_to_wall(ctg) <- FALSE opt_progress(ctg) <- TRUE cl <- engine_chunks(ctg) for (i in 1:8){ bbox <- cl[[i]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "green3") } bbox <- cl[[7]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "orange") bbox <- cl[[9]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "red") ## ----echo=FALSE--------------------------------------------------------------- opt_chunk_size(ctg) <- 0 opt_output_files(ctg) <- "" opt_wall_to_wall(ctg) <- FALSE opt_progress(ctg) <- TRUE opt_restart(ctg) <- 9 cl <- engine_chunks(ctg) for (i in 1:4){ bbox <- cl[[i]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "green3") } ## ----echo=FALSE--------------------------------------------------------------- opt_chunk_size(ctg) <- 0 opt_output_files(ctg) <- "" opt_wall_to_wall(ctg) <- FALSE opt_progress(ctg) <- TRUE opt_restart(ctg) <- 1 cl <- engine_chunks(ctg) for (i in 1:length(cl)){ bbox <- cl[[i]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "green3") } bbox <- cl[[7]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "orange") bbox <- cl[[9]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "red") ## ----echo=FALSE--------------------------------------------------------------- opt_chunk_size(ctg) <- 400 opt_output_files(ctg) <- "" opt_wall_to_wall(ctg) <- FALSE opt_progress(ctg) <- TRUE cl <- engine_chunks(ctg) for (i in 1:50){ bbox <- cl[[i]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "green3") } bbox <- cl[[1]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "gray") bbox <- cl[[2]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "gray") bbox <- cl[[3]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "gray") bbox <- cl[[14]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "gray") bbox <- cl[[15]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "gray") bbox <- cl[[16]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "gray") bbox <- cl[[29]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "gray") ## ----echo=FALSE--------------------------------------------------------------- opt_chunk_size(ctg) <- 0 opt_output_files(ctg) <- "" opt_wall_to_wall(ctg) <- FALSE opt_progress(ctg) <- TRUE cl <- engine_chunks(ctg) for (i in 1:6) { bbox <- cl[[i]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "green3") } for (i in 7:11) { bbox <- cl[[i]]@bbox graphics::rect(bbox[1], bbox[2], bbox[3], bbox[4], border = "black", col = "cornflowerblue") } ## ----------------------------------------------------------------------------- ctg$processed <- FALSE ctg$processed[6:7] <- TRUE plot(ctg) ## ----echo = FALSE------------------------------------------------------------- opt_wall_to_wall(ctg) <- TRUE opt_progress(ctg) <- FALSE ## ----error = TRUE------------------------------------------------------------- try({ routine <- function(chunk){ las <- readLAS(chunk) } catalog_apply(ctg, routine) }) ## ----getachunk, eval=FALSE,echo=FALSE,warning=FALSE,message=FALSE,error=FALSE,results='hide',fig.keep='none'---- # LASfile <- system.file("extdata", "Megaplot.laz", package="lidR") # test = readLAScatalog(LASfile) # # opt_chunk_size(test) <- 150 # opt_chunk_alignment(test) <- c(50,10) # opt_progress(ctg) <- FALSE # chunks = engine_chunks(test) # chunk = chunks[[5]] ## ----rglbuffer, rgl = TRUE, eval = FALSE-------------------------------------- # las <- readLAS(chunk) # plot(las, color = "buffer") ## ----eval = FALSE------------------------------------------------------------- # print(chunk) # #> class : LAScluster # #> features : 1 # #> extent : 684800, 684950, 5017810, 5017960 (xmin, xmax, ymin, ymax) # #> crs : +proj=utm +zone=17 +datum=NAD83 +units=m +no_defs ## ----warning = FALSE, eval = FALSE-------------------------------------------- # raster::extent(chunk) # #> class : Extent # #> xmin : 684800 # #> xmax : 684950 # #> ymin : 5017810 # #> ymax : 5017960 # sf::st_bbox(chunk) # #> xmin ymin xmax ymax # #> 684800 5017810 684950 5017960 ## ----bufferror, error = TRUE-------------------------------------------------- try({ opt_chunk_buffer(ctg) <- 0 rasterize_terrain(ctg, 1, tin()) }) ## ----routineerror, error = TRUE----------------------------------------------- try({ routine <- function(chunk){ las <- readLAS(chunk) if (is.empty(las)) return(NULL) } options = list(need_buffer = TRUE) catalog_apply(ctg, routine, .options = options) }) ## ----preparectg, echo=FALSE,warning=FALSE,message=FALSE,error=FALSE,results='hide',fig.keep='none'---- LASfile <- system.file("extdata", "MixedConifer.laz", package="lidR") ctg = readLAScatalog(LASfile) opt_chunk_buffer(ctg) <- 10 opt_chunk_size(ctg) <- 100 opt_chunk_alignment(ctg) <- c(50,50) opt_progress(ctg) <- FALSE ## ----applyroutine, eval = FALSE----------------------------------------------- # routine <- function(chunk){ # las <- readLAS(chunk) # read the chunk # if (is.empty(las)) return(NULL) # exit if empty # ttop <- locate_trees(las, lmf(3)) # make any computation # ttop <- sf::st_crop(ttop, st_bbox(chunk)) # remove the buffer # return(ttop) # } # # out <- catalog_apply(ctg, routine) # class(out) # #> [1] "list" # print(out[[1]]) # #> Simple feature collection with 178 features and 2 fields # #> Attribute-geometry relationship: 2 constant, 0 aggregate, 0 identity # #> Geometry type: POINT # #> Dimension: XYZ # #> Bounding box: xmin: 481260.8 ymin: 3812980 xmax: 483299.6 ymax: 3816011 # #> Projected CRS: NAD83 / UTM zone 12N ## ----eval = FALSE------------------------------------------------------------- # out <- do.call(rbind, out) # print(out) # #> Simple feature collection with 17865 features and 2 fields # #> Attribute-geometry relationship: 2 constant, 0 aggregate, 0 identity # #> Geometry type: POINT # #> Dimension: XYZ # #> Bounding box: xmin: 481260.8 ymin: 3812980 xmax: 483299.6 ymax: 3816011 # #> Projected CRS: NAD83 / UTM zone 12N ## ----automerge, eval = FALSE-------------------------------------------------- # options <- list(automerge = TRUE) # out <- catalog_apply(ctg, routine, .options = options) # print(out) # #> Simple feature collection with 17865 features and 2 fields # #> Attribute-geometry relationship: 2 constant, 0 aggregate, 0 identity # #> Geometry type: POINT # #> Dimension: XYZ # #> Bounding box: xmin: 481260.8 ymin: 3812980 xmax: 483299.6 ymax: 3816011 # #> Projected CRS: NAD83 / UTM zone 12N