lidRThe lidr
package offers a robust suite of tools for processing LiDAR data.
While lacunr does not require lidR as a strict
dependency, it is assumed that most users will be working with point
cloud data imported using lidR, and the package is designed
to mesh well with lidR’s data objects. The following tips
will help make combining these packages as seamless as possible.
LAS objectsThe workhorse of lidR is the LAS data
object, an S4 class that emulates the structure of a .las/.laz point
cloud file. lacunr does not include any example data in
.las format, but we can generate a quick and dirty approximation by
converting the built-in glassfire dataset to a
LAS object:
# convert 'glassfire' to LAS format
las_glassfire <- lidR::LAS(data = glassfire)
#> Creation of a LAS object from data but without a header:
#> Scale factors were set to 0.001 and XYZ coordinates were quantized to fit the scale factors.This triggers a message because we have not supplied all of the
required metadata found in a proper .las file, but the new
LAS object will suffice for the purposes of the following
examples.
Now that glassfire has been converted, the point cloud
data.table is now stored in an S4 slot called
@data. If we try to feed the whole LAS object
to lacunr’s voxelize() function, it will throw
an error:
# the wrong way to call voxelize() for a 'LAS' object:
vox <- voxelize(las_glassfire, edge_length = c(0.5, 0.5, 0.5))
#> Error in voxelize(las_glassfire, edge_length = c(0.5, 0.5, 0.5)): Input must be a data.frame or data.tableInstead, we need to extract the @data slot and supply
that to voxelize():
lidRlidR offers its own extremely versatile voxelization
function, voxel_metrics().
This provides a useful alternative to voxelize(), although
it is important to note that both functions utilize different algorithms
and will not produce identical results (see the following section for
more details).
voxel_metrics() returns a lasmetrics3d
object. lacunr’s bounding_box() function can
accept this as an input, but it also requires that it contain a column
named N, recording the number of points in each voxel. This
column can be generated by voxel_metrics() using the
following:
# voxelize at 1m resolution, creating a column N containing the number of points
vox <- lidR::voxel_metrics(las_glassfire, ~list(N = length(Z)), res = 1)
# convert to array
box <- bounding_box(vox)Failing to include this column will cause bounding_box()
to throw an error.
lacunr::voxelize() vs
lidR::voxel_metrics()voxelize() is adapted from the function
voxels(), originally written by J. Antonio Guzmán Q. for
the package rTLS. It is
intended as a complement rather than a replacement for
lidR’s more elaborate voxel_metrics(). Each
function has a different underlying algorithm and will produce distinct
results from the same input data. The chief advantages of
voxelize() over voxel_metrics() are:
voxel_metrics() permits at most two
dimensions.voxel_metrics(). This is due to differences in how each
function aligns the point cloud data within the voxel grid.