Releases: r-lidar/lidR
v4.0.3
v4.0.2
lidR v4.0.2 (Release date: 2022-11-28)
- Fix: #638.
unormalize_height()
removes extra_bytes in VLR. - Fix: #637.
print(las)
works even when the CRS is not recognized bysf
. - New:
dsmtin
andpitfree
gain an argumenthighest
. This option was enabled by default in previous releases. There is now an option to disable it. - Fix: #580 and #622
normalize_height()
andsegment_trees
work in parallel withSpatRaster
. - Fix: #586.
- Fix: #587.
crown_metrics()
now triggers a warning when invalid geometries are created anddelineate_crowns()
remove these geometries before to convert tosp
. - Fix: #594.
crown_metrics()
now works withfunc = NULL
and aLAScatalog
. - Fix: #608. The C++ function used to compute the range between a point and the sensor from the sensor positions was re-based to resolve a bug when a single sensor position was found for a given flightline. New warnings were added.
- Fix: #609.
*_metrics()
functions always returnedNA
s forlastofmany
. - Fix: #614. Manual tree detection preserves the CRS.
- Doc:
dalponte2016
doc updated to useterra
.
v4.0.1
lidR v4.0.1 (Release date: 2022-05-03)
- Fix:
plot(ctg, chunk = TRUE)
does not fail if an invalid output file template is registered #537 - Enhance:
locate_trees()
throws an informative error if called with an on-disk raster. The former error was cryptic. If the raster is small enough it is loaded on-the-fly. - Fix:
merge_spatial()
with RGB andSpatRaster
was not working properly #545 - Enhance:
st_area()
better estimates the area of small point-clouds and is faster - Fix: #548
- Enhance: Scale factors are better estimated in
interpret_waveform
#549. - Fix:
plot_metrics()
returns NA if 0 points available #551. - Fix: floating point accuracy error with
rasterize_canopy
may generate error or messed-up CHM #552. - Fix:
print()
andst_area()
were not working for point cloud with no CRS - Fix:
track_sensor()
does not fail with aLAScatalog
when no sensor position is found. It also triggers a warning. #556. - Fix: The LAScatalog processing engine works with a single file #558.
- Fix:
rasterize_terrain()
now works with aLAScatalog
andshape = sfc_object
#558. - Fix:
catalog_retile()
now works when some tiles are empty #563. - Fix:
crown_metrics()
messed up tree IDs with a hull geometry #554. - Fix:
merge_spatial()
crops large vectors to the extent of the point cloud before to perform the merge. This has for consequences to sometime transform polygons into multipolygons. When polygons and multipolygons were mixed the functions stopped with an error. It now works. - Fix:
normalize_height()
now sets the Z offset to 0 #571. - Fix: smaller rasters stored on-disk are better handled and loaded if needed
Changes related to rlas 1.6.0
We are currently developing rlas 1.6.0 that uses the ALTREP framework to load compact representation of non populated attributes. For example UserData
is usually populated with zeros (not populated). Yet it takes 32 bits per point to store each 0. With rlas 1.6.0 it will only uses 644 bits no matter the number of points loaded for non populated attributes. This applies to each attribute populated with a single repeated value. This allows for saving approximately 30% of memory usage depending on the number of non-populated attributes that are present in the file. rlas 1.6.0 is compatible will all versions of lidR but lidR 4.0.1 introduced some internal optimization, internal fixes and new functions to fully take advantage of rlas 1.6.0. lidR v<= 4.0.0 will work with rlas 1.6.0 but won't take advantage of the new compression feature.
-
the function
LAS()
no longer calldata.table::setDT()
if the input is already adata.table
. Indeeddata.table::setDT()
materializes the compressed ALTREP vectors and this is not what we want. One consequence of this change is thatreadLAS()
now preserve the ALTREPness (i.e. the compression) of the output ofrlas::read.las()
. -
Subsetting a
LAS
object no longer calldata.table
native subset. We previously used something likelas@data[indx]
to subset the point cloud. Sadlydata.table
tries to materialized the ALTREPed vector whenever it can. We implemented internally asmart_subset()
function that subset and preserves the compression of the vectors. One consequence of such change is that allfilter_*()
andclip_*()
functions preserve the compression of the point-cloud if any. -
las_check()
has been slightly modified to ensure it does not materialize ALTREPed object. One side effect oflas_check()
was to decompress the point cloud unexpectedly. Such a pity! We also changelas_check()
to print information about the compression. -
We changed the way
*_metrics()
functions evaluates the user defined expression because we found that it had the side effect of materializing all the attributes instead of materializing only those needed. For examplepixel_metrics(las, mean(Z))
only needs the attribute Z. No need to allocate and copy memory forIntensity
,ScanAngle
and so on. In previous version all attributes where inspected with the side effect to materialize all compressed vectors. The*_metrics()
functions now properly detect which attributes are actually necessary for the evaluation offunc
. Two consequences: (1)*_metrics()
functions are 20 to 40% faster, (2) the compression is preserved if no compressed attribute is used in the evaluation and e.g.pixel_metrics(las, mean(UserData))
uncompresses onlyUserData
. -
New functions
las_is_compressed()
that tells which attributes are compressed andlas_size()
that returns the true size of aLAS
objects taking into account the compression.las_size()
should returns something similar topryr::object_size()
but different toobject.size()
that is not ALTREP aware. We also changed theprint
function so it useslas_size()
instead ofobject.size()
.
On overall lidR's functions are expected to almost never decompress a LAS object. However other R packages and R functions may do it. For example data.table::print
do materializes the ALTREP vectors. base::range()
too but not base::mean()
or base::var()
.
las@data # Full decompression (print data.table)
range(las$Userdata) # Decompression of UserData
las@data[2, UserData := 1] # Decompression of UserData
las@data[1:10] # Full decompression
v4.0.0
lidR v4.0.0 (Release date: 2022-02-17)
rgdal
and rgeos
will be retired on Jan 1st 2024. see twitter, youtube, or see the respective package descriptions on CRAN. Packages raster
and sp
are based on rgdal
/rgeos
and lidR
was based on raster
and sp
because it was created before sf
, terra
and stars
. This means that sooner or later lidR
will run into trouble (actually it is more or less already the case). Consequently, we modernized lidR
by moving to sf
, terra
/stars
and we are no longer depending on sp
and raster
(see also Older R Spatial Package for more insight). It is time for everybody to stop using sp
and raster
and to embrace sf
and stars/terra
.
In version 4 lidR
now no longer uses sp
, it uses sf
and it no longer uses raster
. It is now raster agnostic and works transparently with rasters from raster
, terra
and stars
. These two changes meant we had to rewrite a large portion of the code base, which implies few backward incompatibilities. The backward incompatibilities are very small compared to the huge internal changes we implemented in the foundations of the code and should not even be visible for most users.
Backward inconpatibilites
-
lidR
no longer loadsraster
andsp
. To manipulateRaster*
andSpatial*
objects returned by lidR users need to loadsp
andraster
with:library(sp) library(raster) library(lidR)
-
The formal class
LAS
no longer inherits the classSpatial
fromsp
. It means, among other things, that aLAS
object no longer has a slot@proj4string
with aCRS
fromsp
, or a slot@bbox
. The CRS is now stored in the slot@crs
in acrs
object fromsf
. Former functionscrs()
andprojection()
inherited fromraster
are backward compatible and return aCRS
or aproj4string
fromsp
. However code that accesses these slots manually are no longer valid (but nobody was supposed to do that anyway because it was the purpose of the functionprojection()
):las@proj4string # No longer works las@bbox # No longer works inherits(las, "Spatial") # Now returns FALSE
-
The formal class
LAScatalog
no longer inherits the classSpatialPolygonDataFrame
fromsp
. It means, among other things, that aLAScatalog
object no longer has a slot@proj4string
, or@bbox
, or@polygons
. The slot@data
is preserved and contains ansf,data.frame
instead of adata.frame
allowing backward compatibility of data access to be maintained. The syntaxctg$attribute
is the way to access data, but statement likectg@data$attribute
are backward compatible. However, code that accesses other slots manually is no longer valid, like for theLAS
class:ctg@proj4string # No longer works ctg@bbox # No longer works ctg@polygons # No longer works inherits(ctg, "Spatial") # Now returns FALSE
-
sp::spplot()
no longer works on aLAScatalog
because aLAScatalog
is no longer aSpatialPolygonDataFrame
spplot(ctg, "Max.Z") # becomes plot(ctg["Max.Z"])
-
raster::projection()
no longer works onLAS*
objects because they no longer inheritSpatial
. Moreover,lidR
no longerDepends
onraster
which means thatraster::projection()
andlidR::projection
can mask each other. Users should usest_crs()
preferentially. To useprojection
users can either loadraster
beforelidR
or calllidR::projection()
with the explicit namespace.library(lidR) projection(las) # works library(raster) projection(las) # no longer works
-
Serialized
LAS/LAScatalog
objects (i.e. stored in.rds
or.Rdata
files) saved withlidR v3.x.y
are no longer compatible withlidR v4.x.y
. Indeed, the structure of aLAS/LAScatalog
object is now different mainly because the slot@crs
replaces the slot@proj4string
. Users may get errors when using e.g.readRDS(las.rds)
to load back an R object. However we put safeguards in place so, in practice, it should be backward compatible transparently, and even repaired automatically in some circumstances. Consequently we are not sure it is a backward incompatibility because we handled and fixed all warnings and errors we found. In the worst case it is possible to repair aLAS
object v3 with:las <- LAS(las)
-
track_sensor()
is not backward compatible because it is a very specific function used by probably just 10 people in the world. We chose not to rename it. It now returns ansf
object instead of aSpatialPointsDataFrame
.
New modern functions
Former functions that return Spatial*
objects from package sp
should no longer be used. It is time for everybody to embrace sf
. However, these functions are still in lidR
for backward compatibility. They won't be removed except if package sp
is removed from CRAN. It might happen on Jan 1st 2024, it might happen later. We do not know. New functions return sf
or sfc
objects. Old functions are not documented so new users won't be able to use them.
tree_metrics()
anddelineate_crowns()
are replaced by a single functioncrown_metrics()
that has the same functionality, and more.find_trees()
is replaced bylocate_trees()
.
Older functions that return Raster*
objects from the raster
package should no longer be used. It is time for everybody to embrace terra/stars
. However, these functions are still in lidR
for backward compatibility. They won't be removed except if package raster
is removed from CRAN. New functions return either a Raster*
, a SpatRaster
, or a stars
object, according to user preference.
grid_metrics()
is replaced bypixel_metrics()
grid_terrain()
,grid_canopy()
,grid_density()
are replaced byrasterize_terrain()
,rasterize_canopy()
,rasterize_density()
New features
New functions are mostly convenient features that simplify some workflow aspects without introducing a lot of brand new functionality that did not already exist in lidR
v3.
-
New geometry functions
st_convex_hull()
andst_concave_hull()
that returnsfc
-
New modern functions
st_area()
,st_bbox()
,st_transform()
andst_crs()
inherited fromsf
forLAS*
objects. -
New convenient functions
nrow()
,ncol()
,dim()
,names()
inherited frombase
forLAS*
objects -
New operators
$
,[[
,$<-
and[[<-
onLASheader
. The following are now valid statements:header[["Version Major"]] header[["Z scale factor"]] <- 0.001
-
Operators
$
,[[
,$<-
and[[<-
onLAS
can now access theLASheader
metadata. The following are now valid statements:las[["Version Major"]] las[["Z scale factor"]] <- 0.001
-
RStudio now supports auto completion for operator
$
inLAS
objects. Yay! -
New functions
template_metrics()
,hexagon_metrics()
,polygon_metrics()
that extend the concept of metrics further to any kind of template. -
Functions that used to accept spatial vector or spatial raster as input now consistently accept any of
Spatial*
,sf
,sfc
,Raster*
,SpatRaster
andstars
objects. This includemerge_spatial()
,normalize_intensity()
,normalize_height()
,rasterize_*()
,segment_trees()
,plot_dtm3d()
and several others. We plan to supportSpatVector
in future releases. -
Every function that supports a raster as input now accept an "on-disk" raster from
raster
,terra
andstars
i.e. a raster not loaded in memory. This includes rasterization functions, individual tree segmentation functions,merge_spatial
and others, in particularplot_dtm3d()
andadd_dtm3d()
that now downsample on-disk rasters on-the-fly to display very large DTMs. On-disk rasters were already generally supported in previous versions but not every function was properly optimized to handle such objects. -
All the functions that return a raster (
pixel_metrics()
andrasterize_*()
) are raster agnostic and can return rasters fromraster
,terra
orstars
. They have an argumentpkg = "raster|terra|stars"
to choose. The default isterra
but this can be changed globally using:options(lidR.raster.default = "stars")
-
New function
catalog_map()
that simplifiescatalog_apply()
to a large degree. Yet it is not as versatile ascatalog_apply()
but well suits around 80% of use cases. Applying a user-defined function to a collection of LAS files is now as simple as:my_fun <- function(las, ...) { # do something with the point cloud return(something) } res <- catalog_map(ctg, my_fun, param1 = 2, param2 = 5)
-
Operator
[
onLAS
object has been overloaded to clip a point-cloud using abbox
or asfc
sub <- las[sfc]
-
rasterize_terrain()
accepts ansfc
as argument to force interpolation within a defined area. -
normalize_height()
now always interpolates all points. It is no longer possible to get an error that some points cannot be interpolated. The problem of interpolating the DTM where there is no data is still present but we opted for a nearest neighbour approach with a warning instead of a failure. This prevents the method from failing after hours of computation for special cases somewhere in the file collection. This also means we removed thena.rm
option that is no longer relevant. -
New functions
header()
,payload()
,phb()
,vlr()
,evlr()
to get the corresponding data from aLAS
object. -
New algorithm
shp_hline
andshp_vline
forsegment_shapes()
[#499](https://gith...
v3.2.2
lidR v3.2.2 (Release date: 2021-10-20)
- Enhance:
grid_*()
functions support aRasterLayer
smaller than the point cloud (#483) - Fix:
las_check()
with aLAScatalog
and withdeep = TRUE
failed with a output file template (#484). - Fix:
readLAS()
no longer reads LAS files on some Windows/Mac machine (#485). It seems it is an issue with CRAN binaries. By releasing 3.2.2 we hope to trigger a new build. - Enhance:
get_range()
and consequentlyrange_correction()
no longer throw high range error for highly variable range sensor like TLS (#490).
v3.2.0
lidR v3.2.0 (Release date: 2021-09-26)
ANNOUCEMENT
rgdal
and rgeos
will be retired on Jan 1st 2024. raster
and sp
are based on rgdal
/rgeos
. lidR
is based on raster
and sp
because it was created before sf
, terra
and stars
. This means that sooner or later lidR
will run into trouble (actually it has already started to be the case). So, it is time to fully embrace sf
, terra
/stars
and to leave sp
and raster
. This will require an in-depth rebase of lidR
. We have started the work and we plan to release lidR
4.0.0 that will no longer have any internal code that uses sp
and raster
. This version already no longer uses rgdal
. We hope make these changes with minimal breakage in backward compatibility by maintaining the conversion to sp
/raster
for functions from v < 4.0.0, but some backward incompatibilities will necessarily arise. In particular, LAS
will no longer inherit the sp::Spatial
class and will no longer contain a sp::CRS
but a sf::crs
and LAScatalog
will no longer be sp::SpatialPolygonDataFrame
. Our plan is (hopefully) to rebase lidR
in such a way that nobody will notice the changes expect users who dig a little deeper into the objects.
CHANGES
-
hexbin_metrics()
was an unused function and has been removed fromlidR
. It can be retrieved inlidRplugins
-
Functions using the former namespace such as
lassomething()
that were renamed intoverb_noun()
in version 3.0.0 now throw a warning. In v3.0.0 they were still usable for backward compatibility but not documented. In v3.1.0 they printed a message saying to move on to the new namespace. Now in 3.2.0 they throw a formal warning saying to move on to the new namespace. They will throw an error in the next version.
NEW FEATURES
-
classify_poi()
. New function capable of attributing a class of choice to any points that meet a logical criterion (e.g. Z > 2) and/or a spatial criterion (e.g. inside a polygon). For example, the following will attribute the class "high vegetation" to each non-ground point that is not in the lake polygon.las <- classify_poi(las, LASHIGHVEGETATION, poi = ~Classification != 2, roi = lakes, inverse = TRUE)
-
LAScatalog
- New function
rbind()
forLAScatalog
. - New functions
projection()<-
andcrs()<-
forLAScatalog
. Those two functions were already working in previous versions but in absence of dedicated functions in lidR the functions that were actually called wereraster::projection()
andraster::crs()
thanks to class inheritance. However the functions fromraster
do not supportcrs
fromsf
or numbers as input. Adding a dedicated function in lidR brings consistency betweenLAS
andLAScatalog
(#405):projection(ctg) <- st_crs(3625) # or projection(ctg) <- 3625
- The processing engine has a new option to drop some chunks under
ctg@chunk_options$drop
. This generates regions that won't be processed. This option accepts a vector of chunk IDs that are dropped and is thus versatile, but its main role is to allow restarting a computation that failed. We consequently introduced the functionopt_restart()
. Let's assume that the computation failed after few hours at 80% in chunk number 800. Users get a partial output for the first 799 chunks but chunk 800 has a problem that can be solved. It is now possible to restart at 800 and get the second part of the output without restarting from 0:output <- catlog_apply(ctg, myfun, param) # Failed after 80%, 'output' contains a partial output # Fix the trouble opt_restart(ctg) <- 800 output2 <- catlog_apply(ctg, myfun, param) # Merge 'output' and 'output2'
- The vignette
LAScatalog engine
and the manualLAScatalog-class
were updated to reflect these features
- New function
-
LASheader
- The function
LASheader()
can now create aLASheader
object from adata.frame
. This addition aims to facilitate the creation of validLAS
objects from external data. las_check()
can now check a standaloneLASheader
las_check(las@header)
- The function
-
LAS
- The function
LAS
now automatically fixes the font case of attributes names to match the naming convention of therlas
package. This simplifies the creation of compatible objects from non-LAS file sources.data <- data.frame(x = runif(10), Y = runif(10), z = runif(10), pointsourceid = 1:10) las <- LAS(data) #> Attribute 'x' renamed 'X' to match with default attribute names. #> Attribute 'z' renamed 'Z' to match with default attribute names. #> Attribute 'pointsourceid' renamed 'PointSourceID' to match with default attribute names. las$PointSourceID #> [1] 1 2 3 4 5 6 7 8 9 10
- The function
-
Full waveform: with most recent versions of the
rlas
package, full waveform (FWF) can be read andlidR
provides some compatible functions. However the support of FWF is still a work in progress in therlas
package. How it is read, interpreted and represented in R may change. Consequently, tools provided bylidR
may also change until the support of FWF becomes mature and stable inrlas
.- New function
interpret_waveform()
to transform waveform into a regular point cloud - New supported flag
W
for parameterselect
inreadLAS()
- New automatic colouring scheme for attribute
Amplitude
inplot(las, color = "Amplitude")
that aims to be used with FWF.
- New function
-
catalog_intersect()
now supportssf
,sfc
,Extent
andbbox
objects -
Concave hull: lidR now includes its own C++ code to compute concave hulls using concaveman-cpp.
- New function
concaveman()
to compute concave hulls delineate_crowns()
using concave hulls is now between 10 to 50 times faster.LASfile <- system.file("extdata", "MixedConifer.laz", package="lidR") las = readLAS(LASfile, select = "xyz0") concave_hulls <- delineate_crowns(las, "concave") # Before v3.2.0: 7.1 seconds # From v3.2.0 : 0.2 seconds
grid_terrain()
withis_concave = TRUE
should also be faster.
- New function
-
New function
catalog_boundary()
to compute the actual shape of the point-cloud -
In
find_trees()
andsegment_trees()
thebitmerge
strategy to generate robust unique IDs was not actually a valid and robust procedure. It had the advantage of generating integers but was not 100% unique. The probability to generate duplicates was low but we changed the strategy to use a true bit-merging procedure anyway. The new IDs thus generated are weird decimal number such as 5.001120e-310 but are guaranteed to be unique. The documentation has been updated to explain the method. -
New algorithm
random_per_voxel()
fordecimate_points
that keep n points per voxel (#406). -
3D rendering:
plot()
gains a new parametervoxels = TRUE
orvoxels = 0.5
to render a point cloud with voxels. This is useful to render the output ofvoxelize_points()
orvoxel_metrics()
, for example. This is computationally demanding and takes time so it should be reserved to small scenes with 30,000 or 40,000 voxels maximum, but note that there is no hard coded limit.vm <- voxel_metrics(las, ~list(N = length(Z)), 8) plot(vm, color = "V1", voxels = T)
- specular reflections are now disable in
plot()
.
-
New function
plot_metrics()
that wraps several other functions into one seamless function that extracts ground inventory plots, computes metrics for each plot and returns a ready to usedata.frame
for statistical modelling. -
New function
point_eigenvalue()
that is equivalent topoint_metrics(las, .stdshapemetrics)
but specialized, optimized and parallelized to be 10 times faster. -
grid_metrics()
gains a new parametersby_echo
allowing users to compute the metrics for different types of echos independently. It is now possible to map e.g.mean(Intensity)
for first returns only + multiple return only + single return only. All metrics are computed in a single run and returned in a raster stack. -
merge_spatial()
supportssfc
ENHANCEMENTS
grid_density()
is 10 times faster
FIXES
- Fix:
quantize()
now preservesNaN
values instead of converting them into minus infinity (#460). - Fix:
stdmetrics_i()
now fails with an informative message when the sum of intensities is greater than.Machine$integer.max
and becomesdouble
(#463) - Fix:
find_localmaxima()
respects thefilter
argument. It was previously not considered.
MISCELLANEOUS
- Remove
crayon
andhexbin
dependencies - Packages
RCSF
andrgeos
are now only suggested and they are consequently no longer installed by default with lidR - Change:
rgdal
will be retired in 2024. Code usingrgdal
internally has been removed. In many cases this will not change anything for users but in some cases it may fail when assigning an EPSG code to the LAS file. Also, old versions ofrgdal
built with old versions ofgdal
andproj
are no longer supported (#466)
v3.1.4
lidR v3.1.4 (Release date: 2021-06-22)
- Change:
manual()
now uses the middle button to perform the selection. Historically the button was "right" but later the right button was added in lidR and attributed to the dragging action. By using "right" in this function this disabled the possibility to drag the scene. Consequently we changed the default to use the middle button. (#442). - Change:
manual()
now removes all apices in the selection rectangle when removing some false positive (#445). - Doc: fix some code block rendering in
catalog_apply
man page - Fix: fix catalog processing engine edge case when the last chunks fail (#435).
- Fix:
voxel_metrics()
withall_voxels = TRUE
did not work as expected. The insertion of empty voxels corrupted some of the real voxels. This bug lead to invalid output and some floating points precision errors lead to supernumerary voxels (#437, #439). - Fix:
grid_terrain()
used with aLAScatalog
no longer propagated the options. For example when usinguse_class = c(2L, 8L, 9L, 10L)
this was not propagated and the option was actually the default one i.e.use_class = c(2L, 9L)
. This bug was introduced in 3.1.0 - Fix:
delineate_crowns()
now returnsNULL
if the input point-cloud has only points with treeID = NA. It also triggers a warning. (#438). - Fix:
manual()
the function that allow for finding the trees manually was no longer working probably because of some slight modifications in thergl
package. - Enhance: the
plot
function used to display the output ofvoxel_metrics()
now internally uses the same function thanLAS
objects. This enhances the rendering using theclear_artifact
option by default and allows for a lot more flexibility in the rendering. - Enhance: new parameter
button
inmanual()
to choose which button to use. - Enhance:
segment_trees()
now print a message if all points areNA
to suggest to use other parameters
v3.1.3
lidR v3.1.3 (Release date: 2021-05-20)
- Fix:
las_check(..., deep = TRUE)
was not working in parallel (#411). - Fix: the LAScatalog processing engine printed the outputs twice for rare functions that print something like
las_check()
(#414) - Fix: the internal way lidR is checking for nested parallelism has been reworked in depth fixing some bugs and allowing to support more strategies thanks to @Lenostatos (#418, #421)
- Fix:
merge_spatial()
did not work withsf
objects. - New:
las_check()
introduces a new type of message called "message". Some message previously classified as "warning" are now classified as "message". Warnings are now displayed in orange and messages in yellow. The output oflas_check()
has now 3 items instead of 2. - New:
stdmetrics_z
gains a new parameterzmin = 0
to control the lower bound of the integration for metricszpcumx
(#424). - Enhance:
max_cr_factor
insilva2019()
is now allowed to be in [0, inf[ instead of [0,1] (#417) - Enhance: added a workaround to avoid
sp
printingproj_create: crs not found
for non recognized EPSG codes and avoid throwing warningDiscarded datum [...] in Proj4 definition
- Enhance:
readLAScatalog()
throws a more informative error when attempting to read an non-existing folder. - Enhance:
readXXXLAS()
now throws an error forLAScluster
(#430). - Doc: Updates and clarifications in the doc of
stdmetrics
. - Misc: removed
LazyData
inDESCRIPTION
v3.1.2
lidR v3.1.2 (Release date: 2021-03-11)
- New: the class
LASheader
has a new slot@EVLR
for the extended variable length records.print()
has been extended to display EVLR. While this change is compatible withrlas <= 1.3.9
it is only used with version ofrlas >= 1.4.0
. - New: algorithm
lowest()
fordecimate_points()
- Fix: usban outside the range of representable values of type 'char' for spatial indexes built with 0 point.
- Fix: build failure with GCC 4.x
- Fix:
catalog_apply()
now works with cluster planplan(cluster)
meaning that it can be used on HPC e.g. with MDPI. We took advantage of this bug to better detect the parallel strategy used and disable or not OpenMP. WhenlidR
is not able to figure out if the strategy involves multiple machines or multiple cores of a single machine, then a warning is thrown and OpenMP is disabled by security.The parallel evaluation strategy was no recognized and lidR does not know if OpenMP should be disabled. OpenMP has been disabled by security. Use options(lidR.check.nested.parallelism = FALSE) and set_lidr_threads() for a fine control of parallelism.
- Fix: incorrect offset computation in
spTransform()
have for consequences to make the function failing with error:Non quantizable value outside the range of representable values of type 'int'
. - Fix: attribution of a WKT string with
projection()
when using an epsg code as input (projection(las) <- 12345
). - Fix: partial processing mode now respects the raster alignment when processed by file
- Fix:
readLAScatalog()
now reads the WKT CRS of LAS files format 1.4. To support both EPSG and WKT the table of attribute of aLAScatalog
now has a column namedCRS
that replace former columnEPSG
. - Fix:
print()
for aLAScatalog
now prints the CRS exactly likeprint
forLAS
. - Doc: documentation of
options(lidR.check.nested.parallelism = FALSE)
was missing. Information can now be found in?lidR-package
and?lidR-parallelism
- Enhance: in
catalog_apply()
iflidR.check.nested.parallelism = FALSE
it now respects the input ofset_lidr_thread()
instead of the output ofget_lidr_threads()
. For example ifset_lidr_thread(0)
it now propagates the information 0 (all cores) instead of the output ofget_lidr_thread()
which might be e.g. 4 on the master worker but might be different on the slave workers. Similarlyset_lidr_thread(20)
will request 20 cores to the workers even ifget_lidr_thread()
returns 4 on the local machine. - Enhance:
set_lidr_thread()
accepts inputs < 1 such as 0.5 or 0.25 to mean 'half' or 'quarter' of available cores. - Enhance:
grid_density()
now returns 0 for pixels with 0 points instead ofNA
which make more sense and corresponds to what should be expected.
v3.1.1
lidR v3.1.1 (Release date: 2021-01-22)
- Fix usban issue: outside the range of representable values of type 'int' for spatial indexes built with 0 point.
- Fix usban issue: outside the range of representable values of type 'int' when quantizing or counting non quantized values that are not quantizable according the the given scale and offset.
- Remove lax files in example data.