Les arguments

inventory multilignes "MainTrail ", "2ndTrail" vecteur "AccessibleTreesPoints", "SelectedTreesPoints", "AvenirTreesPoints", "ReserveTreesPoints", "DeadTreesPoints", "HollowTreesPoints" et "Fuel woodTreesPoints"

OUTPUT :

inventory + polygone "Shadow" + vecteurs "TreefallSuccess", "TreefallFailure", "DamageTreesPoints", "DeadTreesPoints"

data(Paracou6_2016)
data(DTMParacou)

inventory <- addtreedim(inventorycheckformat(Paracou6_2016), volumeparameters = ForestZoneVolumeParametersTable)

inventory <- treeselection(inventory, objective = 20, scenario ="manual", fuel = "2", diversification = TRUE, specieslax = FALSE,
                           objectivelax = FALSE, topography = DTMParacou, plotslope = PlotSlope, speciescriteria = SpeciesCriteria,
                           advancedloggingparameters = loggingparameters())$inventory

SelectedTrees <- inventory %>% 
  filter(Selected == "1") %>%
  dplyr::select(idTree,DBH,TrunkHeight,TreeHeight,CrownHeight,CrownDiameter,Selected, Xutm, Yutm)

speciescriteria = SpeciesCriteria
scenario = "manual"
fuel = "2"
objective = 20
diversification = TRUE
directionalfelling = "2"
specieslax = FALSE
objectivelax = FALSE
topography = DTMParacou
advancedloggingparameters = loggingparameters()
# MainTrail

Succès-échec

Accessible = Selected

if (fuel == "0" && directionalfelling != "1"){
  inventory <- inventory %>% 
    mutate(TreeFellingOrientationSuccess = ifelse(Accessible == "1", sample(c(1,0), size = 1, replace = F, prob = c(advancedloggingparameters$TreefallSuccessProportion, 1-advancedloggingparameters$TreefallSuccessProportion)), NA)) # Accessible = linked by 2ndtrails

  #Tree coordinates 
  if (any(inventory$TreeFellingOrientationSuccess == "1", na.rm = TRUE)) {

    TreefallSuccessCoord <- inventory %>% 
      filter(TreeFellingOrientationSuccess == "1") %>% 
      select(Xutm, Yutm)

    TreefallSuccess  <- st_multipoint(x = as.matrix(TreefallSuccessCoord))   # Create treefelling success
  }

  if (any(inventory$TreeFellingOrientationSuccess == "0", na.rm = TRUE)) {
    TreefallFailCoord <- inventory %>% 
      filter(TreeFellingOrientationSuccess == "0") %>% 
      select(Xutm, Yutm)

    TreefallFailure  <- st_multipoint(x = as.matrix(TreefallFailCoord))      # Create treefelling fails

  }

}

if (fuel =="1") {

  inventory <- inventory %>% 
    mutate(TreeFellingOrientationSuccess = ifelse(Selected == "1", sample(c(1,0), size = 1, replace = F, prob = c(advancedloggingparameters$TreefallSuccessProportion, 1-advancedloggingparameters$TreefallSuccessProportion)), NA)) # Selected = not yet linked by 2ndtrails, because 2ndtrails came after

  #Tree coordinates 
  if (any(inventory$TreeFellingOrientationSuccess == "1", na.rm = TRUE)) {

    TreefallSuccessCoord <- inventory %>% 
      filter(TreeFellingOrientationSuccess == "1") %>% 
      select(Xutm, Yutm)

    TreefallSuccess  <- st_multipoint(x = as.matrix(TreefallSuccessCoord))   # Create treefelling success
  }

  if (any(inventory$TreeFellingOrientationSuccess == "0", na.rm = TRUE)) {
    TreefallFailCoord <- inventory %>% 
      filter(TreeFellingOrientationSuccess == "0") %>% 
      select(Xutm, Yutm)

    TreefallFailure  <- st_multipoint(x = as.matrix(TreefallFailCoord))      # Create treefelling fails

  }
}

