knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>", echo = T, message = T, warning = F, cache = F
)

The different stages of Reduced Impact Logging (RIL) described by the ONF (Office National des Forêts) of French Guiana

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

Load Maria and datasets

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)

Required format of the inventory

\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")

Required format of the species exploitability criteria

\code{\link{SpeciesCriteria}}

# speciescriteria class
class(SpeciesCriteria)
#The name and class of all the data variables
lapply(SpeciesCriteria, class)
kable(SpeciesCriteria)

Required format of the volume parameters

\code{\link{ForestZoneVolumeParametersTable}}

# volumeparameters class
class(ForestZoneVolumeParametersTable)
#The name and class of all the data variables
lapply(ForestZoneVolumeParametersTable, class)
kable(ForestZoneVolumeParametersTable)

Required format of the crown diameter allometry parameters

\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))

All the functions of the package

loggingsimulation loggingparameters scenariosparameters inventorycheckformat addtreedim treeselection ONFGuyafortaxojoin harvestable selected futurereserve treefelling createcanopy treefromthesky directionalfellingsuccessdef felling1tree rotatepolygon getgeometry timberharvestedvolume exploitablefuelwoodvolume

Arguments presentation

The scenarios

\code{\link{ScenariosTable}}

data(ScenariosTable)
kable(ScenariosTable)

Advanced logging parameters

\code{\link{loggingparameters}}

Default values

Numeric values

Models

Harvest in 1 function

# 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)

Results summary

# loggingsummary(Rslt)

Decomposed harvesting

Check & format input inventory data for the "Maria" package

inventory <- inventorycheckformat(Paracou6_2016)

Compute tree dimensions

Tree and crown height and diameter, harvestable volume, wood density, and AGB

inventory <- addtreedim(inventory, volumeparameters = ForestZoneVolumeParametersTable)

Harvestable area definition

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.

Tree selection

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.

In 1 function

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())

Decomposed tree selection

Joins commercial criteria table

inventory <- ONFGuyafortaxojoin(inventory, SpeciesCriteria)

Harvestable trees identification

harvestableOutputs <- harvestable(inventory, topography = DTMParacou,
                                  diversification = TRUE, plotslope = PlotSlope, specieslax = FALSE,
                                  maintrails = MainTrails, harvestablepolygons = HarvestablePolygons,
                                  advancedloggingparameters = loggingparameters())
inventory <- harvestableOutputs$inventory
HVinit <- harvestableOutputs$HVinit

Trees to be exploited selection

inventory <- selected(inventory, scenario = "manual", fuel = "2",
                      diversification = TRUE, VO = 125, HVinit = HVinit, specieslax = FALSE,
                      objectivelax = TRUE, topography = DTMParacou,
                      advancedloggingparameters = loggingparameters())$inventory

Future & reserve trees designation

inventory <- futurereserve(inventory, SpeciesCriteria)

Secondary trails layout

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)

Tree felling

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.

In 1 function

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()

Quantify the volumes achieved

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.

Compute the timber harvested volume

TimberV <- timberharvestedvolume(inventory, scenario = "manual", fuel = "2",
                                 advancedloggingparameters = loggingparameters())

TimberLoggedVolume <- TimberV$TimberLoggedVolume
NoHollowTimberLoggedVolume <- TimberV$NoHollowTimberLoggedVolume

Compute the exploitable fuel wood volume

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

Tool functions

'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)

Get geometry

Converts a dataframe with a column of characters, which contains the WKT encoded geometries, into an sf object. The column is converted to sfc.

Create the canopy

'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")

1 tree from the sky

'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

Rotate a polygon

Orient the input polygon to a given angle and fixed point.




thomasgaquiere/Maria documentation built on Dec. 24, 2021, 1:20 a.m.