Cartographie et Dataviz

Dans l’univers de la visualisation de données (DataViz pour les intimes), la cartographie prend une grande place. De nombreux concours cartographiques sont organisés (voir par exemple, les résultats de celui organisé dans le cadre de la Journée SIG organisée par l’Université Laval en novembre 2020).

Il n’est cependant pas toujours aisé d’obtenir des fonds de carte ni même de les exploiter aisément. Quant aux données à projeter sur un tel fond de carte, là non plus il n’est parfois pas facile de les obtenir, même s’il s’agit de données ouvertes.

Dans ce court didacticiel, je propose, grâce aux packages ggmap, ggplot2, osmdata et sf, disponibles dans l’écosystème R, de construire une cartographie illustrative des pistes et autres voies cyclables et des chemins pédestres de Chicoutimi tels que répertoriés par le projet libre et collaboratif OpenStreetMap.

En premier lieu, les packages au sein desquels se trouvent les fonctions utilisées sont déclarés.

library(ggplot2)
library(ggmap)
library(osmdata)
library(sf)

La zone de délimitation (bounding box) qui constitue la portion terrestre à représenter sur la carte est manuellement définie sous la forme d’un vecteur nommé. Les coordonnées choisies ici (latitudes et longitudes minimales et maximales ) ne couvrent que la zone de l’arrondissement de Chicoutimi.

bbox.slsj <- c(-71.130267, 48.386369, -71.011821, 48.463147)
names(bbox.slsj) <- c("left", "bottom", "right", "top")

Dans le long bloc de code suivant, les fonctions opq(), add_osm_feature() et osm_data_sf() sont enchainées à l’aide de l’opérateur %>% pour extraire du projet OpenStreetMap les données suivantes et les stocker dans différents objets :

  • le réseau routier principal (trunk, motorway, primary) et leurs accès (link)
  • le réseau routier secondaire et local (road, secondary, tertiary, residential, living_street)
  • différents types de chemins pédestres

Concernant le réseau cyclable, dans un premier temps, sont extraites les pistes cyclables (value="cycleway"). Par la suite, sont extraites toutes les voies pouvant accueillir des cyclistes (key = "bicycle").

La fonction st_crop() est utilisée pour vérifier que seules les voies de communication situées dans la zone de délimitation préalablement définie sont conservées dans chacun de ces objets.

rues.principales.slsj <- opq(bbox = bbox.slsj) %>%
add_osm_feature(key = "highway", value = c("trunk", "motorway", "primary", "trunk_link", "motorway_link", "primary_link")) %>%
osmdata_sf()

rues.principales.slsj <- st_crop(rues.principales.slsj$osm_lines, c(ymin = bbox.slsj[[2]], ymax = bbox.slsj[[4]], xmin = bbox.slsj[[1]], xmax = bbox.slsj[[3]]))

rues.secondaires.slsj <- opq(bbox = bbox.slsj) %>%
add_osm_feature(key = "highway", value = c("road", "secondary", "tertiary", "residential", "living_street")) %>%
osmdata_sf()

rues.secondaires.slsj <- st_crop(rues.secondaires.slsj$osm_lines, c(ymin = bbox.slsj[[2]], ymax = bbox.slsj[[4]], xmin = bbox.slsj[[1]], xmax = bbox.slsj[[3]]))

velo.slsj <- opq(bbox = bbox.slsj) %>%
add_osm_feature(key = "highway", value = c("cycleway")) %>%
osmdata_sf()

velo.slsj <- st_crop(velo.slsj$osm_lines, c(ymin = bbox.slsj[[2]], ymax = bbox.slsj[[4]], xmin = bbox.slsj[[1]], xmax = bbox.slsj[[3]]))

velo2.slsj <- opq(bbox = bbox.slsj) %>%
add_osm_feature(key = "bicycle") %>%
osmdata_sf()

