Title: | Calculates the Leaf Area Index (LAD) and Other Related Functions |
---|---|
Description: | A set of functions for analyzing the structure of forests based on the leaf area density (LAD) and leaf area index (LAI) measures calculated from Airborne Laser Scanning (ALS), i.e., scanning lidar (Light Detection and Ranging) data. The methodology is discussed and described in Almeida et al. (2019) <doi:10.3390/rs11010092> and Stark et al. (2012) <doi:10.1111/j.1461-0248.2012.01864.x>. |
Authors: | Danilo Roberti Alves de Almeida [aut, cre]
|
Maintainer: | Danilo Roberti Alves de Almeida <[email protected]> |
License: | GPL-3 |
Version: | 0.3.5 |
Built: | 2025-02-28 03:17:48 UTC |
Source: | https://github.com/DRAAlmeida/leafR |
Calculates the foliage height diversity (FHD) metric from abundances considered as per-voxel relative LAD values, as described in MacArthur and MacArthur (1961).
FHD(lad_profile, evenness = FALSE, LAD.threshold = -1)
FHD(lad_profile, evenness = FALSE, LAD.threshold = -1)
lad_profile |
a data.frame including values of relative LAD at height intervals, output of the lad.profile function (use relative = TRUE) |
evenness |
boolean, defines whether FHD should be based on Shannon's diversity or evenness (Hill 1973). The default FALSE calculates Shannon diversity as the original FHD by MacArthur and MacArthur (1961); the alternative TRUE was recommended by Valbuena et al. (2012), and it calculates Shannon evenness dividing it by the natural logarithm of the number of number of voxels with LAD values above the threshold. |
LAD.threshold |
numerical (0,1), defines the minimum value of LAD for considering the relative leaf abundance of a voxel in FHD calculation. Defaults to the inverse of the total number of voxels. |
A numeric
containing the Foliage Height Diversity calculated from the Leaf Area Density profile
Hill M. O. (1973) Diversity and evenness: a unifying notation and its consequences. Ecology. 54: 427–432. doi:10.2307/1934352
MacArthur R.H., MacArthur J.W. (1961). On bird species diversity. Ecology 42: 594–598. doi:10.2307/1932254
Valbuena R., Packalen P., Martín-Fernández S., Maltamo M. (2012) Diversity and equitability ordering profiles applied to the study of forest structure. Forest Ecology and Management 276: 185–195. doi:10.1016/j.foreco.2012.03.036
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD, relative = TRUE) FHD(lad_profile, evenness = FALSE) FHD(lad_profile, evenness = TRUE)
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD, relative = TRUE) FHD(lad_profile, evenness = FALSE) FHD(lad_profile, evenness = TRUE)
Calculates the Gini coefficient (GC) from individual LIDAR returns (i.e. without voxelization), as described for the L-coefficient of variation (equivalent to Gini) in Valbuena et al. (2017).
GC(normlas.file, threshold = 1)
GC(normlas.file, threshold = 1)
normlas.file |
normalized las file |
threshold |
numerical, defines the minimum height considered to represent an echo from leaves. |
A numeric
containing the Gini coefficient (GC) calculated from the normalized LAS file
Valbuena et al. (2012) argues on why Gini is better suited to describe structural complexity the Foliage Height Diversity or the Gini-Simpon index.
Valbuena R., Packalen P., Martín-Fernández S., Maltamo M. (2012) Diversity and equitability ordering profiles applied to the study of forest structure. Forest Ecology and Management 276: 185–195. doi:10.1016/j.foreco.2012.03.036 Valbuena R., Maltamo M., Mehtätalo L., Packalen P. (2017) Key structural features of Boreal forests may be detected directly using L-moments from airborne lidar data. Remote Sensing of Environment. 194: 437–446. doi:10.1016/j.rse.2016.10.024
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") GC(normlas.file, threshold =1)
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") GC(normlas.file, threshold =1)
Calculates the Gini-Simpson (GS) index metric (i.e. complement of Simpson diversity ()
from abundances considered as per-voxel relative LAD values.
GS(lad_profile, evenness = FALSE, LAD.threshold = -1)
GS(lad_profile, evenness = FALSE, LAD.threshold = -1)
lad_profile |
a data.frame including values of relative LAD at height intervals, output of the lad.profile function (use relative = TRUE) |
evenness |
boolean, defines whether GS should be based on Simpson's diversity or evenness (Hill 1973).
The default FALSE calculates Simpson's diversity ( |
LAD.threshold |
numerical (0,1), defines the minimum value of LAD for considering the relative leaf abundance of a voxel in GS calculation. Defaults to the inverse of the total number of voxels. |
A numeric
containing the Fini-Simpson index calculated from the Leaf Area Density profile
Hill M. O. (1973) Diversity and evenness: a unifying notation and its consequences. Ecology. 54: 427–432. doi:10.2307/1934352
Smith B., and Wilson J.B. (1996). A consumer's guide to evenness indices. Oikos 76: 70–82. doi:10.2307/3545749
Valbuena R., Packalen P., Martín-Fernández S., Maltamo M. (2012) Diversity and equitability ordering profiles applied to the study of forest structure. Forest Ecology and Management 276: 185–195. doi:10.1016/j.foreco.2012.03.036
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD, relative = TRUE) GS(lad_profile, evenness = FALSE) GS(lad_profile, evenness = TRUE)
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD, relative = TRUE) GS(lad_profile, evenness = FALSE) GS(lad_profile, evenness = TRUE)
Calculate k coefficient provided a known real LAI and the calculated LAI
k.coefficient(lidar.lai, real.lai = 6)
k.coefficient(lidar.lai, real.lai = 6)
lidar.lai |
the output from lai() function |
real.lai |
numeric, known real LAI |
A numeric
with the calculate value for k coefficient for calibrating the real LAI from calculated LAI.
normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD) # Calculate LAI derived from LAD profile lidar.lai = lai(lad_profile); lidar.lai # The real LAI was measured in the field work for validation k.coefficient(lidar.lai, real.lai = 6)
normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD) # Calculate LAI derived from LAD profile lidar.lai = lai(lad_profile); lidar.lai # The real LAI was measured in the field work for validation k.coefficient(lidar.lai, real.lai = 6)
This function calculate the lad profile from the input lad.voxels
lad.profile(VOXELS_LAD, relative = FALSE)
lad.profile(VOXELS_LAD, relative = FALSE)
VOXELS_LAD |
3D grid of LAD values (output of lad.voxels() function) |
relative |
produce lad profile by relative total LAI values. Indicate when usinh effective LAI |
A data.frame
with the calculated Leaf Area Density
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) lad_profile = lad.profile(VOXELS_LAD) plot(lad_profile$height ~ lad_profile$lad, type = "l", ylim = c(0, 40), ylab = "Canopy height (m)", xlab = "LAD (m2/m3)") # relative LAD PROFILE relative.lad_profile = lad.profile(VOXELS_LAD, relative = TRUE) plot(relative.lad_profile$height ~ relative.lad_profile$lad, type = "l", ylim = c(0, 40), ylab = "Canopy height (m)", xlab = "LAD (% of LAI)")
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) lad_profile = lad.profile(VOXELS_LAD) plot(lad_profile$height ~ lad_profile$lad, type = "l", ylim = c(0, 40), ylab = "Canopy height (m)", xlab = "LAD (m2/m3)") # relative LAD PROFILE relative.lad_profile = lad.profile(VOXELS_LAD, relative = TRUE) plot(relative.lad_profile$height ~ relative.lad_profile$lad, type = "l", ylim = c(0, 40), ylab = "Canopy height (m)", xlab = "LAD (% of LAI)")
Creates a data frame of the 3D voxels information (xyz) with Leaf Area Density values from las file
lad.voxels(normlas.file, grain.size = 1, k = 1)
lad.voxels(normlas.file, grain.size = 1, k = 1)
normlas.file |
normalized las file |
grain.size |
horizontal resolution (suggested 1 meter for lad profiles and 10 meters for LAI maps) |
k |
coefficient to transform effective LAI to real LAI (k = 1; for effective LAI) |
A data.frame
of the 3D voxels information (xyz) with Leaf Area Density values
The values of LAD are not estimated below 1 meter. For the following reasons: ground points influence realtive low sampling
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2, k=1)
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2, k=1)
Calculates the leaf area height volume (LAHV) metric as described in Almeida et al. (2019).
LAHV(lad_profile, LAI.weighting = FALSE, height.weighting = FALSE)
LAHV(lad_profile, LAI.weighting = FALSE, height.weighting = FALSE)
lad_profile |
output of the lad.profile function |
LAI.weighting |
boolean, define if LAVH should be weighted by total LAI. default FALSE |
height.weighting |
boolean, define if LAVH should be weighted by the max height. default FALSE |
A numeric
containing the Leaf Area Heght Volume calculated from the Leaf Area Density profile.
Almeida, D. R. A., Stark, S. C., Chazdon, R., Nelson, B. W., Cesar, R. G., Meli, P., … Brancalion, P. H. S. (2019). The effectiveness of lidar remote sensing for monitoring forest cover attributes and landscape restoration. Forest Ecology and Management, 438, 34–43. doi:10.1016/J.FORECO.2019.02.002
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD) LAHV(lad_profile, LAI.weighting = FALSE, height.weighting = FALSE) LAHV(lad_profile, LAI.weighting = TRUE, height.weighting = FALSE) LAHV(lad_profile, LAI.weighting = FALSE, height.weighting = TRUE) LAHV(lad_profile, LAI.weighting = TRUE, height.weighting = TRUE)
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD) LAHV(lad_profile, LAI.weighting = FALSE, height.weighting = FALSE) LAHV(lad_profile, LAI.weighting = TRUE, height.weighting = FALSE) LAHV(lad_profile, LAI.weighting = FALSE, height.weighting = TRUE) LAHV(lad_profile, LAI.weighting = TRUE, height.weighting = TRUE)
calculates the lead area index (LAI)
lai(lad_profile, min = 1, max = 100)
lai(lad_profile, min = 1, max = 100)
lad_profile |
output of the lad.profile function |
min |
mix canopy height |
max |
max canopy height |
A numeric
containing the LAI calculated from the Leaf Area Density
The use of min and max arguments allowed the estimation of the LAI for different vertical strata
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD) lidar.lai = lai(lad_profile); lidar.lai understory.lai = lai(lad_profile, min = 1, max = 5); understory.lai # relative LAD PROFILE relative.lad_profile = lad.profile(VOXELS_LAD, relative = TRUE) #understory relative LAI (% of total LAI) relative.understory.lai = lai(relative.lad_profile, min = 1, max = 5); relative.understory.lai
# Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD) lidar.lai = lai(lad_profile); lidar.lai understory.lai = lai(lad_profile, min = 1, max = 5); understory.lai # relative LAD PROFILE relative.lad_profile = lad.profile(VOXELS_LAD, relative = TRUE) #understory relative LAI (% of total LAI) relative.understory.lai = lai(relative.lad_profile, min = 1, max = 5); relative.understory.lai
Produce a raster map of LAI. The resolution of the raster depends of grain.size choosed on lad.voxel() funtion.
lai.raster(VOXELS_LAD, min = 1, relative.value = NULL)
lai.raster(VOXELS_LAD, min = 1, relative.value = NULL)
VOXELS_LAD |
3D grid of LAD values (output of lad.voxels() function) |
min |
mix canopy height |
relative.value |
LAI map can be made in percentage of a relative lai value (indicate for effective LAI) A Leaf Area Index (LAI) |
library(raster) # Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization # use thicker grain size to avoid voxels # without returns VOXELS_LAD.5 = lad.voxels(normlas.file, grain.size = 5, k=1) #Map using absolute values lai_raster = lai.raster(VOXELS_LAD.5) plot(lai_raster) ############################# ## RELATIVE LAI Raster ###################### # Calculate voxels LAD with finer grain size for # better estimation of LAI VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD) #Calculate LAI derived from LAD profile lidar.lai = lai(lad_profile) #Map using relative values (%) relative.lai_raster = lai.raster(VOXELS_LAD.5, relative.value = lidar.lai) plot(relative.lai_raster)
library(raster) # Get the example laz file normlas.file = system.file("extdata", "lidar_example.laz", package="leafR") # Calculate LAD from voxelization # use thicker grain size to avoid voxels # without returns VOXELS_LAD.5 = lad.voxels(normlas.file, grain.size = 5, k=1) #Map using absolute values lai_raster = lai.raster(VOXELS_LAD.5) plot(lai_raster) ############################# ## RELATIVE LAI Raster ###################### # Calculate voxels LAD with finer grain size for # better estimation of LAI VOXELS_LAD = lad.voxels(normlas.file, grain.size = 2) # Calculate the LAD profile lad_profile = lad.profile(VOXELS_LAD) #Calculate LAI derived from LAD profile lidar.lai = lai(lad_profile) #Map using relative values (%) relative.lai_raster = lai.raster(VOXELS_LAD.5, relative.value = lidar.lai) plot(relative.lai_raster)
Tiny LiDAR data example for providing functional examples
Count number of points in each Z slice
pointsByZSlice(Z, maxZ)
pointsByZSlice(Z, maxZ)
Z |
numeric vector. The heights vector. |
maxZ |
numeric. The maximum height expected in the whole dataset. |
A list
of point counts in each Z slice of 1 meter