# Abattre les creux : 
if (fuel =="2") {

  inventory <- inventory %>% 
    mutate(TreeFellingOrientationSuccess = ifelse(Selected == "1"| ProbedHollow == "1", sample(c(1,0), size = 1, replace = F, prob = c(advancedloggingparameters$TreefallSuccessProportion, 1-advancedloggingparameters$TreefallSuccessProportion)), NA)) # Selected = not yet linked by 2ndtrails, because 2ndtrails came after

  #Tree coordinates 
  if (any(inventory$TreeFellingOrientationSuccess == "1", na.rm = TRUE)) {

    TreefallSuccessCoord <- inventory %>% 
      filter(TreeFellingOrientationSuccess == "1") %>% 
      select(Xutm, Yutm)

    TreefallSuccess  <- st_multipoint(x = as.matrix(TreefallSuccessCoord))   # Create treefelling success
  }

  if (any(inventory$TreeFellingOrientationSuccess == "0", na.rm = TRUE)) {
    TreefallFailCoord <- inventory %>% 
      filter(TreeFellingOrientationSuccess == "0") %>% 
      select(Xutm, Yutm)

    TreefallFailure  <- st_multipoint(x = as.matrix(TreefallFailCoord))      # Create treefelling fails

  }
}

Polygons laboratory

# ex:
outer = matrix(c(0,0,10,0,10,10,0,10,0,0),ncol=2, byrow=TRUE) # matrice de 2 colonnes (x, y)
#      [,1] [,2]
# [1,]    0    0 en bas à gauche
# [2,]   10    0 en bas à droite 
# [3,]   10   10 en haut à droite
# [4,]    0   10 en haut à gauche
# [5,]    0    0 retour en bas à gauche
hole1 = matrix(c(1,1,1,2,2,2,2,1,1,1),ncol=2, byrow=TRUE) # le petit carré en bas à gauche
#      [,1] [,2]
# [1,]    1    1 en bas à gauche
# [2,]    1    2 en haut à gauche
# [3,]    2    2 en haut à droite
# [4,]    2    1 en bas à droite
# [5,]    1    1 retour en bas à gauche
hole2 = matrix(c(5,5,5,6,6,6,6,5,5,5),ncol=2, byrow=TRUE)
pts = list(outer, hole1, hole2)
(pl1 = st_polygon(pts))
plot(pl1)

list(matrix(c('A','B',
              'C','D', 
              'E', 'F', 
              'G','H',
              'I', 'J') # retour
            ,ncol=2, byrow=TRUE))
pol1 = list(outer, hole1, hole2) #1 list/polygon :  list with numeric matrices with points in rows
# [[1]]
#      [,1] [,2] le gros carré
# [1,]    0    0
# [2,]   10    0
# [3,]   10   10
# [4,]    0   10
# [5,]    0    0
# 
# [[2]]
#      [,1] [,2] 1er trou
# [1,]    1    1
# [2,]    1    2
# [3,]    2    2
# [4,]    2    1
# [5,]    1    1
# 
# [[3]]
#      [,1] [,2] 2eme trou
# [1,]    5    5
# [2,]    5    6
# [3,]    6    6
# [4,]    6    5
# [5,]    5    5

pol2 = list(outer + 12, hole1 + 12) # même carré au quel on ajoute 12 à ts les x et tous les y
# [[1]]
#      [,1] [,2] # même carré au quel on ajoute 12 à ts les x et tous les y
# [1,]   12   12
# [2,]   22   12
# [3,]   22   22
# [4,]   12   22
# [5,]   12   12
# 
# [[2]]
#      [,1] [,2] # un des memes trous au quel on ajoute 12 à ts les x et tous les y
# [1,]   13   13
# [2,]   13   14
# [3,]   14   14
# [4,]   14   13
# [5,]   13   13

pol3 = list(outer + 24)  # même carré au quel on ajoute 24 à ts les x et tous les y
mp = list(pol1,pol2,pol3) #list of lists of numeric matrices
(mp1 = st_multipolygon(mp))
plot(mp1)
library(nngeo)
# 1 ellipse
dat = data.frame(
  x = 1, #centroid locations
  y = 0, #centroid locations
  ex = 0.5, #Size along x-axis
  ey = 0.5, #Size along y-axis,
  stringsAsFactors = FALSE
)
dat = st_as_sf(dat, coords = c("x", "y")) #centroids
dat

