Skip to contents

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 Fuel Wood Exploitation (FWE)
  8. Moving the bole

Load LoggingLab and datasets

Install LoggingLab

install.packages("LoggingLab")
# devtools::install_github("VincyaneBadouard/LoggingLab", build_vignettes = TRUE) # Development version

Load the package

library(LoggingLab)
#> Welcome to the LoggingLab package.
library(knitr)
library(kableExtra)
library(ggplot2)
library(raster)
#> Loading required package: sp
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:raster':
#> 
#>     intersect, select, union
#> The following object is masked from 'package:kableExtra':
#> 
#>     group_rows
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

Load the data 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 inventoried plot (1m resolution)
data(DTMParacou)
# Mask of the inventoried plot (1m resolution)
data(PlotMask)
# Relative (vertical and horizontal) distances from nearest channel network, of the inventoried plot
data(CreekDistances)

Required format of the inventory

The columns required for the package are: - Forest (to apply the corresponding volume formula) - idTree - Xutm and Yutm - CodeAlive - Family, Genus, Species - CircCorr The columns optional for the package are: - Plot (1 value) - CensusYear (1 value)

# inventory class
class(Paracou6_2016)
#> [1] "data.frame"
#The name and class of all the data variables
lapply(Paracou6_2016, class)
#> $Forest
#> [1] "character"
#> 
#> $Plot
#> [1] "character"
#> 
#> $PlotArea
#> [1] "numeric"
#> 
#> $SubPlot
#> [1] "integer"
#> 
#> $idTree
#> [1] "integer"
#> 
#> $Protocole
#> [1] "character"
#> 
#> $Xfield
#> [1] "numeric"
#> 
#> $Yfield
#> [1] "numeric"
#> 
#> $Xutm
#> [1] "numeric"
#> 
#> $Yutm
#> [1] "numeric"
#> 
#> $UTMZone
#> [1] "integer"
#> 
#> $Lat
#> [1] "numeric"
#> 
#> $Lon
#> [1] "numeric"
#> 
#> $Family
#> [1] "character"
#> 
#> $Genus
#> [1] "character"
#> 
#> $Species
#> [1] "character"
#> 
#> $BotaSource
#> [1] "character"
#> 
#> $BotaCertainty
#> [1] "numeric"
#> 
#> $VernName
#> [1] "character"
#> 
#> $CensusYear
#> [1] "integer"
#> 
#> $CensusDateCertainty
#> [1] "logical"
#> 
#> $CodeAlive
#> [1] "logical"
#> 
#> $MeasCode
#> [1] "integer"
#> 
#> $Circ
#> [1] "numeric"
#> 
#> $CircCorr
#> [1] "numeric"
#> 
#> $CorrCode
#> [1] "character"

Paracou6_2016 %>%
  dplyr::slice(1:10) %>% 
  kable() %>%
  kable_styling(font_size = 10, latex_options = "scale_down")
Forest Plot PlotArea SubPlot idTree Protocole Xfield Yfield Xutm Yutm UTMZone Lat Lon Family Genus Species BotaSource BotaCertainty VernName CensusYear CensusDateCertainty CodeAlive MeasCode Circ CircCorr CorrCode
Paracou 6 6.25 1 100726 Guyafor 13.5 201.0 286420.1 583135.4 22 5.272669 -52.92713 Annonaceae Oxandra asbeckii Bota 4 muamba 2016 TRUE TRUE 0 39.5 39.5 0
Paracou 6 6.25 1 100729 Guyafor 19.0 196.5 286426.4 583132.2 22 5.272642 -52.92707 Fabaceae Eperua grandiflora Bota 4 Eperua grandiflora 2016 TRUE TRUE 0 114.0 114.0 0
Paracou 6 6.25 1 100739 Guyafor 13.5 182.0 286424.8 583116.8 22 5.272502 -52.92709 Fabaceae Bocoa prouacensis Bota 4 boco 2016 TRUE TRUE 0 48.0 48.0 0
Paracou 6 6.25 1 100741 Guyafor 9.5 179.5 286421.6 583113.4 22 5.272471 -52.92712 Celastraceae Maytenus sp.1-CAY Bota 3 lebi tongo 2016 TRUE TRUE 0 123.0 123.0 0
Paracou 6 6.25 1 100747 Guyafor 14.5 167.5 286429.3 583102.9 22 5.272376 -52.92705 Chrysobalanaceae Licania membranacea Bota 4 santi koko 2016 TRUE TRUE 0 54.0 54.0 0
Paracou 6 6.25 1 100750 Guyafor 18.0 169.0 286432.3 583105.2 22 5.272397 -52.92702 Chrysobalanaceae Licania canescens Bota 4 santi koko 2016 TRUE TRUE 0 88.0 88.0 0
Paracou 6 6.25 1 100760 Guyafor 20.5 147.0 286440.2 583084.3 22 5.272208 -52.92695 Annonaceae Oxandra asbeckii Bota 4 muamba 2016 TRUE TRUE 0 45.0 45.0 0
Paracou 6 6.25 1 100769 Guyafor 10.5 139.0 286432.6 583074.1 22 5.272116 -52.92702 Goupiaceae Goupia glabra Bota 4 goupi 2016 TRUE TRUE 0 161.5 161.5 0
Paracou 6 6.25 1 100771 Guyafor 20.0 133.5 286443.0 583071.0 22 5.272088 -52.92692 Lecythidaceae Eschweilera decolorans Bota 4 maho noir 2016 TRUE TRUE 0 94.5 94.5 0
Paracou 6 6.25 1 100778 Guyafor 30.0 205.5 286434.7 583143.6 22 5.272745 -52.92700 Chrysobalanaceae Licania laxiflora Bota 4 santi koko 2016 TRUE TRUE 0 40.0 40.0 0

Required format of the species exploitability criteria

# speciescriteria class
class(SpeciesCriteria)
#> [1] "tbl_df"     "tbl"        "data.frame"
#The name and class of all the data variables
lapply(SpeciesCriteria, class)
#> $CommercialName
#> [1] "character"
#> 
#> $Genus
#> [1] "character"
#> 
#> $Species
#> [1] "character"
#> 
#> $CommercialLevel
#> [1] "numeric"
#> 
#> $MinFD
#> [1] "numeric"
#> 
#> $UpMinFD
#> [1] "numeric"
#> 
#> $MaxFD
#> [1] "numeric"
#> 
#> $Aggregative
#> [1] "logical"
kable(SpeciesCriteria)
CommercialName Genus Species CommercialLevel MinFD UpMinFD MaxFD Aggregative
st martin rouge Andira spp 2 55 60 120 FALSE
bamba apici Aniba spp 2 55 60 120 FALSE
bagasse Bagassa guianensis 2 55 60 120 FALSE
assao Balizia pedicellaris 2 55 60 120 FALSE
dokali Brosimum parinarioides 2 55 60 120 FALSE
satiné rubané Brosimum rubescens 2 55 60 120 FALSE
dokali mapa Brosimum utile 2 55 60 120 FALSE
bushi amanda Buchenavia spp 2 55 60 120 FALSE
carapa Carapa guiansensis 2 55 60 120 FALSE
carapa Carapa surinamensis 2 55 60 120 FALSE
chawari Caryocar glabrum 2 55 60 120 FALSE
chawari Caryocar microcarpum 2 55 60 120 FALSE
balata pomme Chrysophyllum pomiferum 2 55 60 120 FALSE
balata pomme Chrysophyllum sanguinolentum 2 55 60 120 FALSE
baaka mapa Couma guianensis 2 55 60 120 FALSE
maho cigare Couratari spp 2 55 60 120 FALSE
angélique Dicorynia guianensis 1 55 60 120 TRUE
coeur dehors Diplotropis purpurea 2 55 60 120 FALSE
gaiac de cayenne Dipteryx odorata 2 55 60 120 FALSE
gaiac de cayenne Dipteryx punctata 2 55 60 120 FALSE
acacia franc Enterolobium oldemanii 2 55 60 120 FALSE
acacia franc Enterolobium schomburgkii 2 55 60 120 FALSE
wapa Eperua falcata 2 55 60 120 FALSE
wapa courbaril Eperua grandiflora 2 55 60 120 FALSE
maho coton Eriotheca spp 2 55 60 120 FALSE
jaboty Erisma spp 2 55 60 120 FALSE
maho noir Eschweilera spp 2 55 60 120 FALSE
wandékolé Glycydendron amazonicum 2 55 60 120 FALSE
goupi Goupia glabra 1 55 60 120 FALSE
ebène rouge Handroanthus impetiginosus 2 55 60 120 FALSE
ebène verte Handroanthus serratifolius 2 55 60 120 FALSE
courbaril Hymenaea courbaril 2 55 60 120 FALSE
courbaril Hymenaea oblongifolia 2 55 60 120 FALSE
st martin jaune Hymenolobium spp 2 55 60 120 FALSE
bougouni Inga alba 2 55 60 120 FALSE
bougouni Inga huberi 2 55 60 120 FALSE
cèdre gris Lauraceae spp 2 55 60 120 FALSE
maho rouge Lecythis spp 2 55 60 120 FALSE
canari macaque Lecythis zabucajo 2 55 60 120 FALSE
cèdres durs Licaria spp 2 55 60 120 FALSE
balata franc Manilkara bidentata 1 55 60 120 FALSE
balata franc Manilkara huberi 1 55 60 120 FALSE
mamantin Micropholis egensis 2 55 60 120 FALSE
mamantin Micropholis melinoniana 2 55 60 120 FALSE
balata blanc Micropholis spp 2 55 60 120 FALSE
manil montagne Moronobea coccinea 2 55 60 120 FALSE
cèdre blanc Ocotea argyrophylla 2 55 60 120 FALSE
cèdre blanc Ocotea canaliculata 2 55 60 120 FALSE
cèdre noir Ocotea ceanothifolia 2 55 60 120 FALSE
cèdre noir Ocotea glomerata 2 55 60 120 FALSE
cèdre blanc Ocotea guianensis 2 55 60 120 FALSE
cèdre blanc Ocotea oblonga 2 55 60 120 FALSE
cèdre noir Ocotea schomburgkiana 2 55 60 120 FALSE
cèdre noir Ocotea tomentella 2 55 60 120 FALSE
dodomissinga Parkia decussata 2 55 60 120 FALSE
dodomissinga Parkia gigantocarpa 2 55 60 120 FALSE
dodomissinga Parkia nitida 2 55 60 120 FALSE
dodomissinga Parkia reticulata 2 55 60 120 FALSE
dodomissinga Parkia ulei 2 55 60 120 FALSE
dodomissinga Parkia velutina 2 55 60 120 FALSE
amarante Peltogyne spp 1 55 60 120 FALSE
parcouri Platonia insignis 2 55 60 120 FALSE
kimboto Pradosia spp 2 55 60 120 FALSE
alimiao Pseudopiptadenia psilostachya 2 55 60 120 FALSE
alimiao Pseudopiptadenia suaveolens 2 55 60 120 FALSE
gonfolo rose Qualea rosea 1 55 60 120 TRUE
wacapou guittin Recordoxylon speciosum 2 55 60 120 FALSE
cèdre jaune Rhodostemonodaphne spp 2 55 60 120 FALSE
gonfolo gris Ruizterania albiflora 1 55 60 120 FALSE
grignon franc Sextonia rubra 1 55 60 120 FALSE
simarouba Simarouba amara 2 55 60 120 FALSE
kobé Sterculia spp 2 55 60 120 FALSE
manil marécage Symphonia globulifera 2 55 60 120 FALSE
manil marécage Symphonia sp.1 2 55 60 120 FALSE
anangossi Terminalia spp 2 55 60 120 FALSE
sali Tetragastris spp 2 55 60 120 FALSE
inkassa tiabici Vatairea eritrocarpa 2 55 60 120 FALSE
inkassa Vataireopsis spp 2 55 60 120 FALSE
yayamadou kwatae Virola kwatae 2 55 60 120 FALSE
yayamadou montagne Virola michelii 2 55 60 120 FALSE
yayamadou montagne Virola multicostata 2 55 60 120 FALSE
yayamadou montagne Virola sebifera 2 55 60 120 FALSE
moutende kouali Vochysia guianensis 2 55 60 120 FALSE
achiwa kouali Vochysia neyratii 2 55 60 120 FALSE
kopi kouali Vochysia surinamensis 2 55 60 120 FALSE
wana kouali Vochysia tomentosa 2 55 60 120 FALSE
wacapou Vouacapoua americana 1 55 60 120 FALSE
NA Lecythis poiteaui 0 NA NA NA NA
NA Lecythis praeclara 0 NA NA NA NA
NA Lecythis holcogyne 0 NA NA NA NA
NA Lecythis pneumatophora 0 NA NA NA NA
NA Lecythis chartacea 0 NA NA NA NA
NA Micropholis cayennensis 0 NA NA NA NA
NA Micropholis obscura 0 NA NA NA NA
NA Pradosia cochlearia 0 NA NA NA NA
NA Pradosia huberi 0 NA NA NA NA

