Créer des points aléatoires d'altitude donnée sur une carte

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Fred Santos
Messages : 236
Enregistré le : 11 Avr 2009, 10:00
Contact :

Créer des points aléatoires d'altitude donnée sur une carte

Messagepar Fred Santos » 30 Sep 2024, 07:07

Bonjour à tous,

Je sais certes comment on peut projeter des points aléatoires sur la carte de France ; par exemple à l'aide du code suivant :

Code : Tout sélectionner

library(fakir)
library(sf)

## Carte de la France :
plot(fra_sf$geometry)

## Projeter 40 points au hasard sur la carte de France :
random.points <- st_sample(fra_sf, size = 40)
plot(st_geometry(fra_sf))
plot(random.points, pch = 20, col = "red", add = TRUE)


Mon problème est de pouvoir poser des contraintes d'altitude sur les points générés au hasard sur cette carte. Or, si j'ai bien compris (je suis absolument ignorant en carto, désolé !), la manière canonique d'obtenir l'altitude de points en R est d'abord d'avoir leurs coordonnées (lat, long), puis d'utiliser par exemple le package {elevatr} pour obtenir l'altitude correspondant à ces coordonnées à l'aide d'un service web externe. Autrement dit, puisqu'il faut déjà connaître la position des points pour connaître leur altitude, il ne semble pas possible de générer directement des points dans une gamme d'altitude donnée (par exemple, obtenir 40 points aléatoires, mais dont l'altitude est comprise entre 300 et 1000 mètres).
Connaissez-vous un moyen d'y parvenir ? (On peut certes imaginer de générer des points un par un, de les rejeter s'ils ne sont pas dans la bonne gamme d'altitude, et de continuer jusqu'à en avoir 40, mais ça ne semble ni très efficace ni forcément très malin.)

Merci !

Michaël Delorme
Messages : 71
Enregistré le : 04 Avr 2016, 10:21

Re: Créer des points aléatoires d'altitude donnée sur une carte

Messagepar Michaël Delorme » 30 Sep 2024, 08:44

À partir d'un MNT qui porte par définition un attribut d'altitude. Il suffit de trouver/créer la bonne source, selon le besoin (précision, couverture...). Ex. :

Pour l'IGN il faut assembler les départements ; pour le MNT sur l'Europe il faut gérer le raster de 10 Go...

Ensuite, on peut utiliser par exemple

Code : Tout sélectionner

terra::spatSample()
en ayant conservé que les points (pixels, cellules,...) se trouvant dans la tranche d'altitude.

Exemple sur un département, avec les données IGN (provenant d'un miroir) :
(les dalles du département sont compressées avec 7z, il faut avoir 7z pour décompresser)

Code : Tout sélectionner

library(terra)
library(dplyr)
library(fs)
library(purrr)

url_dtm <- "http://files.opendatarchives.fr/professionnels.ign.fr/bdalti/BDALTIV2_2-0_25M_ASC_LAMB93-IGN69_D001_2021-01-13.7z"

download.file(url_dtm"dtm.7z"method "curl")
system("7z e dtm.7z")

# assemblage des dalles
dir_ls("."glob "*.asc") |>
  
map(rast) |>
  
set_names(NULL) |>
  
sprc() |>
  (\(
rexec(mosaicr, !!!list(fun mean)))() |>
  
writeRaster("dtm.tif"names "alti")

dtm <- rast("dtm.tif")
plot(dtm)

bande <- ifel(dtm 300 dtm 1000dtmNA)
plot(bande)

spatSample(bande40na.rm TRUE, as.points TRUE) |> 
  
plot(add TRUE)

# pour conserver les coordonnées dans un data.frame
final <- spatSample(bande40na.rm TRUExy TRUE)
 

Image

Avec le MNT Europe (un peu long, peut renvoyer moins de points que demandé : augmenter l'échantillon) :

Code : Tout sélectionner

library(terra)
library(dplyr)
library(sf)

url_dtm <- "/vsicurl/https://s3.eu-central-1.wasabisys.com/eumap/dtm/dtm_elev.lowestmode_gedi.eml_mf_30m_0..0cm_2000..2018_eumap_epsg3035_v0.3.tif"

aoi <- read_sf("/vsicurl/https://static.data.gouv.fr/resources/admin-express-cog-simplifiee-2024-metropole-drom-saint-martin-saint-barthelemy/20240930-094021/adminexpress-cog-simpl-000-2024.gpkg",
               
layer "region",
               
options "IMMUTABLE=YES") |>
  
filter(insee_reg "06") |> 
  
summarise() |> 
  
st_transform("EPSG:3035")

dtm <- rast(url_dtm)

dtm_aoi <- crop(dtmaoi)

bande <- ifel(dtm_aoi 300 dtm_aoi 1000dtm_aoiNA)

final <- 
spatSample(bande90na.rm TRUExy TRUE)
 


Bref, en terme de temps à y passer, si tu n'as pas déjà un MNT de ta zone d'étude et si tu n'as pas beaucoup de points, ton approche est peut-être plus rapide...

Fred Santos
Messages : 236
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: Créer des points aléatoires d'altitude donnée sur une carte

Messagepar Fred Santos » 30 Sep 2024, 13:09

Merci beaucoup pour ces info et ce bout de code !


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité