knitr::opts_chunk$set( collapse = TRUE, comment = "#>", echo = T, message = T, warning = F, cache = F )
1) Definition of the area to be logged 2) The layout of the main skidding trails 3) Tree selection 4) Selection of trees by the logger 5) The layout of secondary skidding trails 6) Felling of the tree 7) Adjustment of secondary skidding trails in the case of Wood Fuel exploitation (WFE) 8) Moving the bole
Install Maria
install.packages("Maria")
Load the package
library(Maria) library(knitr) library(kableExtra) library(ggplot2)
Load the two datasets stored in the package
# 2016 inventory of Paracou (French Guiana) plot 6 data(Paracou6_2016) # Table of species exploitability criteria data(SpeciesCriteria) # Volume parameters table data(ForestZoneVolumeParametersTable) # Crown diameter allometry parameters table data(ParamCrownDiameterAllometry) # Digital terrain model (DTM) of the plot 6 of Paracou (1m resolution, LiDAR campaign of 2016) data(DTMParacou) # Slopes (in radians) of the plot 6 of Paracou (with a neighbourhood of 8 cells) data(PlotSlope)
\code{\link{Paracou6_2016}}
# inventory class class(Paracou6_2016) #The name and class of all the data variables lapply(Paracou6_2016, class) Paracou6_2016 %>% dplyr::slice(1:10) %>% kable() %>% kable_styling(font_size = 10, latex_options = "scale_down")
\code{\link{SpeciesCriteria}}
# speciescriteria class class(SpeciesCriteria) #The name and class of all the data variables lapply(SpeciesCriteria, class) kable(SpeciesCriteria)
\code{\link{ForestZoneVolumeParametersTable}}
# volumeparameters class class(ForestZoneVolumeParametersTable) #The name and class of all the data variables lapply(ForestZoneVolumeParametersTable, class) kable(ForestZoneVolumeParametersTable)
\code{\link{ParamCrownDiameterAllometry}}
# crowndiameterparameters class class(ParamCrownDiameterAllometry) #The name and class of all the data variables lapply(ParamCrownDiameterAllometry, class) kable(dplyr::slice_sample(ParamCrownDiameterAllometry, n=15))
loggingsimulation loggingparameters scenariosparameters inventorycheckformat addtreedim treeselection ONFGuyafortaxojoin harvestable selected futurereserve treefelling createcanopy treefromthesky directionalfellingsuccessdef felling1tree rotatepolygon getgeometry timberharvestedvolume exploitablefuelwoodvolume
inventory : Input inventory (see the inputs formats and metadata in the \code{\link{vignette}}) (data.frame)
topography : Digital terrain model (DTM) of the inventoried plot (LiDAR or SRTM) (RasterLayer)
relativeelevation : (RasterLayer)
speciescriteria : Table of species exploitability criteria : species names, economic interest level, minimum and maximum felling diameter, in the same format of \code{\link{SpeciesCriteria}} (2 levels of commercial species) (data.frame)
volumeparameters : Volume parameters table (in the same format of \code{\link{ForestZoneVolumeParametersTable}}) to compute the harvestable volume of each tree, depend to its geographic zone if several locations (data.frame)
scenario : Logging scenario: "RIL1", "RIL2broken", "RIL2", "RIL3", "RIL3fuel", "RIL3fuelhollow" or "manual"(character)
objective : Objective volume per hectare (numeric)
fuel : Fuel wood exploitation: no exploitation = "0", damages and purge exploitation in fuel = "1", exploitation of hollow trees, damages and purge in fuel = "2"
diversification : Taking of other species in addition to the main commercial species (2 levels of commercial species in the \code{\link{SpeciesCriteria}} table) (logical)
winching : No cable or grapple = "0", only cable = "1", grapple + cable = "2"
directionalfelling : Directional felling = "0": only to direct the foot of the tree towards the trail "1": to direct the foot of the tree towards the trail + to avoid damage to future and reserve trees "2": to avoid damage to future and reserve trees + orientation angle to the trail
specieslax : Allow diversification if stand is too poor, = FALSE by default (logical)
objectivelax : Allow exploitation in case of non-achievement of the objective volume (if stand too poor), = FALSE by default (logical)
crowndiameterparameters : Crown diameter allometry parameters table (in the same format of \code{\link{ParamCrownDiameterAllometry}}) to compute the crown diameter of each tree, depend to its DBH (Diameter at Breast Height) and its species, genus or family (Aubry-Kientz et al.2019). (data.frame)
advancedloggingparameters : Other parameters of the logging simulator \code{\link{loggingparameters}} (list)
iter : Number of iterations (numeric). Default = 1.
\code{\link{ScenariosTable}}
data(ScenariosTable) kable(ScenariosTable)
\code{\link{loggingparameters}}
Default values
Numeric values
Models
Tree harvestable volume allometry (French Guiana ONF formula): aCoef + bCoef * (DBH/100)^2, aCoef and bCoef depend on the forest location, stored in \code{\link{ForestZoneVolumeParametersTable}}, DBH in cm.
Trunk height allometry (from the cylinder volume formula): CylinderVolume = pi(((DBH/100)/2)^2 x H, DBH in cm, height (H) in m.
Tree height allometry parameters estimated from Guyanese data with the BIOMASS package: log(H) = 0.07359191 + 1.34241216 log(DBH) + (-0.12282344)*log(DBH)^2, height (H) in m, DBH in cm
Crown diameter allometry (ref): ln(D) = 𝜶+ 𝜷 ln(H*CD) + 𝜺, with 𝜺~N(0,σ^2) and mean σ^2 = 0.0295966977 with the crown diameter (CD) and the tree height (H) in m, and the DBH (D) in cm (Aubry-Kientz et al.2019).
Rotten model, estimates the tree probability of being probed hollow: 1 / (1 + exp(-(-5.151 + 0.042 DBH))), with DBH in cm
Visibly defect model, estimates the tree probability to have visible defects: 1 / (1 + exp(-(-3.392 + 0.357 * Log(DBH)))) with DBH in cm
# Rslt <- loggingsimulation(Paracou6_2016, # topography = DTMParacou, relativeelevation = DTMParacou, # speciescriteria = SpeciesCriteria, # volumeparameters = ForestZoneVolumeParametersTable, # scenario = "manual", objective = 20, # fuel = "2", diversification = TRUE, winching = "2", # directionalfelling = "2", specieslax = FALSE, objectivelax = TRUE, # crowndiameterparameters = ParamCrownDiameterAllometry, # advancedloggingparameters = loggingparameters(), iter = 1, cores = 1)
The harvestable volume may change from one simulation to another because the identification of defect trees contains a random component.
# RIL1_Rslt <- loggingsimulation(Paracou6_2016, # topography = DTMParacou, relativeelevation = DTMParacou, # speciescriteria = SpeciesCriteria, # volumeparameters = ForestZoneVolumeParametersTable, # scenario = "RIL1", specieslax = FALSE, objectivelax = TRUE, # crowndiameterparameters = ParamCrownDiameterAllometry, # advancedloggingparameters = loggingparameters(), iter = 1, cores = 1) # loggingsummary(RIL1_Rslt) # # Without diversification the harvestable volume is too poor
# RIL2broken_Rslt <- loggingsimulation(Paracou6_2016, # topography = DTMParacou, relativeelevation = DTMParacou, # speciescriteria = SpeciesCriteria, # volumeparameters = ForestZoneVolumeParametersTable, # scenario = "RIL2broken", specieslax = FALSE, objectivelax = TRUE, # crowndiameterparameters = ParamCrownDiameterAllometry, # advancedloggingparameters = loggingparameters(), iter = 1, cores = 1) # loggingsummary(RIL2broken_Rslt) # RIL2broken_inventory <- RIL2broken_Rslt$inventory # # Without diversification the harvestable volume is too poor # # Not all harvestable trees are always harvested because they are eventually probed hollow, and there is not always a harvestable tree to replace them.
# RIL2_Rslt <- loggingsimulation(Paracou6_2016, # topography = DTMParacou, relativeelevation = DTMParacou, # speciescriteria = SpeciesCriteria, # volumeparameters = ForestZoneVolumeParametersTable, # scenario = "RIL2", specieslax = FALSE, objectivelax = TRUE, # crowndiameterparameters = ParamCrownDiameterAllometry, # advancedloggingparameters = loggingparameters(), iter = 1, cores = 1) # loggingsummary(RIL2_Rslt) # # Without diversification the harvestable volume is too poor
# RIL3_Rslt <- loggingsimulation(Paracou6_2016, # topography = DTMParacou, relativeelevation = DTMParacou, # speciescriteria = SpeciesCriteria, # volumeparameters = ForestZoneVolumeParametersTable, # scenario = "RIL3", specieslax = FALSE, objectivelax = TRUE, # crowndiameterparameters = ParamCrownDiameterAllometry, # advancedloggingparameters = loggingparameters(), iter = 1, cores = 1) # # RIL3_inventory <- RIL3_Rslt$inventory # loggingsummary(RIL3_Rslt) # # With diversification the harvestable volume is much higher # # but 30m3/ha is a too high objective for this plot size # # Not all harvestable trees are always harvested because they are eventually probed hollow, and there is not always a harvestable tree to replace them.
# RIL3fuel_Rslt <- loggingsimulation(Paracou6_2016, # topography = DTMParacou, relativeelevation = DTMParacou, # speciescriteria = SpeciesCriteria, # volumeparameters = ForestZoneVolumeParametersTable, # scenario = "RIL3fuel", specieslax = FALSE, objectivelax = TRUE, # crowndiameterparameters = ParamCrownDiameterAllometry, # advancedloggingparameters = loggingparameters(), iter = 1, cores = 1) # loggingsummary(RIL3fuel_Rslt) # # Not all harvestable trees are always harvested because they are eventually probed hollow, and there is not always a harvestable tree to replace them.
# RIL3fuelhollow_Rslt <- loggingsimulation(Paracou6_2016, # topography = DTMParacou, relativeelevation = DTMParacou, # speciescriteria = SpeciesCriteria, # volumeparameters = ForestZoneVolumeParametersTable, # scenario = "RIL3fuelhollow", # specieslax = FALSE, objectivelax = TRUE, # crowndiameterparameters = ParamCrownDiameterAllometry, # advancedloggingparameters = loggingparameters(), # iter = 1, cores = 1) # RIL3fuelhollow_inventory <- RIL3fuelhollow_Rslt$inventory # # loggingsummary(RIL3fuelhollow_Rslt)
# loggingsummary(Rslt)
inventory <- inventorycheckformat(Paracou6_2016)
Tree and crown height and diameter, harvestable volume, wood density, and AGB
inventory <- addtreedim(inventory, volumeparameters = ForestZoneVolumeParametersTable)
By default, a prospecting unit is an area connected to a truck trail or a main skid trail, with a slope of less than 27%, avoiding lowlands and the water system (30 m buffer). RIL1: SRTM is used. RIL2broken/RIL2/RIL3/RIL3/RIL3fuel/RIL3fuelhollow: LIDAR is used.
Trees with visible defects are identified ('VisiblyDefectModel' in 'advancedloggingparameters' argument) and therefore not designated.
(Objective volume: If the user has chosen not to harvest hollow probed trees for energy ('RottenModel' in 'advancedloggingparameters' argument), 20-30% will be added to the objective volume in order to compensate for these designated hollow trees. If the user has chosen to harvest the hollow probed trees as fuel wood, he will harvest strictly his target volume, without bonus.)
Trees will be designated as "harvestable" if they: - belonging to species of 1st economic rank or more if diversification - DBH between the MinFD and the MaxFD. - not isolated ( >100m ('IsolateTreeMinDistance' in \code{\link{loggingparameters}})) from other individuals of the same species in the aggregative species case (\code{\link{SpeciesCriteria}}, 'Aggregative' column). - on slopes < 22% ('TreeMaxSlope'in \code{\link{loggingparameters}}) - off the main trails.
If the harvestable volume is higher than the objective volume, the MinFD of the 1st economic rank species is first increased, then that of the other species (if diversification), if this is not enough. The volume to be harvested is adjusted if necessary by taking the trees in decreasing order of volume, until the objective volume is reached.
If the harvestable volume is too low, diversification can be applied if it was not already applied ('specieslax') (trees of all commercial ranks are selected in decreasing order of volume until the objective volume is reached), or harvesting can continue despite an unreached objective volume, or be abandoned ('objectivelax')
Future trees will be: - species of 1st economic rank - DBH between 35cm ('FutureTreesMinDiameter') and the species MinFD or UpMinFD if it has been raised for its species.
Reserve trees will be: - future trees - in the same number as trees to be harvested.
Trees to be exploited, future and reserve trees
# treeselectionoutputs <- treeselection(inventory, # topography = DTMParacou, plotslope = PlotSlope, # speciescriteria = SpeciesCriteria, # objective = 20, scenario ="manual", fuel = "2", # diversification = FALSE, specieslax = FALSE, # objectivelax = TRUE, # advancedloggingparameters = loggingparameters())
inventory <- ONFGuyafortaxojoin(inventory, SpeciesCriteria)
harvestableOutputs <- harvestable(inventory, topography = DTMParacou, diversification = TRUE, plotslope = PlotSlope, specieslax = FALSE, maintrails = MainTrails, harvestablepolygons = HarvestablePolygons, advancedloggingparameters = loggingparameters()) inventory <- harvestableOutputs$inventory HVinit <- harvestableOutputs$HVinit
inventory <- selected(inventory, scenario = "manual", fuel = "2", diversification = TRUE, VO = 125, HVinit = HVinit, specieslax = FALSE, objectivelax = TRUE, topography = DTMParacou, advancedloggingparameters = loggingparameters())$inventory
inventory <- futurereserve(inventory, SpeciesCriteria)
Skidding trail (main, secondary): allows wood to be transported from the parcel to truck routes.
The secondary trails are: - 4 m width ('ScndTrailWidth') - 22% maximum slope in length ('MaxTrailCenterlineSlope') - 4% maximum side slope (taken into account in the presence of LIDAR). ('MaxTrailCrossSlope') They avoid : - the trees to be logged - the trees with a DBH of more than 50 cm ('BigTrees') - the reserve trees. They join in priority: 1: groups in decreasing order of tree abundance 2: those with the shortest distance to the nearest track 3: avoiding future trees 4: minimising slopes in length and width.
RIL1/RIL2broken: trails go to the base of trees RIL2: cable only: trails go up to a maximum of 40 m ('CableLength') from trees. RIL3/RIL3 including fuel: grapple (trails with longitudinal slope <20% ('GrappleMaxslope')) (trails go up to 6 m ('GrappleLength') from the trees), and cable (trails go up to 40 m ('CableLength') from the trees) is used only when the longitudinal slope is greater than 20% or when the tree to be skidded is isolated from other trees to be exploited, from 6 to 40 m. If the crown is not accessible, it will not be harvested, only the trunk can be used in fuel wood.
If the number of trees connected to a secondary trail exceeds 20 (''), the secondary trail will take the characteristics (width) of a main trail.
Damage : - on the trail - on the edge of the trail: neglected.
MainTrail <- sf::st_linestring(matrix(c(286400, 583130, 286400, 583250, 286655, 583250, 286655, 583130, 286400, 583130) # the return ,ncol=2, byrow=TRUE)) pol1 <- list(matrix(c(286503, 583134, 286503, 583240, 286507, 583240, 286507, 583134, 286503, 583134) # the return ,ncol=2, byrow=TRUE)) pol2 <- list(matrix(c(286650, 583134, 286650, 583240, 286654, 583240, 286654, 583134, 286650, 583134) # the return ,ncol=2, byrow=TRUE)) PolList = list(pol1,pol2) #list of lists of numeric matrices ScndTrail <- sf::st_multipolygon(PolList)
The felling of the tree creates a tree (including crown) on the ground, with dimensions calculated with specific allometries ('advancedloggingparameters').
RIL1/RIL2broken/RIL2: - at 40%: random fall - at 60% ('TreefallSuccessProportion'): base of the tree towards the nearest trail (main or 2ndary)
RIL3/RIL3 timber + fuel wood: - at 40%: random fall - at 60% ('TreefallSuccessProportion'): if RIL3 + fuel & trees < 6 m from the trail and slope <20% (grapple use): - no particular angle to orientate to the trail, only to orient the tree crown* as close as possible to the trail - priority 1: avoid futures and reserves, - priority 2: conformation allowing skidding back to the main trail
Damage: Secondary windfall: all trees under the felled tree (timber or energy) will be considered dead.
inventory <- treefelling(inventory, scenario = "manual", fuel = "0", directionalfelling = "2", MainTrail = MainTrail, ScndTrail = ScndTrail, advancedloggingparameters = loggingparameters()) Treefall <- inventory %>% dplyr::filter(DeathCause == "treefall2nd") Reserve <- inventory %>% dplyr::filter(LoggingStatus == "reserve") Future <- inventory %>% dplyr::filter(LoggingStatus == "future") ggplot() + geom_sf(data = sf::st_as_sf(inventory, coords = c("Xutm", "Yutm"))) + geom_sf(data = getgeometry (inventory, TreePolygon), fill = "red") + # cuted trees geom_sf(data = sf::st_as_sf(Treefall, coords = c("Xutm", "Yutm")), colour = "yellow") + geom_sf(data = sf::st_as_sf(Reserve, coords = c("Xutm", "Yutm")), colour = "green") + geom_sf(data = sf::st_as_sf(Future, coords = c("Xutm", "Yutm")), colour = "pink") sf::st_intersection( # trees under the fallen trees sf::st_make_valid(getgeometry(inventory, TreePolygon)), # "make valid" to avoid self-intersection sf::st_as_sf(inventory, coords = c("Xutm", "Yutm")) ) %>% ggplot() + geom_sf()
By default, within a hollow tree, 2/3 of the log will be usable as timber, 1/3 as fuel wood ('TreeHollowPartForFuel'). For dead trees from the operation (trails, secondary windfall), the whole trunk will be exploitable as fuel wood.
TimberV <- timberharvestedvolume(inventory, scenario = "manual", fuel = "2", advancedloggingparameters = loggingparameters()) TimberLoggedVolume <- TimberV$TimberLoggedVolume NoHollowTimberLoggedVolume <- TimberV$NoHollowTimberLoggedVolume
FuelV <- exploitablefuelwoodvolume(inventory, scenario = "manual", fuel = "2", TimberLoggedVolume = TimberLoggedVolume, NoHollowTimberLoggedVolume = NoHollowTimberLoggedVolume, advancedloggingparameters = loggingparameters()) DamageVolume <- FuelV$DamageVolume # only damage (without purge and hollow trees) FuelVolume <- FuelV$FuelVolume
'inventorycheckformat' check if the input inventory data is compatible with the "Maria" package (see 'Required format of the inventory' section of the vignette)
'addtreedim' compute tree dimensions with the 'advancedloggingparameters' argument: - Tree height (in m) ('TreeHeightAllometry') - Tree Harvestable Volume (m^3) ('TreeHarvestableVolumeAllometry') - Trunk height (in m) ('TrunkHeightAllometry') - Crown height (in m) - Crown diameter (in m) ('CrownDiameterAllometry') - Wood density (g/cm^3) (by BIOMASS package) - Tree above-ground biomass (AGB) (in Mg) (by BIOMASS package)
inventory <- addtreedim(inventorycheckformat(Paracou6_2016), volumeparameters = ForestZoneVolumeParametersTable)
Converts a dataframe with a column of characters, which contains the WKT encoded geometries, into an sf object. The column is converted to sfc.
'createcanopy' function return a dataframe with a column 'Crowns' containing the ellipses (sfc_POLYGON) as trees crown, with their diameter filled in, representing trees from the sky.
canopy <- createcanopy(inventory) # The small ones first so that they are behind the big ones on the plot canopy <- dplyr::arrange(canopy, TreeHeight) ggplot() + geom_sf(data = getgeometry(canopy, Crowns), aes(alpha = TreeHeight), fill = "forestgreen")
'createcanopy' function return an ellipse (sfc_POLYGON) as a crown, with its diameter filled in, representing the tree from the sky.
dat <- inventory[679,] Crown <- treefromthesky(dat) ggplot() + geom_sf(data = sf::st_as_sf(inventory, coords = c("Xutm", "Yutm"))) + geom_sf(data = Crown, fill = "forestgreen") # trees polygons
directionalfellingsuccessdef felling1tree
Orient the input polygon to a given angle and fixed point.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.