knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
library(SamsaRaLight) library(dplyr)
In previous tutorials, tree crowns were represented using simple symmetric shapes ("E" and "P"). However, real tree crowns are often asymmetric, both horizontally (different crown radii in different directions) and vertically (maximum crown width not located at mid-crown for "E" nor crown base height for "P").
In this vignette, we will use an inventory with asymmetric crown shapes. We will work with a non axis-aligned rectangle inventory zone to show that rotating a stand where crown are represented as assymetric shapes is tricky.
SamsaRaLight supports the following crown types:
"E", "P", "2E", "4P", "8E". The number indicates how many crown parts
are used. The letter indicates the geometric shape (Ellipsoid or
Paraboloid). Choose the simplest crown type that matches your data
quality.
Symetric shapes used in the Tutorial 1, defined by the mean crown radius
(mean of the four radius rn_m, rs_m, re_m and rw_m) and the
crown depth (computed as h_m - hbase_m. These shapes are simple and
efficient, but cannot represent crown asymmetry, knowing that crown
asymmetry strongly affects light interception.
Single ellipsoidal volume
Same radius in all directions
Maximum radius automatically computed at mid-crown height
(hmax_m = hbase_m + (h_m - hbase_m) / 2
Single paraboloid volume
Same radius in all directions
Maximum radius located at crown base height (hmax_m = base_m)
More complex shapes are created by splitting the crown into multiple geometric parts.
Crown split into an upper and a lower ellipsoid
Allows vertical asymmetry
Requires hmax_m, the height of maximum crown radius
Crown remains horizontally symmetric. Use this shape when crown expansion is not centered vertically.
Crown split into four horizontal paraboloids
Different radii allowed in the four cardinal directions: rn_m
(north), rs_m (south), re_m (east) and rw_m (west)
Crown is vertically symmetric: hmax_m is NOT required (paraboloid,
thus hmax = hbase_m)
Use this shape when crowns are laterally deformed by competition.
Crown split into upper and lower parts (vertical asymmetry)
each split into four cardinal directions (horizontal asymmetry)
Requires: rn_m, rs_m, re_m, rw_m and hmax_m
This is the most detailed crown representation available.
We illustrate asymmetric crowns using the Bechefa marteloscope,
stored in the package as SamsaRaLight::data_bechefa.
This marteloscope was installed in Belgian Ardennes by Gauthier Ligot in the scope of the IRRES project, which investigates the transition from even-aged to uneven-aged forest management. This is a mature mixed stand of Douglas fir and spruce in the Belgian Ardennes. The stand has been uneven-aged for more than 10 years.
All trees use the "8E" crown type, allowing both horizontal and
vertical asymmetry. Each tree provides four directional crown radii
(rn_m for maximum crown radius pointing north, rs_m for south,
re_m for east, rw_m for west) and the height of maximum crown
expansion (hmax_m).
head(SamsaRaLight::data_bechefa$trees)
The subsequent steps are identical to those used with symmetric crowns (see Tutorial 1). Introducing asymmetric crowns only requires adapting the initial tree inventory. Horizontal asymmetry is clearly visible in the plots, whereas vertical asymmetry is more difficult to perceive graphically because crowns are displayed as projected shapes.
It is important to note that the north2x parameter must be a multiple
of 90° (i.e. 0°, 90°, 180°, or 270°) when the virtual stand contains at
least one horizontally asymmetric crown type (i.e. "4P" or "8E").
Horizontal asymmetry is defined by assigning different crown radii to
the four cardinal directions (north, south, east, and west). These four
directional radii are internally converted into planar X–Y axis-aligned
radii according to the value of north2x.
stand_bechefa <- SamsaRaLight::create_sl_stand( trees_inv = SamsaRaLight::data_bechefa$trees, cell_size = 5, latitude = SamsaRaLight::data_bechefa$info$latitude, slope = SamsaRaLight::data_bechefa$info$slope, aspect = SamsaRaLight::data_bechefa$info$aspect, north2x = SamsaRaLight::data_bechefa$info$north2x, core_polygon_df = SamsaRaLight::data_bechefa$core_polygon ) plot(stand_bechefa) plot(stand_bechefa, top_down = TRUE)
Such as in the previous tutorial, we may want to rotate the
stand in order to axis-align it. However, because of the same reason as
the described above for north2x when considering at least one
horizontal asymmetric crown, we can rotate the stand only by a multiple
of 90°, leading to impossibility to axis-align the stand in most case.
For this reason, the argument "modify_polygon = aarect" is desactivated
if at least one horizontal asymmetric crown is present in the stand.
However, the user can still transform and ensure its inventory zone is a
perfect rectangle (minimum enclosing rectangle area) with the argument
modify_polygon = "rect". Otherwise, to not modify the given polygon,
the default argument is modify_polygon = "none".
To counteract the fact that plot is empty around the non-axis aligned
rectangle inventory zone, we can use the argument fill_around = TRUE
when creating the vitual stand with the create_sl_stand(). This will
add virtual trees outside the inventory polygon, within the simulation
grid:
sampled from the inventoried trees,
randomly positioned outside the inventory zone,
until the surrounding area reaches the same basal area per hectare as the inventory zone.
stand_bechefa_filled <- SamsaRaLight::create_sl_stand( trees_inv = SamsaRaLight::data_bechefa$trees, cell_size = 5, latitude = SamsaRaLight::data_bechefa$info$latitude, slope = SamsaRaLight::data_bechefa$info$slope, aspect = SamsaRaLight::data_bechefa$info$aspect, north2x = SamsaRaLight::data_bechefa$info$north2x, core_polygon_df = SamsaRaLight::data_bechefa$core_polygon, modify_polygon = "rect", fill_around = TRUE ) plot(stand_bechefa_filled)
When plotting, the argument only_inv = TRUE allows displaying only the
inventoried trees (inside the yellow polygon). Added trees are
identified in the stand object using the logical column added_to_fill.
table(stand_bechefa_filled$trees$added_to_fill)
A summary of both the inventory zone and the full virtual stand can be
obtained with the summary() function, showing that both zones exhibit
similar basal area per hectare and mean quadratic diameter.
summary(stand_bechefa_filled)
This approach assumes that the surrounding stand is structurally similar to the inventoried area. As mentionned above, this add stochasticity in the stand virtualisation, thus to be considered with care and maybe with duplicates for rigorous scientific studies for example.
radiations_bechefa <- SamsaRaLight::get_monthly_radiations( latitude = SamsaRaLight::data_bechefa$info$latitude, longitude = SamsaRaLight::data_bechefa$info$longitude) output_bechefa <- SamsaRaLight::run_sl( sl_stand = stand_bechefa_filled, monthly_radiations = radiations_bechefa ) plot(output_bechefa)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.