Required format of the volume parameters

# volumeparameters class
class(ForestZoneVolumeParametersTable)
#> [1] "data.frame"
#The name and class of all the data variables
lapply(ForestZoneVolumeParametersTable, class)
#> $Forest
#> [1] "character"
#> 
#> $Zone
#> [1] "character"
#> 
#> $aCoef
#> [1] "numeric"
#> 
#> $bCoef
#> [1] "numeric"
kable(ForestZoneVolumeParametersTable)
Forest Zone aCoef bCoef
Acarouany West -0.061776 8.83580
BAFOG West -0.061776 8.83580
Kaw East -0.084516 10.46132
Laussat West -0.061776 8.83580
Montagne_Plomb Central -0.035829 8.76340
Montagne_Tortue East -0.084516 10.46132
Nouragues East -0.084516 10.46132
Organabo Central -0.035829 8.76340
Paracou Central -0.035829 8.76340
Regina_St_Georges East -0.084516 10.46132
Risquetout Central -0.035829 8.76340
Tibourou East -0.084516 10.46132
Tresor East -0.084516 10.46132
Trinite Central -0.035829 8.76340

Required format of the crown diameter allometry parameters

# crowndiameterparameters class
class(ParamCrownDiameterAllometry)
#> [1] "tbl_df"     "tbl"        "data.frame"
#The name and class of all the data variables
lapply(ParamCrownDiameterAllometry, class)
#> $alpha
#> [1] "numeric"
#> 
#> $beta
#> [1] "numeric"
#> 
#> $Taxo
#> [1] "character"
#> 
#> $ScientificName
#> [1] "character"
#> 
#> $Genus
#> [1] "character"
#> 
#> $Species
#> [1] "character"
#> 
#> $Family
#> [1] "character"
kable(dplyr::slice_sample(ParamCrownDiameterAllometry, n=15))
alpha beta Taxo ScientificName Genus Species Family
0.5083044 0.5957550 sp Eriotheca_longitubulosa Eriotheca longitubulosa NA
0.5246527 0.5895021 fam Dichapetalaceae NA NA Dichapetalaceae
0.4755585 0.5720357 fam Icacinaceae NA NA Icacinaceae
0.4662083 0.5734541 sp Eperua_grandiflora Eperua grandiflora NA
0.4479784 0.5624486 sp Protium_tenuifolium Protium tenuifolium NA
0.5056234 0.5822394 sp Glycydendron_amazonicum Glycydendron amazonicum NA
0.4256834 0.5875930 sp Dicorynia_guianensis Dicorynia guianensis NA
0.4935255 0.5874612 gen Anacardium Anacardium NA NA
0.4755039 0.5688203 sp Sloanea_sp.14CAY-ATDN Sloanea sp.14CAY-ATDN NA
0.5042767 0.5806769 fam Apocynaceae NA NA Apocynaceae
0.4785262 0.5667554 sp Jacaranda_copaia Jacaranda copaia NA
0.4947435 0.5747305 sp Carapa_procera Carapa procera NA
0.4902467 0.5925681 sp Licaria_cannella Licaria cannella NA
0.5099851 0.5822255 sp Hevea_guianensis Hevea guianensis NA
0.5661636 0.5686018 gen Manilkara Manilkara NA NA

All the functions of the package

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

Arguments presentation

  • inventory : Input forest inventory for 1 plot and 1 census year (see the inputs formats and metadata in the vignette or in Paracou6_2016.R) (data.frame)
    The columns required for the package are:

  • Forest (to apply the corresponding volume formula)

  • idTree

  • Xutm and Yutm

  • CodeAlive

  • Family, Genus, Species

  • CircCorr The columns optional for the package are:

  • Plot (1 value)

  • CensusYear (1 value)

  • plotmask Inventoried plot mask (SpatialPolygonsDataFrame with a crs in UTM)

  • topography : Digital terrain model (DTM) of the inventoried plot (LiDAR, 1m resolution) (RasterLayer with a crs in UTM) (See ) We advise you to generate your raster with Qgis rather than with the ‘raster’ package on R.

  • creekverticaldistance: Relative vertical distance (1 m resolution) from nearest channel network (RasterLayer with a crs in UTM) (See ) To generate creek distances: in ‘Articles’.

  • creekhorizontaldistance: Relative horizontal distance (1 m resolution) from nearest channel network (RasterLayer with a crs in UTM) (See ) To generate creek distances: in ‘Articles’.

  • speciescriteria : Table of species exploitability criteria : species names, economic interest level, minimum and maximum felling diameter, in the same format of (data.frame)

  • volumeparameters : Volume parameters table (in the same format of ) to compute the harvestable volume of each tree, depend to its geographic zone if several locations (data.frame)(“Guide de Sylviculture”, ONF (‘Office National des Forêts’) of French Guiana, 2014)

  • scenario : Logging scenario: “RIL1”, “RIL2broken”, “RIL2”, “RIL3”, “RIL3fuel”, “RIL3fuelhollow” or “manual”(character) (See ScenariosTable)

  • objective : Objective volume (m3/ha) (numeric)

  • fuel : Fuel wood exploitation: no exploitation = “0”, damages and unused part of logged trees exploitation in fuel = “1”, exploitation of hollow trees, damages and unused part of logged trees in fuel = “2

  • diversification : Possibility to log other species in addition to the main commercial species (species with a value > 1 for commercial in the table) (logical)

  • winching : Tree recovery:
    0”: No cable or grapple
    1”: only cable
    2”: grapple + cable (grapple priority)

  • 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 to reach the objective volume without diversification, = 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 ) to compute the crown diameter of each tree, depend to its DBH (Diameter at Breast Height) and its Species, Genus or Family names (Aubry-Kientz et al.2019). (data.frame)

  • advancedloggingparameters : Other parameters of the logging simulator (list)

  • iter : Number of iterations (numeric). Default = 1.

  • cores : Number of cores for parallelization (numeric). Default = 1.

