Um pacote R para simular o corte seletivo de impacto reduzido em florestas tropicais
CIRAD
Nov 25, 2024
O pacote LoggingLab do R, desenvolvido no contexto da extração seletiva de madeira na Guiana Francesa, permite que cada estágio da extração seletiva de madeira seja simulado de forma espacialmente explícita. Isso permite que os efeitos de diferentes práticas de exploração madeireira no ecossistema sejam avaliados e comparados com precisão. O objetivo desse workshop prático será apresentar e usar em conjunto as funções gerais desse pacote.
Simulação de corte seletivo usando dados de inventário florestal.
Os etapas são:
Usaremos o pacote LoggingLab para R (Badouard et al. 2024) para simular a extração de madeira de impacto reduzido em uma floresta tropical. O pacote deve ser instalado a partir de seu repositório no Github, pois ainda não está no CRAN.
Usaremos o tidyverse
para manipular tabelas e criar gráficos, o sf
para manipular objetos espaciais e o terra
e o tidyterra
para manipular dados raster.
Os dados e parâmetros necessários para usar LoggingLab
são as seguintes:
O inventário deve conter o diâmetro, a identificação botânica e as coordenadas de todos as árvores com major de um determinado diâmetro (normalmente DAP >= 10cm).
No momento, o simulador está trabalhando em pequenos lotes (alguns hectares) e não representa toda a operação de uma concessão, pois seu foco é a quantificação detalhada dos danos pós-operacionais de acordo com as práticas.
As colunas exigidas pelo LoggingLab
são:
Forest
: o nome da florestaidTree
: um identificador exclusivo para cada árvoreXutm
e Yutm
: as coordenadas de cada árvoreCodeAlive
: árvore viva ou morta.Family
, Genus
, Species
: dados botânicosCircCorr
: circunferência de cada árvoreO inventário do lote 6 de Paracou está disponível dentro 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
Podemos fazer um mapa do lote 6 de Paraou em 2016.
A máscara do lote define os limites da área a ser considerada ou seja, os limites do lote. A máscara do lote é usada pelo LoggingLab
para validar o inventário e definir a zonas exploráveis.
A máscara do lote 6 de Paracou está disponível dentro LoggingLab
.
SpeciesCriteria
contém dados específicos de cada espécie. As colunas são:
CommercialLevel
: Nível de interesse econômicoMinFD
: Diâmetro mínimo de corte, em centímetrosUpMinFD
: Diâmetro mínimo de corte aprimorado (caso de povoamento excessivamente rico), em centímetrosMaxFD
: Diâmetro máximo de corte, em centímetrosDados de espécies de Guiana Francesa são disponível dentro 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
O LoggingLab
usa alometrias volumétricas com parâmetros que variam de acordo com a região explorada. Por exemplo, por volume de árvores que o LoggingLab
usa:
\[Volume = aCoef + bCoef \times DBH^2\]
Com \(Volume\) o volume das árvores e \(DBH\) o diametro das árvores.
Alometrias volumétricas para diferentes regiões da Guiana Francesa são disponível dentro 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
Outras alometrias podem ser modificadas, como as alometrias de copa.
Agora, vamos executar uma simulação de exploração passo a passo usando LoggingLab
.
As árvores que não estão na área registrada ou que são muito pequenas para serem consideradas são excluídas.
inventorycheckformat
verifica se os dados de inventário recebidos são compatíveis com o LoggingLab
, enquanto cleaninventory
limpa os dados de inventário.
Como os dados já estavam limpos, não houve muitas alterações.
Em seguida, o addtreedim
calcula as dimensões da árvore (altura da árvore, tronco e copa, diâmetro da copa, volume explorável, densidade da madeira e biomassa).
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
Por exemplo, podemos elaborar um mapa do volume explorável.
Como estamos simulando apenas a exploração em alguns hectares, não estamos simulando as estradas secundarias. Mas precisamos de sua localização para simular as trilhas de arraste.
O maintrailextract
gera as estradas secundarais da área que está sendo explorado usando os bordas de máscara do lote.
Em seguida, precisamos definir as áreas de colheita e as áreas acessíveis às máquinas dentro do talhão. Por padrão, uma unidade de trabalho é:
Usamos harvestableareadefinition
com uma opção “winching” definida como 2, ou seja, a garra é usada, se possível (extensão de 6 m), e o cabo é usado até 40 m.
HarvestableArea <- harvestableareadefinition(
topography = DTMParacou,
creekverticaldistance = CreekDistances$distvert,
creekhorizontaldistance = CreekDistances$disthorz,
maintrails = MainTrails,
plotmask = PlotMask,
scenario = "manual",
winching = "2",
advancedloggingparameters = loggingparameters()
)
As áreas verdes escuras podem ser colhidas por máquina e as áreas verdes claras por cabo. As outras áreas não podem ser colhidas.
(base <- ggplot() + geom_spatraster(data = rast(DTMParacou), alpha = .5) +
scale_fill_gradient(low = "darkblue", high = "white", "Altura (m)", na.value = NA) +
geom_sf(data = HarvestableArea$HarvestablePolygons, fill = "darkgreen", alpha = 0.3) +
geom_sf(data = HarvestableArea$MachinePolygons, fill = "darkgreen", alpha = 0.7))
Em seguida, selecionamos as árvores a serem colhidas e as árvores futuras e de reserva. As árvores podem ser colhidas se:
Pertencem a espécies de primeira categoria econômica ou mais, se houver diversificação.
O DAP estiver entre o MinFD e o MaxFD.
Estão localizadas em declives < 22%.
Estão fora das trilhas principais.
As árvores a serem colhidas são escolhidas em ordem decrescente de volume, até que o volume objetivo seja atingido.
As árvores futuras são aqueles a serem explorados na próxima campanha. As árvores de reserva são conservadas como árvores-semente para regeneração natural.
O função treeselection
seleciona árvores com os critérios anteriores.
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()
)
Podemos mapear árvores exploráveis, selecionadas, futuras e de reserva.
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"))
As trilhas de arraste permitem que as árvores selecionadas sejam colhidas pelas máquinas escolhidas. A rota é otimizada para reduzir a distância percorrida, respeitando as restrições topográficas e evitando as árvores a serem protegidas. Elas têm 4 metros de largura, com uma inclinação máxima de 22% e uma inclinação lateral máxima de 4%. Elas evitam árvores a serem cortadas, árvores grandes (>50 cm) e árvores de reserva.
secondstrailsopening
permite definir trihlas de arraste.
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
⚠️ Essa etapa pode levar algum tempo.
Podemos mapear as trilhas de arraste com o árvores selecionadas.
Em seguida, simulamos o corte da árvore. O corte da árvore cria uma árvore no solo, cujas dimensões são calculadas usando alometrias específicas.
O corte direcional visa direcionar a queda da árvore, com o pé em um ângulo em relação ao caminho, e evitando as árvores a serem protegidas. Mas o corte direcional pode falhar (em 40% dos casos)!
treefelling
permite que você simula a corte de árvores.
Podemos mapear os árvores no solo.
Por fim, podemos quantificar o volume de madeira colhida de árvores saudáveis usadas para a produção de madeira com timberharvestedvolume
.
[1] 74.76017
Os detalhes da produção por espécie estão no inventário.
# 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
Mas, acima de tudo, podemos quantificar o biomassa de danos por causa de morte.
# A tibble: 3 × 2
DeathCause AGB
<chr> <dbl>
1 2ndtrail 19.6
2 cut 29.0
3 treefall2nd 7.83
Algumas informações adicionais para aqueles que desejam ir além com o LoggingLab
.
Todas as etapas de simulação podem ser incluídas em uma única função para economizar tempo.
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()
)
Várias simulações podem ser executadas pela função loggingsimulation()
para levar em conta a estocasticidade com o argumento iter
(número de simulações) e cores
(número de núcleos de computador usados para realizar cálculos em paralelo).
loggingsummary1
retorna um resumo das saídas da função de simulação.
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.
Os cenários reúnem os principais parâmetros de exploração. Eles são usados para definir a zona explorável, as árvores a serem cortadas e a modelagem de trilhas secundárias.
As colunas do cenário são:
Type
: o nome do cenárioSpatialDataType
: o tipo de dados espaciais (Lidar ou SRTM)Objective
: o volume objetivo por hectareDiversification
: por permitir o corte de outras espécies além das principais espécies comerciaisWinching
: o método de guincho, sem cabo ou garra = “0”, somente cabo = “1”, garra + cabo = “2”DirectionalFelling
: “0” = não utilizado, ‘1’ = apenas para evitar danos a árvores futuras e de reserva, ‘2’ = evitar danos a árvores futuras e de reserva + orientação da trilhaTodas as funções permitem scenario = “manual”
: nesse caso, todos os argumentos devem ser adicionados manualmente. Seu nome é o mesmo das colunas.
LogingLab
inclui cenários predefinidos que correspondem a diferentes versões de registro de impacto reduzido na Guiana Francesa.
# 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()
define todos os parâmetros de exploração. Consulte sua ajuda (?loggingparameters
). Os valores padrão são os usados na Guiana Francesa.
$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: 0x5fe1a870b888>
$TrunkHeightAllometry
function (DBH, TreeHarvestableVolume)
TreeHarvestableVolume/(pi * (((DBH/100)/2)^2))
<environment: 0x5fe1a870b888>
$TreeHeightAllometry
function (DBH)
exp(0.07359191 + 1.34241216 * log(DBH) + -0.12282344 * log(DBH)^2)
<environment: 0x5fe1a870b888>
$CrownDiameterAllometry
function (DBH, TreeHeight, alpha, beta)
exp(((log(DBH) - alpha - rnorm(length(DBH), 0, 0.0295966977))/beta))/TreeHeight
<environment: 0x5fe1a870b888>
$RottenModel
function (DBH)
1/(1 + exp(-(-5.151 + 0.042 * DBH)))
<environment: 0x5fe1a870b888>
$VisiblyDefectModel
function (LogDBH)
1/(1 + exp(-(-3.392 + 0.357 * LogDBH)))
<environment: 0x5fe1a870b888>
$Treefall2ndDeathModel
function (DBH)
1/(1 + exp(-(-0.47323 + -0.02564 * DBH)))
<environment: 0x5fe1a870b888>
Parabéns 👏 , agora vocês são profissionais do LoggingLab
!
Falando mais seriamente, ficaremos felizes em responder a quaisquer perguntas que você possa ter, portanto, não hesite em dar uma olhada no GitHub para quaisquer dúvidas futuras.
Sylvain Schmitt (sylvain.schmitt@cirad.fr) & Géraldine Derroire (geraldine.derroire@cirad.fr)