# Calculate ellipses
el = st_ellipse(pnt = dat, ex = dat$ex, ey = dat$ey)

# Plot 2
plot(el, graticule = TRUE, axes = TRUE)

# Several ellipses
dat = data.frame(
  x = c(1, 1, -1, 3, 3), #centroid locations
  y = c(0, -3, 2, -2, 0), #centroid locations
  ex = c(0.5, 2, 2, 0.3, 0.6), #Size along x-axis
  ey = c(0.5, 0.2, 1, 1, 0.3), #Size along y-axis,
  stringsAsFactors = FALSE
)
dat = st_as_sf(dat, coords = c("x", "y")) #centroids
dat

# Calculate ellipses
el = st_ellipse(pnt = dat, ex = dat$ex, ey = dat$ey)

# Plot 2
plot(el, graticule = TRUE, axes = TRUE)
# Faire 1 polygone = 1 arbre (rectangle + ellipse)

# 1 rectangle
pts = list(matrix(c(0,0,0,5,2,6,2,0,0,0),ncol=2, byrow=TRUE)) # TrunkHeight = 6, DBH = 2, 0 = xarbre-DBH/2
(Trunk = st_polygon(pts))
plot(Trunk, graticule = TRUE, axes = TRUE)

# 1 ellipse
dat = data.frame(
  x = 1, #centroid locations (x) à la moitiée du diamètre du tronc
  y = 7, #centroid locations (y) = hauteur du tronc + CrownHeight/2
  ex = 2, #Size along x-axis (CrownDiameter/2)
  ey = 1, #Size along y-axis (CrownHeight/2)
  stringsAsFactors = FALSE
)
dat = st_as_sf(dat, coords = c("x", "y")) #centroids
dat

# Calculate ellipses
Crown = st_ellipse(pnt = dat, ex = dat$ex, ey = dat$ey)

plot(Crown, graticule = TRUE, axes = TRUE)

a <- st_difference(st_union(Crown, Trunk)) # -> multypolygon dont on garde que les points qui ne se superposent pas
plot(a)

ggplot() + # plot 2 polygones
  geom_sf(data = Trunk) +
  geom_sf(data = Crown) 
# Multipolygone = tous les arbres
# on prend les arbres sélectionnés
SelectedTrees <- inventory %>% 
  filter(Selected == "1") %>%
  dplyr::select(idTree,DBH,TrunkHeight,TreeHeight,CrownHeight,CrownDiameter,Selected, Xutm, Yutm)

# sp::coordinates(SelectedTrees) <- ~ Xutm + Yutm
# 
# sp::proj4string(SelectedTrees) <- raster::crs(topography)
# 
# SelectedTrees <- st_as_sf(as(SelectedTrees,"SpatialPoints"))

# Pour 1 arbre

# le tronc
pts = list(matrix(c(SelectedTrees$Xutm[1]-(SelectedTrees$DBH[1]/100)/2, SelectedTrees$Yutm[1], 
                    SelectedTrees$Xutm[1]-(SelectedTrees$DBH[1]/100)/2, SelectedTrees$Yutm[1] + SelectedTrees$TrunkHeight[1], 
                    SelectedTrees$Xutm[1]+(SelectedTrees$DBH[1]/100)/2, SelectedTrees$Yutm[1] + SelectedTrees$TrunkHeight[1], 
                    SelectedTrees$Xutm[1]+(SelectedTrees$DBH[1]/100)/2, SelectedTrees$Yutm[1],
                    SelectedTrees$Xutm[1]-(SelectedTrees$DBH[1]/100)/2, SelectedTrees$Yutm[1]) # retour
                  ,ncol=2, byrow=TRUE)) # DBH en cm à passer en m

# pts[,3] <- c(rep(1:nrow(SelectedTrees), each=5))

(Trunk = st_polygon(pts))
plot(Trunk, graticule = TRUE, axes = TRUE)

