Open Data France et datactivi.st
Jour 6
Joël Gombin et Samuel Goëta (datactivi.st)
Retrouvez les matériaux sur : www.github.com/datactivist/IntroR_ODF
Pad collaboratif : https://frama.link/formationR_pad4
Exercice : importer un jeu de données, le nettoyer/préparer, représenter graphiquement la relation entre trois variables, la tester dans le cadre d’un modèle
sp
maptools
, rgdal
et rgeos
cartography
et tmap
leaflet
, mapview
,“Une carte est une représentation géométrique plane simplifiée et conventionnelle de tout ou partie de la surface terrestre, et cela dans un rapport de similitude convenable qu’on appelle échelle.” (F. Joly, 1976)
Référence : Béguin et Pumain, 2014 (3e éd.)
La projection est l’outil mathématique qui permet de passer du géoïde représentant la Terre à une représentation plane.
Projections conformes (Mercator, Lambert) ou équivalentes (Eckert IV, Gall). Il y a toujours une déformation !
Les coordonnées géographiques sont exprimées en longitude et latitude. Les unités peuvent être des degrés ou des grades. La projection transforme les coordonnées géographiques en coordonnées x/y.
Exemple de coordonnées géographiques :
Un truc cool pour jouer avec les différentes projections :
The West Wing, la série qui arrive à faire un sketch drôle sur les projections géographiques :
L’échelle d’une carte représente le rapport d’une distance mesurée sur la carte à sa valeur réelle sur le terrain.
Échelle | 1 cm représente |
---|---|
1/10000 | 100 m |
1/25000 | 250m |
1/50000 | 500m |
1/100000 | 1km |
1/1000000 | 10km |
Attention : “petite échelle” = grande superficie représentée “grande échelle” = petite superficie représentée
L’échelle est déformée à distance du centre de projection (équateur pour Mercator)
Échelle numérique et échelle graphique
“L’opération qui par sélection, schématisation et harmonisation reconstitue sur une carte la réalité de la surface représentée dans ses traits essentiels en fonction du but de la carte, de son thème, de son échelle et des particularités de la région cartographiée.”
Quelles couches d’information représenter ? Ni trop (surcharge d’information, à la Google Maps) ni trop peu (rendre la carte intelligible au lecteur).
Le style “toner” peut être utile pour trouver cet équilibre, en cartographie thématique :
Opération de simplification, qui peut être structurale (tracés) ou conceptuelle (schéma).
Attention : on peut simplifier à partir de données détaillées, mais on ne peut pas faire l’inverse ! Donc toujours veiller à conserver les données dans leur forme la plus détaillée.
Le fond de carte est constitué des éléments repris d’une carte topographique (par exemple de l’IGN) et utilisés pour une carte thématique.
“Carte reproduite totalement ou partiellement, en une ou plusieurs couleurs souvent atténuées, servant de repère pour le report en surcharge de phénomènes localisables déterminés” (CFC). Peut concerner les découpages administratifs, le réseau routier, hydrographique, les courbes de niveau, etc.
Traditionnellement, en France : l’IGN.
De plus en plus : Google Maps, Open Street Map, Stamen…
Comment stocker et représenter l’information géographique ?
Une carte choroplèthe est une carte thématique où les régions sont colorées ou remplies d’un motif qui montre une mesure statistique, tels la densité de population ou le revenu par habitant. Ce type de carte facilite la comparaison d’une mesure statistique d’une région à l’autre ou montre la variabilité de celle-ci pour une région donnée.
“La cartographie en anamorphose a pour but d’adapter la forme de la carte non pas à la réalité physique mais plutôt à la réalité perçue.” (Langlois et Denain, 1996)
On déforme le fond de carte en fonction d’une variable quantitative (voire arbitrairement).
Bertin, 1965 : travail sur la sémiologie graphique. La carte, comme le graphique, permettent de percevoir en même temps trois informations (X,Y,Z).
Mais pour que cette communication soit efficace, il faut respecter un langage précis et ses règles.
Assez comparable à la grammaire des graphiques.
Un exemple d’utilisation incorrecte (non-proportionnelle) de la taille :
Un exemple de coloration continue :
Des cartes old school de densité, qui utilisent une trame :
Une autre coloration continue (pas très lisible parce qu’elle utilise trop de teintes [hues]) :
Un exemple d’utilisation par Todd et Le Bras :
Voir cet article
Un moyen sympa de jouer avec les différentes méthodes de discrétisation.
De très nombreux outils existent. QGIS est en train de s’imposer comme le SIG de référence dans le monde du libre. Malheureusement, en cartographie pure, aucune solution de référence ne permet de traiter aisément tous les cas de figure (vectoriel/raster ; print/web, etc.). En ce qui concerne la carto web, pas vraiment de solution de référence pour l’heure.
R n’est pas fait (du tout) au départ pour faire de la carto, mais offre aujourd’hui un workflow complet allant du nettoyage des données à leur représentation cartographique en passant par le nettoyage, l’analyse et la transformation des données.
Il existe des outils libres pour passer d’un format à l’autre, en particulier OGR/GDAL. R possède des surcouches de ces librairies.
Plusieurs classes dans R pour représenter les objets spatiaux. La plus importante (et le seul qu’on utilisera) provient de la librairie sp
et est SpatialPolygonsDataFrame
(il existe aussi SpatialPoints*
et SpatialLines*
).
On peut créer un objet SpatialPolygonsDataFrame
à la main, mais en réalité on ne le fait jamais, on importe un shapefile (ou autre) dans R. Plusieurs fonctions pour cela ; la meilleure est readOGR
, dans le package rgdal
.
#install.packages("sp")
#install.packages("rgdal")
library(sp)
library(rgdal)
departements <- readOGR("./data/departements", "DEPARTEMENT", stringsAsFactors = FALSE)
## OGR data source with driver: ESRI Shapefile
## Source: "./data/departements", layer: "DEPARTEMENT"
## with 96 features
## It has 11 fields
## Integer64 fields read as strings: ID_GEOFLA
summary(departements)
## Object of class SpatialPolygonsDataFrame
## Coordinates:
## min max
## x 99226 1242375
## y 6049647 7110480
## Is projected: TRUE
## proj4string :
## [+proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000
## +y_0=6600000 +ellps=GRS80 +units=m +no_defs]
## Data attributes:
## ID_GEOFLA CODE_DEPT NOM_DEPT
## Length:96 Length:96 Length:96
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## CODE_CHF NOM_CHF X_CHF_LIEU Y_CHF_LIEU
## Length:96 Length:96 Min. : 1713 Min. :61089
## Class :character Class :character 1st Qu.: 5531 1st Qu.:64012
## Mode :character Mode :character Median : 6584 Median :66318
## Mean : 6840 Mean :66099
## 3rd Qu.: 8461 3rd Qu.:68204
## Max. :12285 Max. :70594
## X_CENTROID Y_CENTROID CODE_REG NOM_REGION
## Min. : 1770 Min. :61036 Length:96 Length:96
## 1st Qu.: 5451 1st Qu.:64011 Class :character Class :character
## Median : 6608 Median :66303 Mode :character Mode :character
## Mean : 6844 Mean :66118
## 3rd Qu.: 8416 3rd Qu.:68266
## Max. :12112 Max. :70442
Les objets SpatialPolygonsDataFrame
sont complexes, mais comprennent pour simplifier d’une part les polygones (auxquels on accède directement : departements[1,]
) et d’autre part le dataframe
, qui est un slot
de l’objet :
summary(departements@data)
## ID_GEOFLA CODE_DEPT NOM_DEPT
## Length:96 Length:96 Length:96
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## CODE_CHF NOM_CHF X_CHF_LIEU Y_CHF_LIEU
## Length:96 Length:96 Min. : 1713 Min. :61089
## Class :character Class :character 1st Qu.: 5531 1st Qu.:64012
## Mode :character Mode :character Median : 6584 Median :66318
## Mean : 6840 Mean :66099
## 3rd Qu.: 8461 3rd Qu.:68204
## Max. :12285 Max. :70594
## X_CENTROID Y_CENTROID CODE_REG NOM_REGION
## Min. : 1770 Min. :61036 Length:96 Length:96
## 1st Qu.: 5451 1st Qu.:64011 Class :character Class :character
## Median : 6608 Median :66303 Mode :character Mode :character
## Mean : 6844 Mean :66118
## 3rd Qu.: 8416 3rd Qu.:68266
## Max. :12112 Max. :70442
library(tidyverse)
departements@data %>%
filter(NOM_REGION %in% "ILE-DE-FRANCE")
## ID_GEOFLA CODE_DEPT NOM_DEPT CODE_CHF NOM_CHF
## 1 76 75 PARIS 101 PARIS-1ER-ARRONDISSEMENT
## 2 78 77 SEINE-ET-MARNE 288 MELUN
## 3 79 78 YVELINES 646 VERSAILLES
## 4 92 91 ESSONNE 228 EVRY
## 5 93 92 HAUTS-DE-SEINE 050 NANTERRE
## 6 94 93 SEINE-SAINT-DENIS 008 BOBIGNY
## 7 95 94 VAL-DE-MARNE 028 CRETEIL
## 8 96 95 VAL-D'OISE 500 PONTOISE
## X_CHF_LIEU Y_CHF_LIEU X_CENTROID Y_CENTROID CODE_REG NOM_REGION
## 1 6516 68624 6517 68620 11 ILE-DE-FRANCE
## 2 6748 68266 6950 68362 11 ILE-DE-FRANCE
## 3 6364 68564 6149 68578 11 ILE-DE-FRANCE
## 4 6579 68361 6441 68249 11 ILE-DE-FRANCE
## 5 6416 68659 6458 68556 11 ILE-DE-FRANCE
## 6 6588 68679 6617 68687 11 ILE-DE-FRANCE
## 7 6598 68532 6609 68531 11 ILE-DE-FRANCE
## 8 6342 68838 6365 68873 11 ILE-DE-FRANCE
On peut ainsi sélectionner une partie seulement d’un SpatialPolygonsDataFrame
, en fonction de données de la table attributaire.
Nouveau package pour utiliser la syntaxe du tidyverse
avec sp
: https://cran.r-project.org/web/packages/spdplyr/vignettes/spdplyr.html
library(spdplyr)
iledefrance <- departements %>%
filter(NOM_REGION %in% "ILE-DE-FRANCE")
On peut aisément visualiser les objets spatiaux au moyen de la fonction plot
:
plot(departements)
## ou :
## departements %>% plot()
Mais aussi grâce au package mapview
:
library(mapview)
mapview(departements)
mapview(departements, zcol = "CODE_REG")