Récolter et visualiser des données OpenStreetMap avec R

Author

Ronan Ysebaert

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.

Installer les logiciels et initier l’environnement de travail

Installation

Il faut au préalable installer les logiciels suivant :

Initier une analyse

  • Créer un dossier de travail quelque part sur son ordinateur
  • Lancer R Studio
  • Créer un projet (pour disposer de chemins relatifs) : file > New Project > Se placer dans le dossier précédemment créer. Une fois créé cela permet en double cliquant sur le projet de réinitialiser la session de travail dans RStudio.

  • Télécharger le script R auquel est rattaché ce document, accessible ici, le placer dans le projet.

  • Ouvrir le projet, puis cliquer sur files en bas à droite, et ouvrir le script.

Rstudio

L’IDE RStudio se décompose en 4 fenêtres :

  • En haut à gauche, la fenêtre d’édition du script que l’on peut exécuter ligne par ligne avec Cntrl-Entrée (Cmd-⏎ sur Mac).
  • En bas à gauche, la console, qui exécute et affiche les résultats des commandes
  • En haut à droite, la fenêtre d’environnement, qui affiche notamment tous les objets créés avec R.
  • En bas à gauche, une fenêtre multi-onglets qui sert à naviguer et ouvrir des fichiers : avec Files > c’est là qu’on ira chercher le script chargé avec le projet), plots qui affiche les cartes et graphiques, packages qui permet d’installer des packages R et afficher ceux qu’ils sont installés et help qui donne de l’aide sur les fonctions (nom, usage, possibles arguments, exemples).

Installer les packages nécessaires aux analyse

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)

Récolter des données depuis OpenStreetMap

Quel objet OpenStreetMap ?

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.

Quel espace d’étude ?

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 :

  • Xmin : 5.34
  • Xmax : 6.81
  • Ymin : 44.45
  • Ymax : 45.25

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.

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))

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.

Code
# 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…
Code
# On ne garde que les polygones qui ont effectivement un nom
winter <- winter[!is.na(winter$name),]

Visualisation des résultats

Visualisation de base

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.

Code
plot(st_geometry(winter))

Visualisation mise en page

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

Code
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 :

  • Changer le niveau de zoom de la fonction get_title. Ici paramétré à 10, il peut être plus (11, 12) ou moins (7,8, 9) précis.
  • Changer la couleur des polygones des stations de ski, ainsi que de leur bordure. Dans 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.
  • Changer le style des tuiles OpenStreetMap. Nous avons ici utilisé les tuiles proposées par défaut, mais il en existe plein d’autres. Pour changer ce style, dans get_tiles, rajouter l’argument

Par exemple, voici ce que cela rendrait en utilisant le thème Stamen.TonerBackground.

Code
# 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.

Code
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…

Pour aller plus loin

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.