# le houppier
dat = data.frame(
  x = SelectedTrees$Xutm[1], #centroid locations (x) m^me x que l'arbre
  y = SelectedTrees$Yutm[1] + SelectedTrees$TrunkHeight[1] + SelectedTrees$CrownHeight[1]/2, #centroid locations (y) = hauteur du tronc + CrownHeight/2
  ex = SelectedTrees$CrownDiameter[1]/2, #Size along x-axis (CrownDiameter/2)
  ey = SelectedTrees$CrownHeight[1]/2, #Size along y-axis (CrownHeight/2)
  stringsAsFactors = FALSE
)
dat = st_as_sf(dat, coords = c("x", "y")) #centroids
dat

# Calculate ellipses
Crown = st_ellipse(pnt = dat, ex = dat$ex, ey = dat$ey)

plot(Crown, graticule = TRUE, axes = TRUE)

a <- st_difference(st_union(Crown, Trunk)) # -> multypolygon dont on garde que les points qui ne se superposent pas
# a <- st_cast(a, "POLYGON")
plot(a)

ggplot() + # plot 2 polygones
  geom_sf(data = Trunk) +
  geom_sf(data = Crown) 
# Multipolygone = tous les arbres

Treefelling orientation

(voir shéma sur google slides) 1) choper le point (Trail) de la pistele plus proche de l'emplacement de l'arbre (Foot) 2) calculer l'angle (theta) entre le vecteur que forme la hauteur de l'arbre et le vecteur opposé à celui formé entre le point "Foot" et le point "Trail", par rapport au point "Foot" 3) rotation du polygone d'un angle de 60 +/- theta °

# Create a polygon ScndTrail
pts = list(matrix(c(286520, 583134,
                    286520, 583240, 
                    286524, 583240, 
                    286524, 583134,
                    286520, 583134) # retour
                  ,ncol=2, byrow=TRUE)) # DBH en cm à passer en m

(ScndTrail = st_polygon(pts))
ggplot() + # plot 2 polygones
  geom_sf(data = a) +
  geom_sf(data = ScndTrail) 

# Find the point (Trail) on the ScndTrail closest to the location of the tree (Foot)
Foot <- st_point(c(SelectedTrees$Xutm[1],SelectedTrees$Yutm[1]))

NearestPoints <- st_nearest_points(Foot, ScndTrail) # from the Foot of the tree to the ScndTrail

NearestPoint <- st_cast(NearestPoints, "POINT") # to have start (Foot) and end (Trail) points
Trail <- NearestPoint[[2]] # the point (Trail) on the ScndTrail closest to the location of the tree (Foot)

ggplot() + # plot 2 polygones
  geom_sf(data = a) + # the tree (polygone)
  geom_sf(data = Foot) + # the foot of the tree (point)
  geom_sf(data = ScndTrail) + # the 2nd trail (polygone)
  geom_sf(data = NearestPoints) + # the shortest way from the foot to the trail
  geom_sf(data = Trail) # the point on the ScndTrail closest to the location of the tree (Foot)


Trail[1]

# Compute theta angle
theta <- as.numeric(matlib::angle(c(Foot[1] - Foot[1], Foot[2] + SelectedTrees$TreeHeight[1]),
                                  c(Foot[1] - Trail[1], Foot[2] -Trail[2]), degree = TRUE))

Tree rotation

ref : https://github.com/jeffreyevans/spatialEco/blob/master/R/rotate.polygon.R

RotatePolygon <- function(p, angle, fixed) { # angle in the clockwise direction

  p.coords <- sf::st_coordinates(p)[,1:2] # Polygone coordinates extraction

  p.center <- suppressWarnings(sf::st_coordinates(fixed))

  rotate.coords <- function(xy, a, center) {

    co <- cos(-a * pi / 180)

    si <- sin(-a * pi / 180)

    adj <- matrix(rep(center, nrow(xy)), ncol=2, byrow=TRUE) # matrix with fixed point coordinates

    xy <- xy-adj

    cbind(co * xy[,1] - si * xy[,2],si * xy[,1] + co * xy[,2]) + adj
  }

  p.rotate <- rotate.coords(p.coords, a = angle, center = c(p.center[1], 
                                                            p.center[2]))

  Turned <- sf::st_sfc(sf::st_polygon(list(p.rotate))) # create the turned polygon

  return(Turned)

}