The scenarios

data(ScenariosTable)
kable(ScenariosTable)
Type SpatialDataType Objective Diversification Winching DirectionalFelling
RIL1 SRTM 20-25 FALSE 0 0
RIL2broken LIDAR 20-25 FALSE 0 0
RIL2 LIDAR 20-25 FALSE 1 0
RIL3 LIDAR 25-30 TRUE 2 2
RIL3fuel LIDAR 25-30 TRUE 2 2
RIL3fuelhollow LIDAR 25-30 TRUE 2 2

Advanced logging parameters

Default values

Numeric values

  • Minimum DBH for inclusion in the forest inventory = 10 cm

  • Maximum trail centerline slope = 22 %

  • Maximum trail cross slope = 4 %

  • Maximum slope accessible by the grapple = 20 %

  • Maximum slope around the tree to access it with cable = 35 %

  • Plateau maximum slope = 5 %

  • Distance to compute slope = 3 m (for each side)

  • Water sources buffer zone = 30 m

  • Buffer zone based on relative elevation to the nearest water source = 2 m

  • Minimum main trail width = 5 m

  • Maximum main trail width = 6 m

  • Secondary trail width = 4 m

  • Minimum DBH of trees to be avoided by trails = 50 cm

  • Distance of DTM resampling to erase microtopographic variation = 5 m

  • Secondary trails smoothing factor = 5 (unitless)

  • Cable length = 40 m

  • Grapple length = 6 m

  • Minimum distance to consider a tree “isolated” from other trees of its species, in the aggregative species case (, ‘Aggregative’ column) = 100 m

  • Future trees minimum diameter = 35 cm (future trees are only commercial species of the 1st economic level)

  • Proportion of successful directional felling events = 60 %

  • Minimum orientation of the tree fall to the trail = 30 degree

  • Maximum orientation of the tree fall to the trail = 45 degree

  • Part taken from hollow trees for fuel exploitation = 1/3

  • Proportion of the tree crown biomass used as fuel wood (Eleotério et al. 2019) = 2/3 (Branches diameter >= 5 cm)

  • Purge (unused part of the harvested log) = 0.14 m^3 of fuel wood/m^3 of logged trees

  • Maximum trail density = 200 m/ha (has no impact on the simulation. A message will be sent to inform if this threshold has been exceeded)

  • Maximum landing area = 1500 m2 (has no impact on the simulation. A message will be sent to inform if this threshold has been exceeded)

  • Cost matrix for optimized trail layout: Gives an increasing cost according to a slope gradient, and different costs on certain cases:

  • “Initial” (default = 1000)

  • “Access” (default = Inf)

  • “BigTrees” (default = 500)

  • “Reserves” (default = 500)

  • “Futures” (default = 50)

  • “MainTrails” (default = 1E-4)

  • “SecondTrails” (default = 0.1)

Models

  • Tree harvestable volume allometry (French Guiana ONF formula): aCoef + bCoef * (DBH/100)^2, aCoef and bCoef depend on the forest location, stored in , 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 (Aubry-Kientz et al.2019): 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.

  • Rotten model, estimates the tree probability of being probed hollow: 1 / (1 + exp(-(-5.151 + 0.042 DBH))), with DBH in cm (developed by S.Schmitt)

  • Visibly defect model, estimates the commercial tree probability to have visible defects: 1 / (1 + exp(-(-3.392 + 0.357 * Log(DBH)))) with DBH in cm (developed by V.Badouard)

  • Treefall2ndDeathModel Estimates the probability of a tree dying when it is in the area disturbed by the felling of a tree, according to the DBH of the tree whose probability of dying is estimated. Default: 1 / (1 + exp(-(-0.47323 + -0.02564 * DBH))) with DBH in cm (developed by M.Rojat)

Paying attention to inputs - important source of error

Common error sources:
- no crs
- crs with accent
- topography and plotmask do not match
- topography import as R Worspace (you must import it as a .tif file)
- Forest name of the inventory doesn’t match with the Forest name in volumeparameters table

Harvest in 1 function

Description: Simulates a timber and fuel wood exploitation on a forest plot, in the way of Reduced Impact Logging (RIL). It covers: harvestable zones definition, tree selection, secondary skidding trails layout, tree felling, timber harvested, fuel wood volume and short-term damages quantification. This simulator is individual-centred, spatialised, and takes into account the topography and the hydrographic network.

Rslt <- loggingsimulation1(Paracou6_2016,
                           plotmask = PlotMask, topography = DTMParacou,
                           creekverticaldistance = CreekDistances$distvert,
                           creekhorizontaldistance = CreekDistances$disthorz,
                           speciescriteria = SpeciesCriteria,
                           volumeparameters = ForestZoneVolumeParametersTable,
                           scenario = "manual", objective = 20,
                           fuel = "2", winching = "2", directionalfelling = "2", 
                           diversification = TRUE, specieslax = FALSE, objectivelax = TRUE,
                           crowndiameterparameters = ParamCrownDiameterAllometry,
                           advancedloggingparameters = loggingparameters())
#> As the harvestable volume (= 181.4m^3)
#>                 was higher (by 106.4m^3)
#>                 than the objective volume, the Minimum Falling Diameter (MinFD) of the 1st and 2nd economic ranks species
#>                   were increased to UpMinFD. The objective volume has now been reached.
#> Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is FALSE
#> It was not possible to avoid future/reserve trees in the felling of a tree

With the ability to iterate and parallelize:

Rslt_iter <- loggingsimulation(Paracou6_2016,
                               plotmask = PlotMask, topography = DTMParacou,
                               creekverticaldistance = CreekDistances$distvert,
                               creekhorizontaldistance = CreekDistances$disthorz,
                               speciescriteria = SpeciesCriteria,
                               volumeparameters = ForestZoneVolumeParametersTable,
                               scenario = "manual", objective = 20,
                               fuel = "2", winching = "2", directionalfelling = "2", 
                               diversification = TRUE, specieslax = FALSE,
                               objectivelax = TRUE,
                               crowndiameterparameters = ParamCrownDiameterAllometry,
                               advancedloggingparameters = loggingparameters(),
                               iter = 2, cores = 2)

