inventory multilignes "MainTrail ", "2ndTrail" vecteur "AccessibleTreesPoints", "SelectedTreesPoints", "AvenirTreesPoints", "ReserveTreesPoints", "DeadTreesPoints", "HollowTreesPoints" et "Fuel woodTreesPoints"
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
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 } }
# 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
(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))
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)
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)
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)
## 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")
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
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
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.