TurnedTrunkA <- RotatePolygon(Trunk, angle = 60 - theta, fixed = Foot) # turned trunk
TurnedCrownA <- RotatePolygon(Crown, angle = 60 - theta, fixed = Foot) # turned crown
TurnedTrunkB <- RotatePolygon(Trunk, angle = 300 - theta, fixed = Foot) # turned trunk (angle in the clockwise direction: 360-60-theta)
TurnedCrownB <- RotatePolygon(Crown, angle = 300 - theta, fixed = Foot) # turned crown (angle in the clockwise direction)

# For a random direction felling
RandomAngle <- sample(c(0:180), size = 1)
RandomTrunk <- RotatePolygon(Trunk, angle = RandomAngle, fixed = Foot) # turned trunk
RandomCrown <- RotatePolygon(Crown, angle = RandomAngle, fixed = Foot) # turned crown



ggplot() + # plot 2 polygones
  geom_sf(data = a) + # the tree (polygone)
  geom_sf(data = Foot) + # the foot of the tree (point)
  geom_sf(data = ScndTrail) + # the 2nd trail (polygone)
  geom_sf(data = NearestPoints) + # the shortest way from the foot to the trail
  geom_sf(data = Trail) + # the point on the ScndTrail closest to the location of the tree (Foot)
  geom_sf(data = TurnedTrunkA) +
  geom_sf(data = TurnedCrownA) +
  geom_sf(data = TurnedTrunkB) +
  geom_sf(data = TurnedCrownB) +
  geom_sf(data = RandomTrunk) +
  geom_sf(data = RandomCrown)

Create the line to pull the tree

p = NearestPoints
angle = 60
fixed = "foot"

RotateLine <- function(p, angle = 60,  
    fixed = c("foot", "center", "lower.left", "upper.right")) {
# if(class(p)[1] != "sf") p <- sf::st_as_sf(p)
p.coords <- sf::st_coordinates(p)[,1:2] # Polygone coordinates extraction

if(fixed[1] == "foot") {
p.center <- suppressWarnings(sf::st_coordinates(Foot))

} else if (fixed[1] == "center") {
  p.center <- suppressWarnings(sf::st_coordinates(sf::st_centroid(p)))

} else if(fixed[1] == "lower.left") {

  p.center <- c(min(sf::st_coordinates(p)[,1]),
                min(sf::st_coordinates(p)[,2]))

} else if(fixed[1] == "upper.right") {
  p.center <- c(max(sf::st_coordinates(p)[,1]),
                max(sf::st_coordinates(p)[,2]))
}

rotate.coords <- function(xy, a, center) {

  co <- cos(-a * pi / 180)

  si <- sin(-a * pi / 180)

  adj <- matrix(rep(center, nrow(xy)), ncol=2, byrow=TRUE) # matrix with fixed point coordinates

  xy <- xy-adj

  cbind(co * xy[,1] - si * xy[,2],si * xy[,1] + co * xy[,2]) + adj
}

p.rotate <- rotate.coords(p.coords, a = angle, center = c(p.center[1], 
                                                          p.center[2]))

Turned <- sf::st_sfc(sf::st_linestring(p.rotate)) # create the new polygon

return(Turned)

}

Trace <- RotateLine(NearestPoints, angle = 60, fixed = "foot")

ggplot() + # plot 2 polygones
  geom_sf(data = a) + # the tree (polygone)
  geom_sf(data = Foot) + # the foot of the tree (point)
  geom_sf(data = ScndTrail) + # the 2nd trail (polygone)
  geom_sf(data = NearestPoints) + # the shortest way from the foot to the trail
  geom_sf(data = Trail) + # the point on the ScndTrail closest to the location of the tree (Foot)
  geom_sf(data = TurnedTrunk) +
  geom_sf(data = TurnedCrown) +
  geom_sf(data = Trace)

