- Fix: critical bug on windows #96
- Fix: In sampling stages, the filter argument previously discarded all points that did not pass the test. The updated behavior processes only the points that pass the test while leaving others untouched. For example:
Previously, this filtered the point cloud to retain only Poisson-sampled ground points. Now, it correctly Poisson-samples the ground points while preserving all other points.
sampling_poisson(1, filter = keep_ground())
- New: Added a new stage,
info()
, to print useful information about a file. - New: Command-line utility introduced. Users can now execute simple pipelines from the terminal. First, use
install_cmd_tools()
, then commands like these become available:lasr info -i path/to/file.las lasr vpc -i path/to/folder lasr lax -i path/to/folder -ncores 8 lasr help lasr chm -i path/to/folder -o path/to/chm.tif -res 1 -ncore 4 lasr dtm -i path/to/folder -o path/to/chm.tif -res 0.5 -ncore 4
- New:
transform_with()
now supports a 4x4 Affine Transformation Matrix to translate and rotate the point cloud. - Change: The
Eigen
library has replaced theArmadillo
library for linear algebra. This change may affect the sign of some vectors ingeometry_feature()
. - New: The
filter
argument, available in many stages, now accepts programming-style strings such asZ < 3
,Classification == 2
,UserData == 0
,Intensity > 100
,Classification %in% 2 3 4
, andClassification %out% 0 1 2
. This approach is now the preferred way to assign filters, allowing filtering on extrabyte attributes by name, e.g.,Amplitude > 10
. - Change:
transform_with()
a raster (typically normalization) now performs bilinear interpolation. - New: stages that have a
use_attribute
argument now accept any attribute including extrabytes attribute. - New:
sampling_pixel()
gained an argumentmethod
anduse_attribute
to retain specific points of interest.
Change: normalize()
loose its argument extrabytes
in favor of a new function hag()
that is equivalent to normalize(TRUE)
New: add stages delete_noise()
, delete_ground()
Fix: The local_maximum
function previously experienced significant delays when writing points to disk, taking up to 2 seconds on Linux and up to 30 seconds on Windows. This issue severely hindered parallelization capabilities. The new fix dramatically reduces the write time to around 0.1 seconds, greatly improving overall performance.
- Fix #91: Resolved a critical memory addressing issue when handling very large point clouds.
- Fix: Improved pipeline efficiency by preventing the reading of buffer tiles in pipelines using
stop_if()
beforereader_las()
. Previously, the buffer was being read even when points were meant to be skipped, leading to unnecessary processing time (a few seconds per skipped file).
- New: new stage
classify_with_sor()
to classify outliers with statistical outlier removal. - New: new stage
focal()
to post-process rasters in the pipeline. - New: new stage
filter_with_grid()
to keep the lowest or highest point per cell of a grid. - Change: #79 raster produced on a subset of data have the minimal possible extent instead of the full extent of the point cloud.
- Fix: numerous inaccuracies in numeric parameters interpreted as integers. For example, in
geometry_feature
,r = 5
was equal to 5 butr = 4.5
was equal to 4. - Fix: some parameters in
region_growing()
for individual tree segmentation were inverted.
- Fix: Filters based on return number, number of returns, or classification (e.g.,
-keep_last
,-keep_class 128
) are now functional with LAS 1.4. - Enhancement: Prevent the possibility of writing a file with the
.copc.las
extension;.copc
is automatically discarded. - New: The
classify_with_csf()
stage has gained afilter
argument.
- Fix #81: Added a warning if the Delaunay triangulation was not computed (fewer than 3 points).
- Fix #81: Read files with multiple Extra Bytes definitions.
- Fix #80: Circular buffers are properly removed from raster.
- Fix #83: Aborted the pipeline initialization in
load_raster()
if the raster does not have an extent that overlaps with the point cloud. - Fix #88:
sort()
now handles duplicated gpstime properly.
- Fix: Better handle datasets with overlapping tiles and non-duplicated points.
- Fix: Trigger lax indexation for a single file when processing by chunks.
- Fix:
local_maximum()
could return multiple too-close local maximum points if two close points have the exact same Z coordinates and the exact same X or Y coordinates (but not both X and Y; duplicated points were properly handled). This particularly affectedlocal_maximum_raster()
, where two pixels can easily have the same Z and the same X or Y. - Fix:
region_growing()
theth_tree
argument was not properly respected. - Fix:
transform_with
with a TIN won't fail if there is no TIN. Instead all points will be removed. - Fix: possible edge artifacts were possible for some filter
- Fix: #78 WGS84 VPC bounding box
- Enhance: Progress estimation display when indexing a single file.
- Internal: internal changes to support visual programming. See the lasRui project.
exec()
accepts the path to a json file produced by a UI (non documented)- New: filter
keep_ground_and_water()
- Change:
normalize
useskeep_ground_and_water()
- Fix: #73
triangulation
fails with < 3 points
- New: stage
sort_points()
to optimize compression. - New: protection against overwriting processed files while processing
- Fix: messages and warnings are thread safe. A pipeline that printed message on the console could crash. This is expected to be safe now.
- Fix: #70
- Fix: #71
write_lax()
is 2x faster when used as a single stage - Fix: progress bar of
write_lax()
for LAS 1.4. - Fix: #74
write_lax()
is now parallelized
- New argument
use_gpstime
inwrite_vpc()
- Fix: division by 0 in raster stage initialization
- Fix: datetime parsing in
write_vpc()
- Fix:
write_vpc()
writes valid files readable by QGIS
- Fix: sampling stages robustly support more than 4 billions voxels
- Enhance: noise with
ivf
is faster. - Fix: fix memory corruption for point clouds above 4.3 GB
-
New stage
classify_with_csf()
to classify ground points. -
The metric engine introduced in v0.6.0 can now compute metrics on extrabytes attributes. e.g.
Amplitude_mean
-
New stage
sampling_poisson
to perform Poisson Disk Sampling -
sampling_pixel
andsampling_voxel
are faster.
-
sampling_*
stages respect thefilter
argument -
Fix #63 crash when some chunk are skipped either because they have 0 points of because of the
stop_if
stage. -
Fix #64 metrics on RGB were actually computed on RRR
classify_isolated_voxels()
renamed intoclassify_with_ivf()
for consistency.
- Fix: writing copc file from a copc file crashed.
- Fix: #62 attributes of the vector files were not recorded when the output file template contains a wildcard
*
- Fix: metrics
cv
andsd
that were not computed properly.
- Fix: metrics
cv
andsd
that returnNAs
instead ofInf
in the edges case where they are undefined. - Enhance: progress bar displays better the number of cores used.
- Fix: progress bar for the
reader_las()
stage. It now displays the correct percentage. - Fix:
write_las()
without wildcard (merge mode) works with files that have different formats and scales/offsets
-
New stage
stop_if
to conditionally escape the pipeline. New section aboutstop_if
in the online tutorial. -
New stage
write_lax
. This stage was automatically added by the engine but can now be explicitly added by users. -
New internal "metric engine". The metric engine is used to compute metrics in, e.g.,
rasterize()
with operators likezmean
,imean
, and so on. The metric engine has been redesigned and allows any string with the formatattribute_metric
such asz_sd
,i_mean
,c_mode
,a_mean
,intensity_max
,classification_mode
,angle_mean
, and any other combinations. All attributes are mapped, and new functions are available such assum
,mode
. Many more could be added easily. Former strings such aszmean
orimax
are no longer valid and should be replaced byz_mean
andi_max
but are backward compatible. -
rasterize
gained access to the new metric engine and can compute many more metrics natively. -
summarize()
gained access to the metric engine and can compute metrics for each file or each chunk. Used in conjunction withreader_las_circle()
, it can be used, for example, to compute plot inventory metrics. The online tutorial has been updated. The section "plot inventory" no longer usescallback()
and is preceded by a new section "summarize".
-
The package no longer assigns
set_parallel_strategy(concurrent_points(half_core()))
when loading. Instead, if nothing is provided, this is interpreted asconcurrent_points(half_core())
. Thus, users can now writeexec(pipeline, on = file, ncores = 8)
. The engine will now respectncores = 8
because no global settings with global precedence were assigned. The multi-threading vignette has been updated. -
Pipelines that include R-based stages (
rasterize
with R function,callback
) are no longer parallelizable with theconcurrent-file
strategy. Parallelizing a pipeline that involves the R C API is terribly complex and eventually leads only to pseudo-parallelism with a lot of troubleshooting to deal with (especially to abort the pipeline). Consequently, we removed parallelism capabilities. The numerous new native metrics added in the metric engine compensate for that loss. The online documentation has been updated accordingly.
- A large number of changes to separate
lasR
from R.lasR
can now be compiled as standalone software. AMakefile
has been added to the repository. At the R level, the pipeline and the processing options are passed to the C++ engine via a JSON file instead of being passed via the R's C API, effectively separatinglasR
from R itself. The R side oflasR
is now purely an API to the standalone engine. A JSON file produced by thelasR
package can be executed with the standalone software:lasr pipeline.json
. However, the syntax of the JSON file is not documented and is not intended to be documented. Rather, the JSON file should be produced by an API such as thelasR
package, a QGIS plugin, or a Python package. Obviously, there is currently no such thing.
- Fix:
reader_las()
with COPC files, depth query (-max_depth
), and buffer. The depth query was not performed at all. The fix is temporary: it breaks the progress bar ofreader_las()
but this is a less serious bug. - Fix:
reader_las()
with very large files. - Fix:
load_raster()
is thread-safe - New:
rasterize()
accepts a new argumentdefault_value
. When rasterizing with an operator and a filter (e.g.-keep_z_above 2
) some pixels that are covered by points may no longer contain any point that pass the filter criteria and are assigned NA. To differentiate NAs from non covered pixels and NAs from covered pixels but without point that pass the filter, the later case can be assigned another value such as 0.
- Fix: #50
write_vpc()
properly reprojects the bounding boxes in WGS84 - Enhance:
write_vpc()
writeszmin
andzmax
for each file. - Fix: #55
local_maximum()
no longer fails withofile = ""
- Fix: progress bar of the
reader_las()
for COPC files. - Fix: metrics
zsd
andisd
were incorrect due to wrong parenthesis in the code.
- Fix: #48 segfault with
delete_points()
when 0 points left. - Enhance: #47 pipelines are named
list
. - Enhance: #47 the output
list
returned byexec
is named and duplicated names are made unique withmake.names()
- Doc: added some notes in the documentation of
geometry_features()
to address question in #45 - Enhance: #49
set_crs()
no longer forces the pipeline to read the files. - Enhance:
exec()
normalizes the path so users do not get an error when providing a path with a~
. - New:
rasterize()
gained a metriczaboveX
to compute canopy cover.
- Fix: #45 computation time of
geometry_features
afterdelete_points()
- Fix:
local_maximum()
was processing deleted points. - Enhance: #44
write_vpc
write thedatetime
- Enhance:
delete_points
can now physically remove the deleted points if the number of points deleted is important. Before they were flagged but kept in memory. It can also free available memory.
- New: #42
write_vpc()
gained an argumentabsolute_path
- Fix: #42
write_vpc()
orders the long/lat coordinates properly on Linux - Fix: #42
write_vpc()
writes the absolute path of the relative path does not exist on Windows - Fix: #40
triangulate()
with 0 point chunk. - Fix: #43:
geometry_feature
works if the file already contains some extrabytes attributes - Enhance: 0 point point-clouds are no longer stopping the computation. If a stage such as
delete_points()
removes all the points, the pipeline is stopped for the current chunk/file but the computation keep going for others. This was not the case for all stages and some stages could either crash or stop the computation.
- Fix:
write_vpc()
does not crash with files without CRS - Fix:
write_vpc()
write the CRS set upstream byset_crs()
- New: stage
geometry_features()
to compute point wise geometry features based on k-nearest neighbors. - New: stage
callback()
can load more than 10 extrabyte attributes. Using the flagE
all the extrabytes are loaded. - New: stage
set_crs()
to assign a coordinate reference system at some point of the pipeline. - New: raster in
GeoTiff
format are now created withCOMPRESS=DEFLATE
,PREDICTOR=2
,TILED=YES
effectively reducing the size of the rasters - New:
summarize()
output includes the CRS.
- Enhance: #33
local_maximum()
gained arecord_attributes
argument to chose if the attribute of the points are recorded in the vector file. - Enhance: #33
local_maximum_raster()
no longer record zeroed LAS point attributes
- Fix: #32 writing a vector file with a path containing a wildcard crashed the program.
- Fix:
lax
included intolaz
file were not working. - Fix: #30 can read files bigger than 2.14 GB
- Fix: #29 using a filter in
rasterize()
produced corrupted output.
- Fix: bug with
set_parallel_strategy(nested(ncores = 4, ncores2 = 4))
. - Fix: attribute
datatime
isdatetime
in VPC files. - Fix: #25 triangulation with 0 points crashed. 0 points are possible with a filter.
- Fix: #24
write_vpc()
writes the correct number of points for LAS 1.4 files. - Fix: read of WKT strings in LAS files with a size inferior to what was declared in the header (null-terminated before
record_length_after_header
).
- Fix: #22 segfault with partial processing.
- Fix: memory access to WKT strings non-null-terminated.
- Fix:
add_attribute()
was incorrectly reallocating memory causing potential crashes, especially when adding several attributes. - Fix:
reader_las()
crashing if the header of the LAS file did not record the correct number of points. - Fix: naming of the queries.
- Documentation: reorganized the URLs and navbar of the website.
- Fix: #20 segfault with
local_maximum_raster
. - Fix: segfault when reading LAS files with a header that incorrectly reports the number of points.
- New: parallelism on multiple files. See
?multithreading
- New: stage
local_maximum_raster
to compute local maximum on a raster - New: argument
with
inexec
to pass processing options that should be preferred over direct naming. - New: function
set_exec_options()
to assign global processing options and override arguments potentially hardcoded inexec()
- New: stage
load_raster
to read a raster instead of producing it on the fly from the point cloud. - New: stage
add_rgb
to modify the point data format - Doc: new article on the website about parallelism for an illustrated version of
?multithreading
- Doc: improve documentation about processing options in
?exec
and?set_exec_options
- Fix: #18 strongly improving arithmetic accuracy in
point_in_triangle
.
- Fix: #17
transform_with
can be used withpit_fill
- Fix: #15
pit_fill
producing corrupted output - Fix:
pit_fill
was not respecting the parameters given by the user - Fix:
pit_fill
in combination withrasterize("max")
was not working properly
- Fix: #12 write lax with buffered chunk
- Fix: #13 processing by chunk was not buffered
- Fix: CRS are working on Windows
- Fix:
library(lasR)
transparently checks for latest version on Windows.
- Fix: bugs when making a spatial query on multiple files with multiple spatial indexing systems (e.g. lax+nothing, lax+copc)
- Change:
processor()
andreader()
are deprecated and are replaced byexec()
andreader_las()
. This intends to provide a more consistent and natural way to separate the pipeline. i.e the stages and the global processing options i.e. the buffer, the chunking, the progress bar. For example the following now respects theLAScatalog
processing options and this was not possible with the previous syntax.ctg = lidR::readLAScatalog() pipeline = reader_las() + rasterize(...) exec(pipeline, on = ctg)
- New: the processor is now able to process by chunk like
lidR
pipeline = reader_las() + rasterize(...) exec(pipeline, on = file, chunk = 500)
- New: stage
delete_points()
to remove some points in the pipeline. - New: it is now possible to write the following:
dtm = dtm() pipeline <- read + dtm + transform_with(dtm[[2]])
- New: it is not possible to omit the reader stage. It automatically adds a default reader
pipeline = rasterize(...) exec(pipeline, on = ctg)
- New: triangulation is 4x faster and uses half the memory.
- Fix:
summarize()
,rasterize()
andwrite_las()
no longer process withheld points in streaming mode.
- Fix:
callback()
properly handles errors from the injected function - New: handy functions
tempxyz()
to generate temp files with extension.xyz
. - New:
rasterize()
is now parallelized with internal metrics including for buffered area based approach - New:
rasterize()
gained a progress bar with internal metrics.
- New:
rasterize()
gains the ability to perform a multi-resolution or buffered rasterization. See documentation. - New:
rasterize()
gains numerous native metrics such aszmax
,zmean
,zmedian
,imax
,imean
and so on. - New: the internal engine gains the ability to skip the processing of some files of the collection and use these files only to load a buffer. This feature works with a
LAScatalog
fromlidR
respecting theprocessed
attribute used inlidR
- Fix: loading the package being offline created a bug were R no longer handles errors.
- New: progress bar when reading the header of the files (
LAScatalog
) can be enabled withprogress = TRUE
- Fix: progress bar starts to appear earlier i.e. from 0%. For some pipeline it affects the feeling of progress.
- Doc: Corrected the documentation for the argument
ncores
inprocessor()
, which incorrectly mentioned that it was not supported. - New: Added new functions
ncores()
andhalf_cores()
. - Fix: Corrected the reader progress bar display when reading a las file with a filter and a buffer.
- Fix: Fixed the overall progress bar, which was delayed by one file and was showing incorrect progress.
- Open to public
- Fix: Fix the overall progress bar, which was delayed by one file and was showing incorrect progress.