LoggingLab
Un outil R permettant de simuler l’exploitation forestière sélective à impact réduit dans les forêts tropicales à l’aide de données d’inventaire forestier
CIRAD
Oct 27, 2025
Le package LoggingLab
de R, développé dans le contexte de l’exploitation forestière sélective en Guyane française, permet de simuler chaque étape de l’exploitation forestière sélective de manière spatialement explicite. Cela permet d’évaluer et de comparer avec précision les effets de différentes pratiques d’exploitation forestière sur l’écosystème. L’objectif de cet atelier pratique sera de présenter et d’utiliser ensemble les fonctions générales de ce package.
Simulation de coupe sélective à partir des données d’inventaire forestier.
Les étapes sont les suivantes :
Nous utiliserons le package LoggingLab pour R (Badouard et al. 2024) afin de simuler l’exploitation forestière à impact réduit dans une forêt tropicale. Le package doit être installé à partir de son dépôt sur Github, car il n’est pas encore disponible sur CRAN.
Nous utiliserons tidyverse
pour manipuler des tableaux et créer des graphiques, sf
pour manipuler des objets spatiaux et terra
et tidyterra
pour manipuler des données raster.
Les données et paramètres nécessaires pour utiliser LoggingLab
sont les suivants :
L’inventaire doit contenir le diamètre, l’identification botanique et les coordonnées de tous les arbres dont le diamètre est supérieur à une certaine valeur (généralement DBH >= 10 cm).
Pour l’instant, le simulateur fonctionne sur de petites parcelles (quelques hectares) et ne représente pas l’ensemble des opérations d’une concession, car il se concentre sur la quantification détaillée des dommages post-opérationnels conformément aux pratiques.
Les colonnes requises par LoggingLab
sont :
Forest
: nom de la forêtidTree
: identifiant unique pour chaque arbreXutm
et Yutm
: coordonnées de chaque arbreCodeAlive
: arbre vivant ou mortFamily
, Genus
, Species
: données botaniquesCircCorr
: circonférence de chaque arbreL’inventaire de la parcelle 6 de Paracou est disponible dans LoggingLab
.
Forest Plot PlotArea SubPlot idTree Protocole Xfield Yfield Xutm
1 Paracou 6 6.25 1 100726 Guyafor 13.5 201.0 286420.1
2 Paracou 6 6.25 1 100729 Guyafor 19.0 196.5 286426.4
3 Paracou 6 6.25 1 100739 Guyafor 13.5 182.0 286424.8
4 Paracou 6 6.25 1 100741 Guyafor 9.5 179.5 286421.6
5 Paracou 6 6.25 1 100747 Guyafor 14.5 167.5 286429.3
6 Paracou 6 6.25 1 100750 Guyafor 18.0 169.0 286432.3
Yutm UTMZone Lat Lon Family Genus Species
1 583135.4 22 5.272669 -52.92713 Annonaceae Oxandra asbeckii
2 583132.2 22 5.272642 -52.92707 Fabaceae Eperua grandiflora
3 583116.8 22 5.272502 -52.92709 Fabaceae Bocoa prouacensis
4 583113.4 22 5.272471 -52.92712 Celastraceae Maytenus sp.1-CAY
5 583102.9 22 5.272376 -52.92705 Chrysobalanaceae Licania membranacea
6 583105.2 22 5.272397 -52.92702 Chrysobalanaceae Licania canescens
BotaSource BotaCertainty VernName CensusYear CensusDateCertainty
1 Bota 4 muamba 2016 TRUE
2 Bota 4 Eperua grandiflora 2016 TRUE
3 Bota 4 boco 2016 TRUE
4 Bota 3 lebi tongo 2016 TRUE
5 Bota 4 santi koko 2016 TRUE
6 Bota 4 santi koko 2016 TRUE
CodeAlive MeasCode Circ CircCorr CorrCode
1 TRUE 0 39.5 39.5 0
2 TRUE 0 114.0 114.0 0
3 TRUE 0 48.0 48.0 0
4 TRUE 0 123.0 123.0 0
5 TRUE 0 54.0 54.0 0
6 TRUE 0 88.0 88.0 0
Nous pouvons dresser une carte de la parcelle 6 de Paraou en 2016.
Le masque de la parcelle définit les limites de la zone à prendre en compte, c’est-à-dire les limites de la parcelle. Le masque de la parcelle est utilisé par LoggingLab
pour valider l’inventaire et définir les zones exploitables.
Le masque de la parcelle 6 de Paracou est disponible dans LoggingLab
.
SpeciesCriteria
contient des données spécifiques à chaque espèce. Les colonnes sont les suivantes :
CommercialLevel
: Niveau d’intérêt économiqueMinFD
: Diamètre minimal de coupe, en centimètresUpMinFD
: Diamètre minimal de coupe amélioré (en cas de peuplement excessivement riche), en centimètresMaxFD
: Diamètre maximal de coupe, en centimètresLes données relatives aux espèces de la Guyane française sont disponibles dans LoggingLab
.
# A tibble: 6 × 8
CommercialName Genus Species CommercialLevel MinFD UpMinFD MaxFD Aggregative
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <lgl>
1 st martin rouge Andira spp 2 55 60 120 FALSE
2 bamba apici Aniba spp 2 55 60 120 FALSE
3 bagasse Bagas… guiane… 2 55 60 120 FALSE
4 assao Baliz… pedice… 2 55 60 120 FALSE
5 dokali Brosi… parina… 2 55 60 120 FALSE
6 satiné rubané Brosi… rubesc… 2 55 60 120 FALSE
LoggingLab
utilise des allométries volumétriques dont les paramètres varient en fonction de la région exploitée. Par exemple, pour le volume des arbres, LoggingLab
utilise :
\[Volume = aCoef + bCoef \times DBH^2\]
Avec \(Volume\) le volume des arbres et \(DBH\) le diamètre des arbres.
Les allométries volumétriques pour différentes régions de la Guyane française sont disponibles dans LoggingLab
.
Forest Zone aCoef bCoef
1 Acarouany West -0.061776 8.83580
2 BAFOG West -0.061776 8.83580
3 Kaw East -0.084516 10.46132
4 Laussat West -0.061776 8.83580
5 Montagne_Plomb Central -0.035829 8.76340
6 Montagne_Tortue East -0.084516 10.46132
D’autres allométries peuvent être modifiées, comme les allométries de la courrone
Maintenant, nous allons exécuter une simulation d’exploration étape par étape à l’aide de LoggingLab
.
Les arbres qui ne se trouvent pas dans la zone enregistrée ou qui sont trop petits pour être pris en compte sont exclus.
inventorycheckformat
vérifie que les données d’inventaire reçues sont compatibles avec LoggingLab
, tandis que cleaninventory
nettoie les données d’inventaire.
Comme les données étaient déjà nettoyées, il n’y a pas eu beaucoup de modifications.
Ensuite, addtreedim
calcule les dimensions de l’arbre (hauteur de l’arbre, tronc et couronne, diamètre de la couronne, volume exploitable, densité du bois et biomasse).
TreeHarvestableVolume TrunkHeight TreeHeight CrownHeight CrownDiameter
1 0.1027084 8.272213 14.65595 6.383735 2.207900
2 1.1181093 10.811462 27.40065 16.589191 8.260220
3 0.1687473 9.203739 16.78716 7.583417 3.234360
4 1.3075022 10.860306 28.35561 17.495301 8.566460
5 0.2230879 9.613873 18.14034 8.526472 3.389036
6 0.6517747 10.576502 24.12416 13.547658 7.042431
WoodDensity AGB
1 0.7700000 0.1003184
2 0.7040000 1.3401159
3 1.0536667 0.2275608
4 0.7131944 1.6277207
5 0.8800000 0.2590981
6 0.8800000 0.8877632
Par exemple, nous pouvons élaborer une carte du volume exploitable.
Comme nous simulons uniquement l’exploitation sur quelques hectares, nous ne simulons pas les pistes à camion. Mais nous avons besoin de leur emplacement pour simuler les pistes de débardage.
La fonction maintrailextract
génère les pistes à camion de la zone exploitée à l’aide des bords du masque de la parcelle.
Ensuite, nous devons définir les zones de récolte et les zones accessibles aux machines à l’intérieur de la parcelle. Par défaut, une unité de travail est :
Nous utilisons harvestableareadefinition
avec une option winching
définie sur 2, c’est-à-dire que le grapin est utilisé si possible (extension de 6 m) et que le câble est utilisé jusqu’à 40 m.
HarvestableArea <- harvestableareadefinition(
topography = DTMParacou,
creekverticaldistance = CreekDistances$distvert,
creekhorizontaldistance = CreekDistances$disthorz,
maintrails = MainTrails,
plotmask = PlotMask,
scenario = "manual",
winching = "2",
advancedloggingparameters = loggingparameters()
)
Les zones vertes foncées peuvent être récoltées au grapin et les zones vertes claires au câble. Les autres zones ne peuvent pas être récoltées.
(base <- ggplot() + geom_spatraster(data = rast(DTMParacou), alpha = .5) +
scale_fill_gradient(low = "darkblue", high = "white", "Altitude [m]", na.value = NA) +
geom_sf(data = HarvestableArea$HarvestablePolygons, fill = "darkgreen", alpha = 0.3) +
geom_sf(data = HarvestableArea$MachinePolygons, fill = "darkgreen", alpha = 0.7))
Ensuite, nous sélectionnons les arbres à abattre, les arbres futurs et les arbres de réserve. Les arbres peuvent être abattus si :
Ils appartiennent à des espèces de première catégorie économique ou plus, s’il y a diversification
Le DBH se situe entre le MinFD et le MaxFD
Elles sont situées sur des pentes < 22 %
Ils sont hors des psites principales
Les arbres à abattre sont choisis par ordre décroissant de volume, jusqu’à ce que le volume cible soit atteint.
Les arbres futurs sont ceux qui seront exploités lors de la prochaine campagne. Les arbres de réserve sont conservés comme arbres semenciers pour la régénération naturelle.
La fonction treeselection
sélectionne les arbres selon les critères précédents.
inventory <- inventory %>%
commercialcriteriajoin(SpeciesCriteria)
TreeSelection <- inventory %>%
treeselection(
topography = DTMParacou,
speciescriteria = SpeciesCriteria,
scenario ="manual",
objective = 20,
fuel = "0",
diversification = TRUE,
winching = "2",
harvestablearea = HarvestableArea$HarvestableArea,
plotslope = HarvestableArea$PlotSlope,
maintrails = MainTrails,
harvestablepolygons = HarvestableArea$HarvestablePolygons,
advancedloggingparameters = loggingparameters()
)
Nous pouvons cartographier les arbres exploitables, sélectionnés, futurs et de réserve.
base + geom_sf(data = TreeSelection$HarvestableTreesPoints, aes(colour = "Harvestable")) +
geom_sf(data = TreeSelection$SelectedTreesPoints, aes(colour = "Selected")) +
geom_sf(data = TreeSelection$FutureTreesPoints, aes(colour = "Future")) +
geom_sf(data = TreeSelection$ReserveTreesPoints, aes(colour = "Reserve"))
Les pistes de débardage permettent aux arbres sélectionnés d’être récoltés par les machines choisies. L’itinéraire est optimisé pour réduire la distance parcourue, en respectant les contraintes topographiques et en évitant les arbres à protéger. Elles ont une largeur de 4 mètres, avec une pente maximale de 22 % et une inclinaison latérale maximale de 4 %. Elles évitent les arbres à abattre, les grands arbres (>50 cm) et les arbres de réserve.
secondstrailsopening
permet de définir les pistes de débardage.
ScndTrailOutputs <- secondtrailsopening(
topography = DTMParacou,
plotmask = PlotMask,
maintrails = MainTrails,
plotslope = HarvestableArea$PlotSlope,
harvestablepolygons = HarvestableArea$HarvestablePolygons,
machinepolygons = HarvestableArea$MachinePolygons,
treeselectionoutputs = TreeSelection,
scenario = "manual",
winching = "2",
fuel = "0",
advancedloggingparameters = loggingparameters()
)
inventory <- ScndTrailOutputs$inventory
⚠️ Cette étape peut prendre un certain temps.
Nous pouvons cartographier les psites de débardage avec les arbres sélectionnés.
Ensuite, nous simulons la coupe de l’arbre. La coupe de l’arbre crée un arbre au sol, dont les dimensions sont calculées à l’aide d’allométries spécifiques.
La coupe directionnelle vise à orienter la chute de l’arbre, avec le pied à un angle par rapport au chemin, et en évitant les arbres à protéger. Mais la coupe directionnelle peut échouer (dans 40 % des cas) !
treefelling
permet de simuler la coupe d’arbres.
Nous pouvons cartographier les arbres au sol.
Enfin, nous pouvons quantifier le volume de bois récolté à partir d’arbres sains utilisés pour la production de bois avec timberharvestedvolume
.
[1] 74.76017
Les détails de la production par espèce figurent dans l’inventaire.
# A tibble: 5 × 4
CommercialName trees_n volume CommercialLevel
<chr> <int> <dbl> <dbl>
1 chawari 1 4.11 2
2 grignon franc 2 11.4 1
3 maho noir 3 12.3 2
4 wapa 8 34.5 2
5 wapa courbaril 3 12.4 2
Mais surtout, nous pouvons quantifier la biomasse des dommages causés par type de mortalité.
# A tibble: 3 × 2
DeathCause AGB
<chr> <dbl>
1 2ndtrail 19.6
2 cut 29.0
3 treefall2nd 7.83
Quelques informations supplémentaires pour ceux qui souhaitent aller plus loin avec LoggingLab
.
Toutes les étapes de simulation peuvent être regroupées dans une seule fonction afin de gagner du temps.
Rslt <- loggingsimulation1(
Paracou6_2016,
plotmask = PlotMask,
topography = DTMParacou,
creekverticaldistance = CreekDistances$distvert,
creekhorizontaldistance = CreekDistances$disthorz,
speciescriteria = SpeciesCriteria,
volumeparameters = ForestZoneVolumeParametersTable,
scenario = "manual",
objective = 20,
fuel = "0",
winching = "2",
directionalfelling = "2",
diversification = TRUE,
crowndiameterparameters = ParamCrownDiameterAllometry,
advancedloggingparameters = loggingparameters()
)
Plusieurs simulations peuvent être exécutées par la fonction loggingsimulation()
afin de prendre en compte la stochasticité avec l’argument iter
(nombre de simulations) et cores
(nombre de cœurs de processeur utilisés pour effectuer des calculs en parallèle).
loggingsummary1
renvoie un résumé des résultats de la fonction de simulation.
inventory : Paracou6_2016
scenario : manual
objective : 20 m3/harvestable ha
fuel : 0
diversification : TRUE
winching : 2
directionalfelling : 2
specieslax : FALSE
objectivelax : FALSE
Harvestable area : 3.75 ha
Objective volume : 74.9 m3
Initial harvestable volume : 169.5 m3, 45.2 m3/harvestable ha
Timber logged volume : 74.9 m3, 20 m3/harvestable ha
No hollow timber logged volume : 74.9 m3, 20 m3/harvestable ha
Timber extracted volume (timber volume after purge : 64.4 m3, 17.2 m3/harvestable ha
Logging residual biomass : 152.6 ton, 40.7 ton/harvestable ha
Total forest biomass lost : 202.7 ton
Trails density : 95.9 m/ha
Please note that all volumes in m3/ha are per exploitable hectare, not per plot hectare.
Les scénarios regroupent les principaux paramètres d’exploitation. Ils sont utilisés pour définir la zone exploitable, les arbres à abattre et le tracé des pistes à camion.
Les colonnes du scénario sont les suivantes :
Type
: le nom du scénarioSpatialDataType
: le type de données spatiales (Lidar ou SRTM)Objective
: le volume cible par hectareDiversification
: pour autoriser la coupe d’autres espèces que les principales espèces commercialesWinching
: la méthode du treuil, sans câble ni griffe = « 0 », câble seul = « 1 », grapin et câble = « 2 »DirectionalFelling
: 0 » = non utilisé, « 1« » = uniquement pour éviter d’endommager les arbres futurs et de réserve, « 2 » = éviter d’endommager les arbres futurs et de réserve + orientation du sentierToutes les fonctions permettent scenario = « manual »
: dans ce cas, tous les arguments doivent être ajoutés manuellement. Leur nom est le même que celui des colonnes.
LogingLab
comprend des scénarios prédéfinis correspondant à différentes versions d’exploitation à fiable impact (EFI) en Guyane française.
# A tibble: 6 × 6
Type SpatialDataType Objective Diversification Winching DirectionalFelling
<chr> <chr> <chr> <lgl> <fct> <fct>
1 RIL1 SRTM 20-25 FALSE 0 0
2 RIL2bro… LIDAR 20-25 FALSE 0 0
3 RIL2 LIDAR 20-25 FALSE 1 0
4 RIL3 LIDAR 25-30 TRUE 2 2
5 RIL3fuel LIDAR 25-30 TRUE 2 2
6 RIL3fue… LIDAR 25-30 TRUE 2 2
loggingparameters()
définit tous les paramètres d’exploitation. Consultez son aide (?loggingparameters
). Les valeurs par défaut sont celles utilisées en Guyane française.
$MinDBHValue
[1] 10
$MaxTrailCenterlineSlope
[1] 22
$MaxTrailCrossSlope
[1] 4
$GrappleMaxslope
[1] 20
$CableTreesMaxSlope
[1] 35
$PlateauMaxSlope
[1] 5
$SlopeDistance
[1] 3
$WaterSourcesBufferZone
[1] 30
$WaterSourcesRelativeHeight
[1] 2
$MinMainTrailWidth
[1] 5
$MaxMainTrailWidth
[1] 6
$ScndTrailWidth
[1] 4
$BigTrees
[1] 50
$ResamplDistDTM
[1] 5
$SmoothingFact
[1] 10
$CableLength
[1] 40
$GrappleLength
[1] 6
$IsolateTreeMinDistance
[1] 100
$FutureTreesMinDiameter
[1] 35
$TreefallSuccessProportion
[1] 0.6
$MinTreefallOrientation
[1] 30
$MaxTreefallOrientation
[1] 45
$TreeHollowPartForFuel
[1] 0.3333333
$CrownPartForFuel
[1] 0.6666667
$Purge
[1] 0.14
$MaxTrailDensity
[1] 200
$MaxLandingArea
[1] 1500
$CostMatrix
$CostMatrix[[1]]
$CostMatrix[[1]][[1]]
$CostMatrix[[1]][[1]]$Slope
[1] 3
$CostMatrix[[1]][[1]]$Cost
[1] 3
$CostMatrix[[1]][[2]]
$CostMatrix[[1]][[2]]$Slope
[1] 5
$CostMatrix[[1]][[2]]$Cost
[1] 5
$CostMatrix[[1]][[3]]
$CostMatrix[[1]][[3]]$Slope
[1] 12
$CostMatrix[[1]][[3]]$Cost
[1] 20
$CostMatrix[[1]][[4]]
$CostMatrix[[1]][[4]]$Slope
[1] 20
$CostMatrix[[1]][[4]]$Cost
[1] 60
$CostMatrix[[1]][[5]]
$CostMatrix[[1]][[5]]$Slope
[1] 35
$CostMatrix[[1]][[5]]$Cost
[1] 1000
$CostMatrix[[1]][[6]]
$CostMatrix[[1]][[6]]$Slope
[1] Inf
$CostMatrix[[1]][[6]]$Cost
[1] Inf
$CostMatrix[[2]]
$CostMatrix[[2]][[1]]
$CostMatrix[[2]][[1]]$CostType
[1] "Initial"
$CostMatrix[[2]][[1]]$CostValue
[1] 1000
$CostMatrix[[2]][[2]]
$CostMatrix[[2]][[2]]$CostType
[1] "Access"
$CostMatrix[[2]][[2]]$CostValue
[1] Inf
$CostMatrix[[2]][[3]]
$CostMatrix[[2]][[3]]$CostType
[1] "BigTrees"
$CostMatrix[[2]][[3]]$CostValue
[1] 500
$CostMatrix[[2]][[4]]
$CostMatrix[[2]][[4]]$CostType
[1] "Reserves"
$CostMatrix[[2]][[4]]$CostValue
[1] 500
$CostMatrix[[2]][[5]]
$CostMatrix[[2]][[5]]$CostType
[1] "Futures"
$CostMatrix[[2]][[5]]$CostValue
[1] 50
$CostMatrix[[2]][[6]]
$CostMatrix[[2]][[6]]$CostType
[1] "MainTrails"
$CostMatrix[[2]][[6]]$CostValue
[1] 1e-04
$CostMatrix[[2]][[7]]
$CostMatrix[[2]][[7]]$CostType
[1] "SecondTrails"
$CostMatrix[[2]][[7]]$CostValue
[1] 0.1
$TreeHarvestableVolumeAllometry
function (DBH, aCoef, bCoef)
aCoef + bCoef * (DBH/100)^2
<environment: 0x63eb0031a0c8>
$TrunkHeightAllometry
function (DBH, TreeHarvestableVolume)
TreeHarvestableVolume/(pi * (((DBH/100)/2)^2))
<environment: 0x63eb0031a0c8>
$TreeHeightAllometry
function (DBH)
exp(0.07359191 + 1.34241216 * log(DBH) + -0.12282344 * log(DBH)^2)
<environment: 0x63eb0031a0c8>
$CrownDiameterAllometry
function (DBH, TreeHeight, alpha, beta)
exp(((log(DBH) - alpha - rnorm(length(DBH), 0, 0.0295966977))/beta))/TreeHeight
<environment: 0x63eb0031a0c8>
$RottenModel
function (DBH)
1/(1 + exp(-(-5.151 + 0.042 * DBH)))
<environment: 0x63eb0031a0c8>
$VisiblyDefectModel
function (LogDBH)
1/(1 + exp(-(-3.392 + 0.357 * LogDBH)))
<environment: 0x63eb0031a0c8>
$Treefall2ndDeathModel
function (DBH)
1/(1 + exp(-(-0.47323 + -0.02564 * DBH)))
<environment: 0x63eb0031a0c8>
Félicitations 👏 , vous êtes désormais des pros de LoggingLab
!
Plus sérieusement, je serais ravis de répondre à toutes vos questions. N’hésitez pas à consulter GitHub si vous avez besoin d’aide plus tard.
Sylvain Schmitt (sylvain.schmitt@cirad.fr)