All the selected trees

for (ind in c(1:nrow(SelectedTrees))) {
  pts[ind] = list(matrix(c(SelectedTrees$Xutm[ind]-(SelectedTrees$DBH[ind]/100)/2, SelectedTrees$Yutm[ind], 
                           SelectedTrees$Xutm[ind]-(SelectedTrees$DBH[ind]/100)/2, SelectedTrees$Yutm[ind] + SelectedTrees$TrunkHeight[ind], 
                           SelectedTrees$Xutm[ind]+(SelectedTrees$DBH[ind]/100)/2, SelectedTrees$Yutm[ind] + SelectedTrees$TrunkHeight[ind], 
                           SelectedTrees$Xutm[ind]+(SelectedTrees$DBH[ind]/100)/2, SelectedTrees$Yutm[ind],
                           SelectedTrees$Xutm[ind]-(SelectedTrees$DBH[ind]/100)/2, SelectedTrees$Yutm[ind]) # retour
                         ,ncol=2, byrow=TRUE)) # DBH en cm à passer en m

  (Trunk[ind] = st_polygon(pts[ind]))

  # le houppier
  dat[ind] = data.frame(
    x = SelectedTrees$Xutm[ind], #centroid locations (x) m^me x que l'arbre
    y = SelectedTrees$Yutm[ind] + SelectedTrees$TrunkHeight[ind] + SelectedTrees$CrownHeight[ind]/2, #centroid locations (y) = hauteur du tronc + CrownHeight/2
    ex = SelectedTrees$CrownDiameter[ind]/2, #Size along x-axis (CrownDiameter/2)
    ey = SelectedTrees$CrownHeight[ind]/2, #Size along y-axis (CrownHeight/2)
    stringsAsFactors = FALSE
  )
  # dat[ind] = st_as_sf(dat[ind], coords = c("x", "y")) #centroids

  # Calculate ellipses
  # Crown[ind] = st_ellipse(pnt = dat[ind], ex = dat[ind]$ex, ey = dat$ey) # ne fctne pas
  # a[ind] <- st_difference(st_union(Crown[ind], Trunk[ind])) # -> multypolygon dont on garde que les points qui ne se superposent pas


}
plot(Trunk, graticule = TRUE, axes = TRUE)
plot(Crown, graticule = TRUE, axes = TRUE)
plot(a)
ggplot() + # plot 2 polygones
  geom_sf(data = Trunk) +
  geom_sf(data = Crown) 

Abattages selon le type d’EFI

## No directional felling
if (directionalfelling == "0"){

} 
# créer un polygone par arbre ("Shadow"):
# origine = coordonnées de l’arbre (vecteurs "AccessibleTreesPoints")
# orientation = angle au hasard
# longueur = hauteur de l’arbre TreeHeight
# largeur = DBH
# hauteur de l’ellipse CrownHeight
# diamètre de l’ellipse CrownDiameter


## To direct only to avoid damage to future and reserve trees
if (directionalfelling == "1") {


}
# créer un polygone par arbre ("Shadow"):
# Réussite à 60% :
# origine = coordonnées de l’arbre (vecteurs "TreefallSuccess")
# longueur = hauteur de l’arbre
# largeur = DBH
# hauteur de l’ellipse
# diamètre de l’ellipse
# orientation = base du tronc vers la voie la plus proche (MainTrail ou 2ndTrail)
# Éviter à  100% les arbres "reserve" (vecteur "ReserveTreesPoints") et essayer d’éviter les arbres "future" (vecteur "AvenirTreesPoints")
# Echec à 40% :
# origine = coordonnées de l’arbre (vecteurs "TreefallFailure")
# sommet = 1 point au hasard
# longueur = hauteur de l’arbre
# largeur = DBH
# hauteur de l’ellipse
# diamètre de l’ellipse

