Code
# Appeler la librairie
library(osmdata)
library(sf)
library(maptiles)
# Définit une bounding box
q <- opq(bbox = c(5.34, 44.45, 6.81, 45.25))L’objectif consiste à importer des points d’intérêt issus de la base de données collaborative OpenStreetMap avec le logiciel R et les visualiser avec des packages dédiés en R (sf, maptiles et mapsf). On se propose ici de représenter l’emprise des domaines skiables autour du parc national des Écrins dans les Alpes du Sud.
Il faut au préalable installer les logiciels suivant :
L’IDE RStudio se décompose en 4 fenêtres :
En installant R, énormément de fonctions sont disponibles pour importer des données, les manipuler et les visualiser. Néanmoins certaines fonctions spécifiques requièrent l’installation de librairies additionnelles.
Nous allons avoir besoin de 4 librairies additionnelles :
osmdata pour importer des données d’OpenStreetMap.sf pour manipuler des données géographiques.maptiles et mapsf pour les représentations cartographiques.Installer ces librairies dans RStudio (packages > Install)
Tous les objets contenus dans la base de données OpenStreetMap sont référencés par des clés-valeurs (key/values. Le préalable consiste à identifier l’objet d’intérêt sur lequel doit porter l’analyse.
Pour ce faire, il faut réaliser une recherche grâce au wiki osm.
Pour cet exemple, nous allons nous intéresser aux espaces skiables dans les Alpes du Sud, autour des Écrins. Une recherche sur le wiki OSM nous indique que le tag approprié est landuse=winter_sports.
On peut facilement prévisualiser les résultats contenus dans OpenStreetMap en utilisant l’API overpassturbo, en zoomant sur l’espace désiré et en exécutant la requête. Cela permet notamment de constater si c’est la bonne clé-valeur qui est choisie. Dans notre cas de figure, si nous voulions le tracé des pistes de ski, il faudrait exécuter une autre requête.
A noter par exemple qu’on pourrait aussi extraire les cafés, les restaurants, les parcs et jardins ou tout autre chose. Un tutoriel complet est accessible ici pour aller en ce sens. Pour sélectionner l’ensemble des restaurants d’une zone, il faudrait se référer à la clé-valeur amenity=restaurant.
On ne peut pas réaliser cette requête sur l’ensemble du Monde, les serveurs qui supportent le partage de données d’OpenStreetMap ne le supporteraient pas ! Il faut donc définir un espace d’étude définie par une bounding box qui définit l’emprise géographique de son espace d’étude.
Cet espace d’étude est défini par des coordonnées géographiques minimales et maximales, exprimées en latitude et longitude (X, Y). Pour trouver ces coordonnées, on peut utiliser Google Maps, et en faisant un clic droit sur un endroit de la carte. On obtient alors les coordonnées géographiques de l’endroit désiré.
En ce qui nous concerne, nous considérons l’espace avoisinant le parc naturel national des Écrins, qui est défini par ces coordonnées :
Le script R commence par créer un objet pour rentrer ces coordonnées, que nous allons ultérieurement utiliser. La fonction opq du package osmdata est dédiée à cela. On appelle aussi les librairies utiles préalablement installées.
# Appeler la librairie
library(osmdata)
library(sf)
library(maptiles)
# Définit une bounding box
q <- opq(bbox = c(5.34, 44.45, 6.81, 45.25))On peut alors créer une requête qui répond à la clé-valeur sélectionnée suivant le formalisme attendu par la librairie osmdata. Une requête OSM peut envoyer des objets géographiques de différents types (des surfaces, des points, des lignes). Etant donné que nous nous intéressons à l’emprise des domaines skiables, on ne garde que les polygones.
Comme on voudra afficher le nom des stations sur la carte, on ne garde que les domaines skiables nommés dans OpenStreetMap.
# Appeler la librairie
winter <- add_osm_feature(opq = q, key = "landuse", value = "winter_sports")
# Exécuter la requête
res <- osmdata_sf(winter)
# Extraire les polygones issus de la requête
winter <- res$osm_polygons
# Pour voir les premières colonnes du tableau de données (objet sf) qui en résulte
head(winter, 20)| osm_id | name | access | area | description | landuse | name.oc | operator | piste.difficulty | piste.grooming | piste.type | source.name.oc | sport | website | wikidata | wikipedia | geometry | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 45094811 | 45094811 | Bardonecchia | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.bardonecchiaski.com | NA | NA | POLYGON ((6.69942 45.07118,… |
| 45094892 | 45094892 | Bardonecchia - Jafferau | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.bardonecchiaski.com/ | NA | NA | POLYGON ((6.712377 45.08244… |
| 45117869 | 45117869 | Les 3 Vallées | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.les3vallees.com | NA | NA | POLYGON ((6.597049 45.27054… |
| 45146739 | 45146739 | Les Deux Alpes | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.les2alpes.com | NA | NA | POLYGON ((6.119522 45.00612… |
| 45146740 | 45146740 | La Grave | NA | NA | NA | winter_sports | NA | NA | freeride | backcountry | downhill | NA | skiing | https://www.la-grave.com | NA | NA | POLYGON ((6.248538 45.00005… |
| 45438172 | 45438172 | Montgenèvre | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.montgenevre.com | NA | NA | POLYGON ((6.714902 44.93463… |
| 45438175 | 45438175 | Sansicario | NA | NA | NA | winter_sports | NA | Vialattea | NA | NA | NA | NA | NA | https://www.vialattea.it | NA | NA | POLYGON ((6.840727 44.97423… |
| 45438982 | 45438982 | Alpe d’Huez Grand Domaine | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.alpedhuez.com/ | NA | NA | POLYGON ((6.101545 45.17182… |
| 45524871 | 45524871 | Aussois | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.aussois.com | NA | NA | POLYGON ((6.737677 45.23128… |
| 49393402 | 49393402 | Claviere | NA | NA | NA | winter_sports | NA | Vialattea | NA | NA | NA | NA | NA | https://www.vialattea.it | NA | NA | POLYGON ((6.752032 44.90592… |
| 294826109 | 294826109 | Domaine de Beldina | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | http://www.skidefond-prapoutel.com/ | NA | NA | POLYGON ((5.985763 45.2445,… |
| 294826110 | 294826110 | Les 7 Laux | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | http://www.les7laux.com/ | NA | NA | POLYGON ((5.991699 45.25694… |
| 296191615 | 296191615 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | POLYGON ((5.874674 45.12062… |
| 296909728 | 296909728 | Les Orres | NA | NA | NA | winter_sports | NA | SEMLORE | NA | NA | NA | NA | NA | https://www.lesorres.com | NA | NA | POLYGON ((6.557693 44.49962… |
| 296979402 | 296979402 | Vars/Risoul | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.vars.com | NA | NA | POLYGON ((6.603338 44.62603… |
| 331209851 | 331209851 | Autrans - Grand domaine la Sure | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | POLYGON ((5.58018 45.23232,… |
| 331655170 | 331655170 | Montagnes de Lans | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.lansenvercors.com | NA | NA | POLYGON ((5.613159 45.09799… |
| 539977729 | 539977729 | Chaillol | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.chaillol.fr | NA | NA | POLYGON ((6.152558 44.69021… |
| 540000677 | 540000677 | Ancelle | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.ancelleski.fr | NA | NA | POLYGON ((6.198928 44.60496… |
| 547761780 | 547761780 | Sainte-Anne la Condamine | NA | NA | NA | winter_sports | NA | NA | NA | NA | NA | NA | NA | https://www.sainte-anne.com | NA | NA | POLYGON ((6.695952 44.45667… |
# On ne garde que les polygones qui ont effectivement un nom
winter <- winter[!is.na(winter$name),]A ce stade, il est possible de créer une première visualisation de ce que nous venons d’extraire, mais ce n’est pas si facile de s’y retrouver.
plot(st_geometry(winter))
On peut utiliser le package maptiles pour afficher des tuiles OpenStreetMap pour mieux localiser notre espace d’étude et le package mapsf pour mettre en page la carte (titre, échelle, sources).
On peut faire beaucoup d’autres représentations avec mapsf, comme le rappelle ce site
library(maptiles)
library(mapsf)
# Transformer pour une visualisation adaptée à la France
winter <- st_transform(winter, "EPSG:2154")
# Télécharger les tuiles
tiles <- get_tiles(winter, zoom = 10, crop = TRUE)
# Visualiser les tuiles
plot_tiles(tiles)
# Rajouter les domaines skiables
mf_map(winter, border = NA, col = "#de110260", add = TRUE)
mf_label(winter, var = "name", halo = TRUE, overlap = FALSE, cex = .6)
# Habillage de la carte
mf_title("Domaines skiables autour du parc national des Écrins", inner = TRUE)
mf_scale(size = 25)
mf_credits("Source: OpenStreetMap et contributeurs, 2023\nRéalisation: Ronan Ysebaert, Nicolas Lambert, 2023")
On peut aisément s’amuser à modifier cette carte, comme par exemple :
get_title. Ici paramétré à 10, il peut être plus (11, 12) ou moins (7,8, 9) précis.mf_map, l’épaisseur est gérée par l’argument lwd (valeur par défaut = 0.7), la couleur du fond par l’argument col et la couleur de la bordure par l’argument border. On peut saisir ici les couleurs par défaut proposées dans R ou choisir sa propre couleur suivant un code hexadécimal, que l’on peut trouver avec des petits outils comme colorpicker.Par exemple, voici ce que cela rendrait en utilisant le thème Stamen.TonerBackground.
# Télécharger les tuiles
tiles <- get_tiles(winter, crop = TRUE,
provider = "Stamen.TonerBackground", zoom = 10)
# Visualiser les tuiles
plot_tiles(tiles)
# Rajouter les domaines skiables
mf_map(winter, border = NA, col = "#de110260", add = TRUE)
mf_label(winter, var = "name", halo = TRUE, overlap = FALSE, cex = .6)
# Habillage de la carte
mf_title("Domaines skiables autour du parc national des Écrins", inner = TRUE)
mf_scale(size = 25)
mf_credits("Source: OpenStreetMap et contributeurs, 2023\nRéalisation: Ronan Ysebaert, Nicolas Lambert, 2023")
Au final, on crée un dossier data dans l’espace de travail pour enregistrer dans un format géographique ces données qui ont été extraites d’OpenStreetMap. Cela peut être utile pour réutiliser ces données pour la suite.
st_write(winter, "data/winter.geojson")Sur cette carte, on a quand même envie de zoomer, pouvoir cliquer sur les domaines skiables, pour par exemple visualiser le site Web de ces stations de ski, souvent disponibles…
Pour cela on peut passer par des outils de cartographie interactifs. Il en existe disponibles avec R (leaflet, mapview), mais on peut aussi utiliser des librairies dédiées en JavaScript…
Une fois que tu as réussi à reproduire l’analyse, tu peux t’amuser à choisir une autre zone d’étude, comme les Alpes du Nord en reproduisant ce code et en adaptant la bounding box, ou utiliser d’autres objets d’intérêt issus d’OpenStreetMap. Tu peux te reporter à la documentation de Timothée Giraud pour cela. Le code est un peu différent lorsqu’il s’agit de points (localisation précise d’un restaurant, par exemple) et non d’une surface.