velo2.slsj <- st_crop(velo2.slsj$osm_lines, c(ymin = bbox.slsj[[2]], ymax = bbox.slsj[[4]], xmin = bbox.slsj[[1]], xmax = bbox.slsj[[3]]))

rando.slsj <- opq(bbox = bbox.slsj) %>%
add_osm_feature(key = "highway", value = c("pedestrian", "footway", "track", "path")) %>%
osmdata_sf()
 
rando.slsj <- st_crop(rando.slsj$osm_lines, c(ymin = bbox.slsj[[2]], ymax = bbox.slsj[[4]], xmin = bbox.slsj[[1]], xmax = bbox.slsj[[3]]))

Il est intéressant de noter que grâce au projet OpenStreetMap, il est possible d’établir une distinction entre les pistes cyclables et les autres voies cyclables.

En contexte québécois, le MTQ (2008) définit une piste cyclable comme se distinguant « des autres types de voies cyclables par le fait qu’elle est toujours séparée physiquement de la circulation automobile, qu’elle soit aménagée en site propre ou à l’intérieur d’une emprise routière. » ; les autres voies cyclables pouvant être une bande cyclable, une chaussée désignée ou un accotement revêtu.

Le bloc de code suivant permet de télécharger et stocker dans l’objet map.slsj un fond de carte Stamen en noir et blanc (bw) de la zone géographique choisie. Le fond de carte terrain-background ne contient que la topographie du lieu.

map.slsj <- get_stamenmap(c(bbox.slsj), zoom=13, maptype="terrain-background", color = "bw")

Enfin, la carte est construite au moyen des packages ggmap et ggplot2. Il est à noter que le réseau routier principal, le réseau secondaire, les pistes cyclables, les voies cyclables et les chemins pédestres de différents types constituent des calques différents sur cette carte. Chacun d’entre eux est caractérisé par des variations de couleurs, de tailles, de degrés de transparence. Nous jouons ici sur la superposition du calque de toutes les voies cyclables (en vert plus foncé) et celui des pistes cyclables (en vert plus clair) pour distinguer les pistes cyclables des autres voies cyclables.

ggmap(map.slsj) +
  labs(x="Longitude",
       y="Latitude",
       title="Pistes cyclables, autres voies cyclables\net chemins pédestres à Chicoutimi",
       caption ="Map tiles by Stamen Design, under CC BY 3.0\nData by OpenStreetMap, under ODbL\n© les contributeurs d’OpenStreetMap") +
  geom_sf(data = rues.principales.slsj,
          col = "ivory2",
          size = 0.2,
          alpha = 0.75,
          inherit.aes = FALSE) +
  geom_sf(data = rues.secondaires.slsj,
          col = "ivory2",
          size = 0.2,
          alpha = 0.3,
          inherit.aes = FALSE) +
  geom_sf(data = rando.slsj,
          col = "goldenrod2",
          size = 0.2,
          alpha = 1,
          inherit.aes = FALSE) +
  geom_sf(data = velo2.slsj,
          col = "seagreen3",
          size = 0.5,
          alpha = 1,
          inherit.aes = FALSE) +
  geom_sf(data = velo.slsj,
          col = "greenyellow",
          size = 0.5,
          alpha = 1,
          inherit.aes = FALSE) +
  coord_sf(expand = FALSE)

On obtient alors la carte suivante.

Après quelques améliorations graphiques non détaillées ici, la carte illustrative finale présente l’aspect suivant.

Il est intéressant de noter que les voies cyclables semblent suivre l’écoulement de la rivière Saguenay, à l’exception de sections proches du cégep et de l’université. Quant au réseau pédestre, la zone portuaire, le Parc de la Rivière-du-Moulin et le centre de vélo de montagne le Panoramique sont évidents. Mais les sentiers du centre de vélo de montagne ne sont pas des chemins pédestres même s’ils sont accessibles en raquettes l’hiver. Le choix de types de chemins pédestres à afficher aurait donc pu être affiné…