Code
require(conflicted)
require(knitr)
require(magrittr)
require(mapview)
require(pander)
require(plotly)
require(spatstat)
require(tidyverse)
conflict_prefer("set_names", "purrr")Linking to GEOS 3.9.1, GDAL 3.3.2, PROJ 8.0.1; sf_use_s2() is TRUE
Initialement et lors des nouveaux inventaires, les arbres sont positionnés de manière relative au sein des quadrats de 10$$10 m. Pour pouvoir positionner les arbres à l’échelle des parcelles d’inventaire, il faut disposer de la position des piquets
Une partie des piquets délimitant les quadrats a été positionnée au tachéomètre (Bornage IRSTEA), les piquets manquants, car non accessibles avec l’appareil, l’ont été fin 2024 par triangulation simple, par mesure de coordonnées polaires à partir de piquets déjà positionnés.
## Positions piquets (format IRSTEA)
bornage <- "SWIO_RUN_MALO1_2_bornage_20150427.ods" %>%
str_c("data/bornage/", .) %>%
read_ods(sheet = 1)
tmp <- "SWIO_RUN_MALO3_bornage_20150404.ods" %>%
str_c("data/bornage/", .) %>%
read_ods(sheet = 1) %>%
transform(sub_id = as.character(sub_id))
bornage %<>% bind_rows(tmp) Apercu des données :
# Angle MALO1-2 depuis bornage
theta <- bornage %>%
dplyr::filter(! is.na(sub_id)) %>%
with((y[sub_id == "A9"] - y[sub_id == "A0"]) / (x[sub_id == "A9"] - x[sub_id == "A0"])) %>%
atan()
# Angle MALO3 depuis bornage
theta2 <- bornage %>%
dplyr::filter(! is.na(sub_id)) %>%
with((y[sub_id == "201"] - y[sub_id == "11"]) / (x[sub_id == "201"] - x[sub_id == "11"])) %>%
atan()
# Angle MALO1-2 depuis GPS
#theta2 <- atan(with(pspdf, (yutm[Name == "A10"] - yutm[Name == "A0"])/(xutm[Name == "A10"] - xutm[Name == "A0"])))Warning: some mark values are NA in the point pattern x
# Rotation du semis de points
rotate_spdf <- function(x, theta)
{
x %<>%
as.ppp() %>%
spatstat.geom::rotate(- theta, centre = "bottomleft") %>%
st_as_sf() %>%
dplyr::filter(! is.na(plot_id)) # bug: rétroconversion depuis ppp, ajout ligne POLYGON ?
names(x) %<>% str_replace("marks.", "")
x
}
# Ajouts des coordonnées
add_coords <- function(x, spatial = FALSE, suffix = "")
{
res <- x %>%
sf::st_coordinates() %>%
data.frame()
n <- str_c(c("x", "y"), suffix)
names(res)[1 : 2] <- n
res <- bind_cols(x, res)
if(spatial) res %<>% st_as_sf(coords = n)
res
}# Import des relevés terrain
dat <- read_ods("data/bornage/20241203_relevés bornage MALO2.ods", sheet = "correc") %>%
mutate(x = NA, y = NA)
# Import des position de référence (bornage IRSTEA)
# born <- st_read("data/sig/bornage_MALO_IRSTEA.gpkg")
# names(born) %<>% str_to_lower()
# Conversion azimuth (A) > trigonométrie
dat %<>%
mutate(azim = ((360 - azim) + 90) %% 360, # chgt d'origine et sens
azimrad = azim * (pi / 180)) # radianscoord_rel_pol <- function(df, group = c("cible_sub_id", "cible_dir")) {
df %<>%
mutate(x = x_ref + dis_hor * cos(azimrad),
y = y_ref + dis_hor * sin(azimrad)) %>%
dplyr::select(- ends_with("_ref")) %>%
group_by(df[,!! group]) %>%
summarise(x = mean(x, na.rm = FALSE),
dx = diff(range(x, na.rm = FALSE)),
y = mean(y, na.rm = FALSE),
dy = diff(range(y, na.rm = FALSE)),
n = n()) %>%
ungroup()
df
}Nombre de piquets à positionner :
Utilisation des coordonnées des piquets déjà positionnés (manip IRSTEA)
`summarise()` has grouped output by 'cible_sub_id'. You can override using the
`.groups` argument.
Références manquantes après première fusion :
Positionnement à partir des cibles nouvellement positionnées :
`summarise()` has grouped output by 'cible_sub_id'. You can override using the
`.groups` argument.
Références manquantes après seconde fusion :
[1] 0