The harvestable volume may change from one simulation to another because the identification of defect trees contains a random component.

SimulTime <- microbenchmark::microbenchmark(
  
  loggingsimulation1(
    inventory = Paracou6_2016,
    plotmask = PlotMask, topography = DTMParacou,
    creekverticaldistance = CreekDistances$distvert,
    creekhorizontaldistance = CreekDistances$disthorz, 
    speciescriteria = SpeciesCriteria,
    volumeparameters = ForestZoneVolumeParametersTable,
    scenario = "RIL3",
    objectivelax = TRUE,
    crowndiameterparameters = ParamCrownDiameterAllometry), # 2005.819 s
  
  loggingsimulation(
    inventory = Paracou6_2016,
    plotmask = PlotMask, topography = DTMParacou,
    creekverticaldistance = CreekDistances$distvert,
    creekhorizontaldistance = CreekDistances$disthorz, 
    speciescriteria = SpeciesCriteria,
    volumeparameters = ForestZoneVolumeParametersTable,
    scenario = "RIL3", objectivelax = TRUE,
    crowndiameterparameters = ParamCrownDiameterAllometry, # 1632.843   s
    iter = 2, cores = 2), times = 1L
)
# RIL1_Rslt <- loggingsimulation(Paracou6_2016,
#                                topography = DTMParacou, verticalcreekheight  = DTMParacou,
#                                speciescriteria = SpeciesCriteria,
#                                volumeparameters = ForestZoneVolumeParametersTable,
#                                scenario = "RIL1", specieslax = FALSE, objectivelax = TRUE,
#                                crowndiameterparameters = ParamCrownDiameterAllometry,
#                                advancedloggingparameters = loggingparameters(), iter = 1, cores = 1)
# loggingsummary1(RIL1_Rslt)
# # Without diversification the harvestable volume is too poor
# RIL2broken_Rslt <- loggingsimulation(Paracou6_2016,
#                                      topography = DTMParacou, verticalcreekheight  = DTMParacou,
#                                      speciescriteria = SpeciesCriteria,
#                                      volumeparameters = ForestZoneVolumeParametersTable,
#                                      scenario = "RIL2broken", specieslax = FALSE, objectivelax = TRUE,
#                                      crowndiameterparameters = ParamCrownDiameterAllometry,
#                                      advancedloggingparameters = loggingparameters(), iter = 1, cores = 1)
# loggingsummary1(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, verticalcreekheight  = DTMParacou,
#                                speciescriteria = SpeciesCriteria,
#                                volumeparameters = ForestZoneVolumeParametersTable,
#                                scenario = "RIL2", specieslax = FALSE, objectivelax = TRUE,
#                                crowndiameterparameters = ParamCrownDiameterAllometry,
#                                advancedloggingparameters = loggingparameters(), iter = 1, cores = 1)
# loggingsummary1(RIL2_Rslt)
# # Without diversification the harvestable volume is too poor
# RIL3_Rslt <- loggingsimulation(Paracou6_2016,
#                                topography = DTMParacou, verticalcreekheight  = DTMParacou,
#                                speciescriteria = SpeciesCriteria,
#                                volumeparameters = ForestZoneVolumeParametersTable,
#                                scenario = "RIL3", specieslax = FALSE, objectivelax = TRUE,
#                                crowndiameterparameters = ParamCrownDiameterAllometry,
#                                advancedloggingparameters = loggingparameters(), iter = 1, cores = 1)
# 
# RIL3_inventory <- RIL3_Rslt$inventory
# loggingsummary1(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, verticalcreekheight  = DTMParacou,
#                                    speciescriteria = SpeciesCriteria,
#                                    volumeparameters = ForestZoneVolumeParametersTable,
#                                    scenario = "RIL3fuel", specieslax = FALSE, objectivelax = TRUE,
#                                    crowndiameterparameters = ParamCrownDiameterAllometry,
#                                    advancedloggingparameters = loggingparameters(), iter = 1, cores = 1)
# loggingsummary1(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, verticalcreekheight  = DTMParacou,
#                                          speciescriteria = SpeciesCriteria,
#                                          volumeparameters = ForestZoneVolumeParametersTable,
#                                          scenario = "RIL3fuelhollow",
#                                          specieslax = FALSE, objectivelax = TRUE,
#                                          crowndiameterparameters = ParamCrownDiameterAllometry,
#                                          advancedloggingparameters = loggingparameters(),
#                                          iter = 1, cores = 1)
# RIL3fuelhollow_inventory <- RIL3fuelhollow_Rslt$inventory
# # loggingsummary1(RIL3fuelhollow_Rslt)

Results summary

Description: Returns a summary of the outputs of the loggingsimulation function (console display): a reminder of the inputs and the iterations statistics (mean, standard deviation, quantiles) of the outgoing figures.

