Chapitre 13 Focus sur OpenStreetMap
OpenStreetMap (OSM) est un projet de cartographie participative qui a pour but de constituer une base de données géographiques libre à l’échelle mondiale. OpenStreetMap vous permet de voir, modifier et d’utiliser des données géographiques du monde entier.
Conditions d’utilisation
OpenStreetMap est en données ouvertes : vous êtes libre de l’utiliser pour n’importe quel but tant que vous créditez OpenStreetMap et ses contributeurs. Si vous modifiez ou vous appuyez sur les données d’une façon quelconque, vous pouvez distribuer le résultat seulement suivant la même licence. (…)
Contributeurs
(…) Nos contributeurs incluent des cartographes enthousiastes, des professionnels du SIG, des ingénieurs qui font fonctionner les serveurs d’OSM, des humanitaires cartographiant les zones dévastées par une catastrophe et beaucoup d’autres. (…)
R propose une série de packages qui se basent sur OpenStreetMap.
Dans ce chapitre nous allons utiliser les packages suivants :
# packages CRAN
library(ggspatial)
library(leaflet)
library(mapview)
library(osmdata)
library(osmextract)
library(osrm)
library(sf)
library(tidyverse)
# packages Github
library(COGiter) # remotes::install_github("MaelTheuliere/COGiter")
library(gouvdown) # remotes::install_github("spyrales/gouvdown")
# Données
load("extdata/sirene.RData")
load("extdata/admin_express.RData")
13.1 Afficher une carte interactive
Les deux principaux packages qui permettent d’afficher une carte interactive basée sur OSM sont {leaflet}
et {mapview}
, vus précédemment.
{leaflet}
utilise la libraire javascript Leaflet pour créer des cartes interactives.
Site web de {leaflet}
: Leaflet for R
{mapview}
s’appuie sur {leaflet}
pour créer des cartes interactives, son utilisation est plus simple car les instructions sont très concises.
Site web de {mapview}
: mapview
13.2 Importer les fonds de carte pour ggplot
Le package {ggspatial}
permet de télécharger et d’afficher des fonds de cartes raster issu d’OSM grâce à la fonction annotation_map_tile()
.
<- filter(sirene44, APET700 == "1071C") %>%
boul_44 select(SIREN, NOMEN_LONG)
ggplot(boul_44) +
annotation_map_tile(type = "osm") +
geom_sf() +
theme_gouv_map()
| | | 0% | |================== | 25% | |=================================== | 50% | |==================================================== | 75% | |======================================================================| 100%
13.3 Importer des données OSM
13.3.1 {osmdata}
Le package {osmdata}
permet d’extraire des données vectorielles depuis OSM en utilisant l’API Overpass turbo.
On développe ici un exemple dans lequel on extrait les pistes cyclables sur Nantes Métropole.
On commence par définir la bbox de requête, au CRS 4326.
# Sélection de l'emprise de la requête,
<- epci_geo %>%
nantes_metro filter(NOM_EPCI == "Nantes Métropole") %>%
st_transform(4326)
# Définition d'une bounding box de requête
<- opq(bbox = st_bbox(nantes_metro, 4326))
q
# Extraction des pistes cyclables
<- add_osm_feature(opq = q, key = 'highway', value = "cycleway")
req <- osmdata_sf(req)
res
# Reduction du resultats
# (les points composant les polygones sont supprimés)
<- unique_osmdata(res)$osm_lines
res mapview(res)
L’API comprend des limites : l’emprise de la surface d’interrogation et le nombre de requêtes envoyées par jour ne sont pas infinis.
Site web d’{osmdata}
: osmdata
13.3.2 osmextract
Le package {osmextract}
permet d’extraire des données depuis une base de données OSM directement, sans limitation.
Ce package permet de travailler sur des volumes de données très importants.
Voici un exemple d’usage d’{osmextract}
, toujours sur les pistes cyclables, qui va de la récupération des données au calcul d’indicateurs par commune.
https://gitlab-forge.din.developpement-durable.gouv.fr/dreal-pdl/csd/sgbd_datamart/-/blob/master/data-raw/chargement_pistes_cyclables_osm.R
Site web d’{osmextract}
: osmextract
13.4 Calculer des itinéraires
Le package {osrm}
sert d’interface entre R et le service de calcul d’itinéraire OSRM .
Ce package permet de calculer des matrices de temps et de distances, des itinéraires routiers, des isochrones.
Le package utilise par défaut le serveur de démonstration d’OSRM.
En cas d’utilisation intensive il est fortement recommandé d’utiliser sa propre instance d’OSRM (avec Docker).
13.4.1 Calcul d’un itinéraire
La fonction osrmRoute()
permet de calculer des itinéraires.
On l’utilise ici pour un trajet du CVRH de Nantes à la gare SNCF.
Le paramètre osrm.profile
sert à indiquer le profil du voyageur : véhiculé (“car”), cycliste (“bike”) ou piéton (“foot”).
Par défaut elle renvoie un objet géo, correspondant à l’itinéraire calculé.
<- data.frame(services = c("CVRH Nantes", "Gare Nord Nantes"),
mes_adresses lat = c(47.22542, 47.217777),
long = c(-1.574013, -1.542315)) %>%
st_as_sf(coords = c("long", "lat"), crs = 4326) %>%
st_transform(3857)
mapview(mes_adresses)
<- osrmRoute(src = mes_adresses[1,], dst = mes_adresses[2,], osrm.profile = "bike")
trajet mapview(list(mes_adresses, trajet))
osrmRoute(src = mes_adresses[1,], dst = mes_adresses[2,], overview = FALSE, osrm.profile = "bike")
duration distance
15.95 3.34
Le paramètre overview lorsqu’il est mis à FALSE, permet de récupérer la durée et la longueur de l’itinéraire.
13.4.2 Calcul d’une matrice de temps
La fonction osrmTable()
permet de calculer des matrices de distances ou de temps par la route.
Dans cet exemple nous calculons une matrice de temps entre les 2 adresses et les restaurants de Nantes Métropole à pied.
Préparons nos données :
load("extdata/sirene.RData")
<- COGiter::communes_geo %>%
emprise_nantes filter(DEPCOM == "44109") %>%
st_transform(2154)
<- filter(sirene44, APET700 == "5610A") %>%
restaurants_nantes st_transform(2154) %>%
st_filter(emprise_nantes) %>%
st_transform(4326)
Calculons la matrice de distance entre les 2 adresses et les restaurants de Nantes :
<- osrmTable(src = mes_adresses,
mat dst = restaurants_nantes,
osrm.profile = "foot")
$durations[,1:5] mat
Quelle adresse possède une meilleurs accessibilité en temps aux restaurants ?
boxplot(t(mat$durations), cex.axis = .7)