## To direct to avoid damage to future and reserve trees + trail orientation
if (directionalfelling == "2") {


}
# créer un polygone par arbre ("Shadow"):
# Echec à 40% :
# origine = coordonnées de l’arbre (vecteurs "TreefallFailure")
# sommet = 1 point au hasard
# longueur = hauteur de l’arbre
# largeur = DBH
# hauteur de l’ellipse
# diamètre de l’ellipse
# Réussite à 60% :
# origine = coordonnées de l’arbre (vecteurs "TreefallSuccess")
# longueur = hauteur de l’arbre
# largeur = DBH
# hauteur de l’ellipse
# diamètre de l’ellipse
# orientation = 30-45◦, base du tronc vers la voie la plus proche (MainTrail ou 2ndTrail) MinTreefallOrientation MaxTreefallOrientation
# Éviter à  100% les arbres "reserve" (vecteur "ReserveTreesPoints") et essayer d’éviter les arbres "future" (vecteur "AvenirTreesPoints")

if (fuel =="1" |fuel =="2") {


}
# créer un polygone par arbre ("Shadow"):
# Echec à 40% :
# origine = coordonnées de l’arbre (vecteurs "TreefallFailure")
# sommet = 1 point au hasard
# longueur = hauteur de l’arbre
# largeur = DBH
# hauteur de l’ellipse
# diamètre de l’ellipse
# Réussite à 60% :
# origine = coordonnées de l’arbre (vecteurs "TreefallSuccess")
# longueur = hauteur de l’arbre
# largeur = DBH
# hauteur de l’ellipse
# diamètre de l’ellipse
# orientation = 30-45◦,
# if (piste la plus proche (MainTrail ou 2ndTrail) à ⩽ 6 m de l’arbre & ⩽ 20% de l’entrée de la parcelle (= contact piste/bord parcelle) jusqu’à max 6 m de l’arbre (buffergrappin)  ("piste à grappin" ?)) : houppier vers cette piste.
# Sinon : pied vers piste la plus proche (MainTrail ou 2ndTrail)
# Éviter à  100% les arbres "reserve" (vecteur "ReserveTreesPoints") et essayer d’éviter les arbres "future" (vecteur "AvenirTreesPoints")

Renseigner les arbres abattus :

inventory : Pour les arbres pour lesquels un Shadow a été créé : renseigner "1" dans une colonne "Cutted". if ProbedHollow = "0" : renseigner "cutted" if encore "NA" dans la colonne "DeathCause". if ProbedHollow = "1" renseigner "woodfuel" if encore "NA" dans la colonne "DeathCause".

# inventory <- inventory %>% 

# mutate(Cutted = ifelse(,"1",) %>% # a shadow = tree cutted

# mutate(DeathCause = ifelse(is.na(DeathCause) & ProbedHollow == "0","cutted", DeathCause) %>% #BO
#          
# mutate(DeathCause = ifelse(is.na(DeathCause) & ProbedHollow == "1","woodfuel", DeathCause) #BE

chablismortality

Fonction de mortalité chablis ("chablismortality"): élimination des arbres chablis 2ndaires de l’arbre abattu = faire mourir les arbres de coordonnées appartenant aux polygones "Shadow" : + Ajouter les coordonnées de ces arbres au vecteur "DamageTreesPoints" et au vecteur "DeadTreesPoints". + inventory : Pour ces arbres, renseigner "treefall2nd" ifencore "NA" dans la colonne "DeathCause". + leur faire des Shadow aussi : créer un polygone par arbre ("Shadow"): origine = coordonnées de l’arbre (vecteurs "DamageTreesPoints") orientation = même direction/sens que son abatteur longueur = hauteur de l’arbre largeur = DBH hauteur de l’ellipse diamètre de l’ellipse

# Ajouter les coordonnées de ces arbres au vecteur "DamageTreesPoints" et au vecteur "DeadTreesPoints".

# inventory : Pour ces arbres, renseigner "treefall2nd" ifencore "NA"  dans la colonne "DeathCause".

# leur faire des Shadow aussi : créer un polygone par arbre ("Shadow"):
# origine = coordonnées de l’arbre (vecteurs "DamageTreesPoints")
# orientation = même direction/sens que son abatteur 
# longueur = hauteur de l’arbre
# largeur = DBH
# hauteur de l’ellipse
# diamètre de l’ellipse


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