data(LoggingSimulationOutputs) # Outputs of one logging simulation
data(LoggingSimulationOutputs_iter) # Outputs of one logging simulation (2 iterations and 2 cores)
loggingsummary1(LoggingSimulationOutputs)
#> inventory : Paracou6_2016 
#> scenario : manual 
#> objective : 10 m3/harvestable ha
#> fuel : 2 
#> diversification : TRUE 
#> winching : 2 
#> directionalfelling : 2 
#> specieslax : FALSE 
#> objectivelax : TRUE 
#> Harvestable area : 3.75 ha
#> Objective volume : 37.5 m3
#> Initial harvestable volume : 202.4 m3,  54 m3/harvestable ha
#> Timber logged volume : 35.8 m3,  9.5 m3/harvestable ha
#> No hollow timber logged volume : 35.8 m3,  9.5 m3/harvestable ha
#> Timber extracted volume (timber volume after purge : 30.8 m3,  8.2 m3/harvestable ha
#> Fuel wood biomass : 56.5 ton,  15.1 ton/harvestable ha
#> Logging residual biomass : 5.6 ton,  1.5 ton/harvestable ha
#> Total forest biomass lost : 108.3 ton
#> Trails density : 39.6 m/ha
#> Adjusted trails density : 43.1 m/ha
#> 
#> Please note that all volumes in m3/ha are per exploitable hectare, not per plot hectare.
loggingsummary(LoggingSimulationOutputs_iter) # Outputs of one logging simulation (2 iterations and 2 cores))
#> inventory : inventory 
#> scenario : manual 
#> objective : 10 m3/harvestable ha
#> fuel : 2 
#> diversification : TRUE 
#> winching : 0 
#> directionalfelling : 2 
#> specieslax : FALSE 
#> objectivelax : TRUE 
#> Harvestable area (ha):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>    2.3    0.0    2.3    2.0    2.3    2.0    2.3 
#> 
#> Objective volume (m3):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   23.3    0.0   23.3   23.0   23.3   23.0   23.3 
#> 
#> Initial harvestable volume (m3):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   91.0    9.2   84.5   88.0   91.0   94.0   97.5 
#> Units: [m3/ha]
#>     Mean       Sd      Min   Q1.25%   Median   Q3.75%      Max 
#> 39.56522      Inf 36.73913 44.00000 39.56522 47.00000 42.39130 
#> 
#> Timber logged volume (m3):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   21.3    0.0   21.3   21.0   21.3   21.0   21.3 
#> Units: [m3/ha]
#>     Mean       Sd      Min   Q1.25%   Median   Q3.75%      Max 
#>  9.26087      NaN  9.26087 10.50000  9.26087 10.50000  9.26087 
#> 
#> No hollow timber logged volume (m3):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   17.3    0.0   17.3   17.0   17.3   17.0   17.3 
#> Units: [m3/ha]
#>     Mean       Sd      Min   Q1.25%   Median   Q3.75%      Max 
#> 7.521739      NaN 7.521739 8.500000 7.521739 8.500000 7.521739 
#> 
#> Timber extracted volume (timber volume after purge) (m3):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   18.9    0.0   18.9   19.0   18.9   19.0   18.9 
#> Units: [m3/ha]
#>     Mean       Sd      Min   Q1.25%   Median   Q3.75%      Max 
#> 8.217391      NaN 8.217391 9.500000 8.217391 9.500000 8.217391 
#> 
#> Fuel wood biomass (ton):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   41.8    3.9   39.0   40.0   41.8   43.0   44.6 
#> Units: [ton/ha]
#>     Mean       Sd      Min   Q1.25%   Median   Q3.75%      Max 
#> 18.17391      Inf 16.95652 20.00000 18.17391 21.50000 19.39130 
#> 
#> Logging residual biomass (ton):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>    4.1    0.0    4.1    4.0    4.1    4.0    4.1 
#> Units: [ton/ha]
#>     Mean       Sd      Min   Q1.25%   Median   Q3.75%      Max 
#> 1.782609      NaN 1.782609 2.000000 1.782609 2.000000 1.782609 
#> 
#> Total forest biomass lost (ton):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   76.7    7.1   71.7   74.0   76.7   79.0   81.7 
#> 
#> Trails density (m/ha):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   45.3    4.9   41.9   44.0   45.3   47.0   48.8 
#> 
#> Adjusted trails density (m/ha):
#>   Mean     Sd    Min Q1.25% Median Q3.75%    Max 
#>   45.3    4.9   41.9   44.0   45.3   47.0   48.8 
#> 
#> Please note that all volumes in m3/ha and biomass in ton/ha are per exploitable hectare, not per plot hectare.

Decomposed harvesting

Check & format input inventory data for the “LoggingLab” package

Description: * inventorycheckformat() checks if the input inventory data is compatible with the ‘LoggingLab’ package and returns the inventory if the inventory is in the required format or stop the function if the format is not the one required. * cleaninventory()returns the inventory with only alive trees within the inventoried plot.

inventory <- inventorycheckformat(Paracou6_2016)
inventory <- cleaninventory(inventory, PlotMask, loggingparameters())

Compute tree dimensions

Description: Compute tree dimensions (tree, trunk and crown height, crown diameter, harvestable volume, wood density, and AGB)

inventory <- addtreedim(inventory, volumeparameters = ForestZoneVolumeParametersTable)

Main skidding trails opening

Description: Generates the main trail of the inventoried plot, as lines at the edge and outside of the plot.

MainTrails <- maintrailextract(DTMParacou)

# # To map a raster with ggplot : https://erinbecker.github.io/r-raster-vector-geospatial/02-raster-plot/index.html
# ## convert to a df for plotting in two steps,
# ## First, to a SpatialPointsDataFrame
# DTMParacou_pts <- rasterToPoints(DTMParacou, spatial = TRUE)
# ## Then to a 'conventional' dataframe
# DTMParacou_df  <- data.frame(DTMParacou_pts)


plot(DTMParacou)
plot(MainTrails, add = T)

Harvestable area definition

Description: Defines harvestable zones and machine-accessible zones within the plot.

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

HarvestableAreaOutputs <- harvestableareadefinition(
  topography = DTMParacou,
  creekverticaldistance = CreekDistances$distvert,
  creekhorizontaldistance = CreekDistances$disthorz,
  maintrails = MainTrails,
  plotmask = PlotMask,
  scenario = "manual", winching = "1", # with an zone for cable only
  advancedloggingparameters = loggingparameters()
)
HarvestablePolygons <- HarvestableAreaOutputs$HarvestablePolygons
PlotSlope <- HarvestableAreaOutputs$PlotSlope
HarvestableArea <- HarvestableAreaOutputs$HarvestableArea
MachinePolygons <- HarvestableAreaOutputs$MachinePolygons

library(sf)
ggplot() +
  # Harvestable zones
  geom_sf(data = HarvestablePolygons,
          fill = "olivedrab", alpha = 0.1) +
  geom_sf(data = MachinePolygons,
          fill = "olivedrab", alpha = 0.5) +
  labs(alpha = "Harvestable") +
  labs(title = "Paracou P6 - Harvestable zones") +
  scale_colour_manual(values = c("Harvestable area" = "olivedrab"))

Tree selection

Description: Selects trees to harvest, and future and reserve trees.

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 )) from other individuals of the same species in the aggregative species case (, ‘Aggregative’ column). - on slopes < 22% (’TreeMaxSlope’in ) - off the main trails.

If the harvestable volume is higher than the objective volume, and that diversification was not chosen, MinFD of the 1st economic rank species only is increased. If the diversification is allowed, MinFD of 1st and 2nd economic level species is increased. Then, the trees to be harvested are chosen 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. - in the harvestable zones

Reserve trees will be: - future trees - in the same number as trees to be harvested.

In 1 function

treeselectionoutputs <- treeselection(inventory,
                                      topography = DTMParacou,
                                      speciescriteria = SpeciesCriteria,
                                      scenario ="manual", objective = 20,
                                      fuel = "2", winching = "2",
                                      diversification = FALSE, specieslax = FALSE,
                                      objectivelax = TRUE,
                                      harvestablearea = HarvestableArea,
                                      plotslope = PlotSlope,maintrails = MainTrails,
                                      harvestablepolygons = HarvestablePolygons,
                                      advancedloggingparameters = loggingparameters())
#> The harvestable volume (= 39.2m^3) was lower
#>               (by 35.7m^3) than your objective volume.
#>               You have chosen to continue logging without diversifying in this case.

Decomposed tree selection

Joins commercial criteria table
inventory <- commercialcriteriajoin(inventory, SpeciesCriteria)
Harvestable trees identification

Description: identifies harvestable trees among species of commercial interest, with exploitable diameters, then according to criteria of slope, distance to other conspecific individuals if the species is aggregative, and the absence of visible defects.

harvestableOutputs <- harvestable(inventory, topography = DTMParacou,
                                  diversification = TRUE, specieslax = FALSE,
                                  plotslope = PlotSlope,maintrails = MainTrails,
                                  harvestablepolygons = HarvestablePolygons,
                                  scenario = "manual", winching = "0",
                                  advancedloggingparameters = loggingparameters())
inventory <- harvestableOutputs$inventory
HVinit <- harvestableOutputs$HVinit
Trees to be exploited selection

Description: selects the trees to log among the exploitable trees, according to the objective volume and the exploitable volume on the plot.

inventory <- selected(inventory, topography = DTMParacou,
                      scenario = "manual", fuel = "2", diversification = TRUE,
                      VO = 125, HVinit = HVinit, specieslax = FALSE, objectivelax = TRUE,
                      advancedloggingparameters = loggingparameters())$inventory
#> The harvestable volume (= 102.6m^3) was lower
#>               (by 22.4m^3) than your objective volume.
#>               You have chosen to continue logging in this case.
Future & reserve trees designation

Description: designates which trees will be harvested in future seasons: “future trees”, and which should be protected as seed trees: “reserve trees”.

inventory <- futurereserve(inventory, SpeciesCriteria)

Secondary skidding trails layout

Description: Starting from the main skidding trails, draw secondary skidding trails on the zones accessible to the machines, allowing to collect the selected trees with the chosen machines (“winching” argument). The layout is optimised to reduce the distance covered while respecting topographical constraints and avoiding trees to protect.

Skidding trail (main, secondary): allows wood to be transported from the parcel to truck routes.

The secondary skidding 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.

ScndTrailOutputs <- secondtrailsopening(topography = DTMParacou,
                                        plotmask = PlotMask,
                                        maintrails = MainTrails,
                                        plotslope = HarvestableAreaOutputsCable$PlotSlope,
                                        harvestablepolygons = HarvestableAreaOutputsCable$HarvestablePolygons,
                                        machinepolygons = HarvestableAreaOutputsCable$MachinePolygons,
                                        treeselectionoutputs = treeselectionoutputs,
                                        scenario = "manual",
                                        winching = "2",
                                        fuel = "2",
                                        advancedloggingparameters = loggingparameters())

inventory <- ScndTrailOutputs$inventory
SmoothedTrails <- ScndTrailOutputs$SmoothedTrails
MainTrailsAccess <- ScndTrailOutputs$MainTrailsAccess
TrailsDensity <- ScndTrailOutputs$TrailsDensity
TrailsIdentity <- ScndTrailOutputs$TrailsIdentity
RawSecondTrails <- ScndTrailOutputs$RawSecondTrails
CostRasterAgg <- ScndTrailOutputs$CostRasterAgg


# pol1 <- list(matrix(c(286503, 582925,
#                       286503, 583240,
#                       286507, 583240,
#                       286507, 582925,
#                       286503, 582925) # the return
#                     ,ncol=2, byrow=TRUE))
# pol2 <- list(matrix(c(286650, 582925,
#                       286650, 583240,
#                       286654, 583240,
#                       286654, 582925,
#                       286650, 582925) # the return
#                     ,ncol=2, byrow=TRUE))
# 
# PolList = list(pol1,pol2) #list of lists of numeric matrices
# ScndTrail <- sf::st_as_sf(sf::st_sfc(sf::st_multipolygon(PolList)))
# ScndTrail <- sf::st_set_crs(ScndTrail, sf::st_crs(MainTrails))

Tree felling

Description: Simulates the tree felling, with the success or failure of the direction of the tree fall, foot to the trail, with an angle to the trail and avoiding the trees to protect, as desired. If FWE, the tree will be directed with its crown towards the trail (if the orientation is successful) if it can be retrieved with a grapple.

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

  • otherwise (RIL3, RIL3 + fuel & trees > 6 m from the trail and/or slope >20%)(cable use):
  • 30-45◦ orientation (‘MinTreefallOrientation’; ‘MaxTreefallOrientation’)
  • base to nearest trail
  • priority 1: avoid futures and reserves
  • priority 2: conformation allowing skidding back to the main trail

Damage: Secondary windfall: Not all trees under the felled tree (timber or energy) will be considered dead. The probability of a tree dying under a felled tree is estimated by the model ‘Treefall2ndDeathModel’, according to the DBH of the tree whose probability of dying is estimated.

In 1 function

inventory <- treefelling(inventory, scenario = "manual", fuel = "2",
                         winching = "2", directionalfelling = "2",
                         maintrailsaccess = MainTrailsAccess,
                         scndtrail = SmoothedTrails,
                         advancedloggingparameters = loggingparameters())

Adjusted secondary skidding trails layout (for fuel wood harvesting only (fuel = “1” or “2”))

Description: In the FWE (Fuel Wood Exploitation) case, the layout of the skidding trails is redefined to favour the recovery of trees through the crown (only with a grapple) in order to use the crowns for fuel wood.

ScndTrailAdjustOutputs <- secondtrailsadjusted(inventory = inventory,
                                               topography = DTMParacou,
                                               plotmask = PlotMask,
                                               maintrails = MainTrails,
                                               plotslope = PlotSlope,
                                               harvestablepolygons = HarvestablePolygons,
                                               machinepolygons = MachinePolygons,
                                               maintrailsaccess = MainTrailsAccess,
                                               scenario = "manual",
                                               winching = "2",
                                               advancedloggingparameters = loggingparameters())

inventory <- ScndTrailAdjustOutputs$inventory
AdjustSmoothedTrails <- ScndTrailAdjustOutputs$SmoothedTrails
AdjustTrailsDensity <- ScndTrailAdjustOutputs$TrailsDensity
AdjustTrailsIdentity <- ScndTrailAdjustOutputs$TrailsIdentity
AdjustRawSecondTrails <- ScndTrailAdjustOutputs$RawSecondTrails

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 (skidding trails, secondary windfall), the whole trunk will be exploitable as fuel wood.

Compute the timber harvested volume

Description: Computes the timber harvested volume in healthy trees exploited for timber, and in the hollow trees if they are also harvested for fuel wood.

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

Compute the exploitable fuel wood volume

Description: Computes the harvestable fuel wood biomass in healthy trees exploited for timber (their unused part), in the hollow trees and in the damage trees (caused by trails, secondary windfall). Computes also the the unused degraded tree biomass.

FuelV <- harvestablefuelwood(inventory, scenario = "manual", fuel = "2",
                             TimberLoggedVolume = TimberLoggedVolume,
                             NoHollowTimberLoggedVolume = NoHollowTimberLoggedVolume,
                             advancedloggingparameters = loggingparameters())
inventory <- FuelV$inventory
LoggingResidualBiomass <- FuelV$LoggingResidualBiomass
FuelWoodBiomass <- FuelV$FuelWoodBiomass

Outputs

Format: A large list of 39 elements

  • inventory : Output forest inventory (data.frame)

Numeric values:

  • HarvestableArea : Harvestable area in ha (numeric)
  • VO : Objective volume in m3 (numeric)
  • HVinit : Initial harvestable volume in m3 (numeric)
  • TimberLoggedVolume : Timber logged volume in m3 (numeric)
  • NoHollowTimberLoggedVolume : No hollow timber logged volume (only healthy trees) in m3 (numeric)
  • TimberExtractedVolume : Timber volume after purge in m3 (numeric)
  • FuelWoodBiomass : Fuel wood biomass in ton (numeric)
  • LoggingResidualBiomass : The unused degraded biomass in ton (numeric)
  • LostBiomass : Total lost biomass in ton (numeric)
  • TrailsDensity : Skidding trails density (preliminary if FWE) in m/ha (units)
  • AdjustTrailsDensity : Adjusted skidding trails density if FWE in m/ha (units)

Spatial objects:

  • MainTrails : Main skidding trails (sf)

  • HarvestablePolygons : Harvestable zones (MULTIPOLYGON with crs)

  • MachinePolygons : Exploitable zones accessible to machines (MULTIPOLYGON with crs)

  • PlotSlope : Slopes of the plot (in radians) (RasterLayer with crs)

  • SmoothedTrails : Smoothed secondary skidding trails (MULTIPOLYGON with crs)

  • MainTrailsAccess : Random access point of main trail for each harvestable zone (POINT with crs)

  • TrailsIdentity : Information on sections of the trails (matrix), with

  • LineID:

  • LoggedTrees: idTree of trees reached by the trails

  • TypeExpl: type of winching

  • RawSecondTrails : Non-smoothed secondary skidding trails (SpatialLines with crs)

  • CostRasterAgg : The cost raster (RasterLayer)

  • AdjustSmoothedTrails : Adjusted smoothed secondary skidding trails for FWE (MULTIPOLYGON with crs)

  • AdjustTrailsIdentity : Adjusted version of TrailsIdentity for FWE (matrix)

  • AdjustRawSecondTrails : Adjusted non-smoothed secondary skidding trails for FWE (SpatialLines with crs)

POINTS:

  • HarvestableTreesPoints : Harvestable trees points (sf)
  • SelectedTreesPoints : Selected trees points (sf)
  • FutureTreesPoints : Future trees points (sf)
  • ReserveTreesPoints : Reserve trees points (sf)
  • HollowTreesPoints : Hollow trees points (sf)
  • EnergywoodTreesPoints : Energywood trees points (sf)

INPUTS reminder:

  • INPUTinventory : Input forest inventory (data.frame)
  • scenario : Input value for ‘scenario’ argument(character)
  • objective : Input value for ‘objective’ argument (numeric)
  • fuel : Input value for ‘fuel’ argument (character)
  • diversification : Input value for ‘diversification’ argument (logical)
  • winching : Input value for ‘winching’ argument (numeric)
  • directionalfelling : Input value for ‘directionalfelling’ argument (character)
  • specieslax : Input value for ‘specieslax’ argument (logical)
  • objectivelax : Input value for ‘objectivelax’ argument (logical)

Tool functions

‘inventorycheckformat’ check if the input inventory data is compatible with the “LoggingLab” 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)

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") +
  labs(alpha = "Tree height")

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 %>% 
  filter(CrownDiameter == max(CrownDiameter))

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

Rotate the input polygon with a given angle and around a fix point.

With: p a polygon (POLYGON or sfc_POLYGON) angle the angle in degrees in the clockwise direction (numeric) fixed a fix point around which the polygon will be rotated (POINT)

Function adapted from Jeffrey Evans’ ‘rotate.polygon’ function: https://github.com/jeffreyevans/spatialEco/blob/master/R/rotate.polygon.R

NotAPol <- matrix(c(286503, 583134,
                    286503, 583240,
                    286507, 583240,
                    286507, 583134,
                    286503, 583134)
                  ,ncol=2, byrow=TRUE)
Pol <- sf::st_polygon(list(NotAPol))

Point <- sf::st_point(c(286505,583134))

Rslt <- rotatepolygon(p = Pol, angle = 10, fixed = Point)
plot(Rslt)

References

  • Aubry-Kientz, Mélaine, et al. “A comparative assessment of the performance of individual tree crowns delineation algorithms from ALS data in tropical forests.” Remote Sensing 11.9 (2019): 1086.
  • Eleotério, Jackson Roberto, et al. “Aboveground biomass quantification and tree-level prediction models for the Brazilian subtropical Atlantic Forest.” Southern Forests: a Journal of Forest Science 81.3 (2019): 261-271.