B-Preparer.Rmd
Le package metric.osrm
propose des fonctions permettant
de préparer ses données avant de les envoyer sous forme de requêtes au
serveur de calcul OSRM.
Les fonctions adresseToCoord
,
codeComToCoord
, codeLauToCoord
,
convertTo
vous permettent de convertir vos données brutes
en coordonnées lon/lat WGS84 (EPSG 4326).
En entrée, vous pouvez disposer de coordonnées dans des projections différentes (RGF93/Lambert93 - EPSG 2154 par exemple pour la France métropolitaine), sous des formes différentes (data.frame, objets spatiaux sf) ou de sources à géolocaliser (adresses ou codes communes).
En sortie, ces fonctions retournent des coordonnées longitude et latitude du système géodésique mondial WGS84 et ayant pour code EPSG (European Petroleum Survey Group) le 4326.
adresseToCoord
Vous disposez d’une liste d’adresses. La fonction
adresseToCoord
permet de géolocaliser des adresses (en
France uniquement) en coordonnées lon/lat WGS84.
Pour ce faire, la fonction utilise l’API “Adresse” d’Etalab (documentation : https://geo.api.gouv.fr/adresse).
Ci-dessous, quelques exemples d’utilisation de la fonction
adresseToCoord
:
adresses <- c("1 Rue des Abeilles 13001 Marseille",
"1 Allée des Abeilles 13016 Marseille",
"1 Impasse Abeille 13003 Marseille",
"1 Impasse de la Chapelle 13013 Marseille",
"1 Boulevard de la Chapelle 13009 Marseille",
"1 Boulevard de la Chapelle 13014 Marseille")
df_coord_wgs84<-adresseToCoord(adresses = adresses,
nbEchos = 1)
#vérifier que les adresses obtenues ADRESSES_GEOLOC correspondent aux adresses attendues
rmarkdown::paged_table(df_coord_wgs84)
En sortie, un data.frame est retourné. Il contient les colonnes ADRESSES, ADRESSES_GEOLOC, LON, LAT et un SCORE entre 0 et 1, indiquant la pertinence de la géolocalisation.
La colonne ADRESSES_GEOLOC correspond aux adresses qui ont été
géolocalisées. Une attention toute particulière devra être portée sur
cette colonne car les adresses obtenues ne correspondront peut-être pas
aux adresses attendues. L’argument nbEchos
peut être
utilisé pour que la fonction retourne plusieurs résultats possibles par
adresse fournie. A vous, ensuite, de ne retenir que l’adresse la plus
pertinente selon vous. Les échos sont triés par score. Après avoir
vérifié la pertinence de la géolocatisation, il faut réduire le
data.frame à seule variable identifiante suivi des colonnes LON et
LAT.
df_coord_wgs84<-df_coord_wgs84[,c("ADRESSES_GEOLOC","LON","LAT")]
Vous pouvez aussi spécifier les codes postaux ou les codes Insee pour filtrer les résultats selon vos secteurs de recherche.
Les arguments adresses
, codePostal
et
codeInsee
doivent être obligatoirement des chaînes de
caractères.
Il est à noter également que les noms de lieu ne sont pas pris en compte. Par exemple, “Insee, Dijon” sera géolocalisé à “Rue Dijon 80000 Amiens”.
adresses <- c("Abeilles Marseille",
"Chapelle Marseille")
adresseToCoord(adresses = adresses,
nbEchos = 3)
#> ADRESSES ADRESSES_GEOLOC LON LAT
#> 1 Abeilles Marseille Rue des abeilles 13001 Marseille 5.38589 43.30134
#> 2 Abeilles Marseille Allée des abeilles 13016 Marseille 5.33855 43.36358
#> 3 Abeilles Marseille Impasse abeille 13003 Marseille 5.37802 43.31516
#> 4 Chapelle Marseille Boulevard de la chapelle 13009 Marseille 5.41172 43.27183
#> 5 Chapelle Marseille Rue de la chapelle 13003 Marseille 5.37037 43.31639
#> 6 Chapelle Marseille Traverse de la chapelle 13011 Marseille 5.51193 43.30201
#> SCORE
#> 1 0.69535
#> 2 0.69001
#> 3 0.52373
#> 4 0.69835
#> 5 0.69241
#> 6 0.69003
adresseToCoord(adresses = adresses,
nbEchos = 3,
codePostal = c("13001","13009"))
#> ADRESSES ADRESSES_GEOLOC LON LAT
#> 1 Abeilles Marseille Rue des abeilles 13001 Marseille 5.38589 43.30134
#> 2 Chapelle Marseille Boulevard de la chapelle 13009 Marseille 5.41172 43.27183
#> SCORE
#> 1 0.69535
#> 2 0.69835
adresseToCoord(adresses = adresses,
nbEchos = 3,
codeInsee = c("13201","13209"))
#> ADRESSES ADRESSES_GEOLOC LON LAT
#> 1 Abeilles Marseille Rue des abeilles 13001 Marseille 5.38589 43.30134
#> 2 Chapelle Marseille Boulevard de la chapelle 13009 Marseille 5.41172 43.27183
#> SCORE
#> 1 0.69535
#> 2 0.69835
Si vous importez votre propre fichier d’adresses, prenez soin de le
faire en précisant l’encodage utilisé lors de sa création. Par exemple,
spécifiez l’argument encoding = "UTF-8"
(ou
"Latin-1"
) avec rio::import
ou
utils::read.csv
. De façon générale, nous conseillons de
créer et d’importer le fichier en UTF-8.
codeComToCoord
Vous disposez d’une liste de codes communes INSEE
(et non de codes postaux), la fonction codeComToCoord
permet de renvoyer les coordonnées lon/lat WGS84 pour chacune d’elle, de
leur chef-lieu (chx), de leur centroïde ou d’un point obligatoirement
situé sur la surface de la commune.
Le chef-lieu est le point de la commune autour duquel est concentré
le maximum de population, le plus souvent autour de la mairie. C’est le
résultat par défaut retourné par la fonction
(type = "chx"
).
Le centroïde est le point correspondant au barycentre du polygone
formant la commune. Pour obtenir les centroïdes des communes, utilisez
l’argument type = "centroide"
.
Selon la morphologie du contour de la commune, le centroïde peut être
situé en dehors des limites communales. Pour éviter cela, il est
possible d’utiliser l’argument type = "pos"
pour
point_on_surface (point sur la surface). Il s’agit d’un algorithme qui
positionne obligatoirement le point à l’intérieur de la commune. Les
chefs-lieux, bien que également tous situés à l’intérieur de leur
commune, peuvent en revanche être trop proches des limites
communales.
Exemples avec les communes d’Aix-en-Provence (à gauche) et de Bagnères-de-Bigorre (à droite) :
L’argument geo
sert à préciser le millésime du Code
Officiel Géographique (COG) de vos codes communes INSEE. Le package
permet de renvoyer les coordonnées des chefs-lieux ou centroïdes de
plusieurs années du COG, depuis 2017 jusqu’à 2024.
Soyez certain du millésime de la géographie de vos données. La fonction ne renverra que les coordonnées des communes qu’elle reconnaît pour une année donnée. Toutefois, un message dans la console viendra avertir l’utilisateur du nombre de rejet et précisera lesquels.
Pour information, il est possible de récupérer sous forme de table
l’ensemble des codes communes Insee d’un millésime donné avec leurs
coordonnées (centroïde, pos et chx). Pour ce faire il suffit de taper la
commande metric.osrm:::tablePassage20xx
où xx est le
millésime désiré parmi ceux disponibles (note il y a trois : dans la
commande).
codeComToCoord(codeInsee = c("13001","13002","13003","13004","13005"),
geo = "2024",
type = "chx")
#> code lon lat
#> 1 13001 5.44738 43.52985
#> 2 13002 5.48173 43.33623
#> 3 13003 5.16030 43.70317
#> 4 13004 4.62738 43.67681
#> 5 13005 5.56949 43.29237
codeComToCoord(codeInsee = c("13001","13002","13003","13004","13005"),
geo = "2024",
type = "centroide")
#> code lon lat
#> 1 13001 5.39855 43.53605
#> 2 13002 5.51134 43.35331
#> 3 13003 5.15105 43.70742
#> 4 13004 4.66221 43.54668
#> 5 13005 5.56331 43.29348
codeComToCoord(codeInsee = c("13001","13002","13003","13004","13005"),
geo = "2024",
type = "pos")
#> code lon lat
#> 1 13001 5.42599 43.53232
#> 2 13002 5.51688 43.35298
#> 3 13003 5.15267 43.70999
#> 4 13004 4.72071 43.54821
#> 5 13005 5.56530 43.29046
En sortie, la fonction retourne un data.frame de trois colonnes “code”, “lon” et “lat”.
codeLauToCoord
La fonction codeLauToCoord
permet, tout comme
codeComToCoord
, d’obtenir des coordonnées lon/lat WGS84 à
partir de codes communes, étrangers cette fois-ci.
Seuls les centroïdes (type = "centroide"
) et les points
sur la surface (type = "pos"
) sont disponibles. Nous ne
disposons pas de chefs-lieux pour les communes étrangères.
Les codes communes étrangers correspondent aux codes LAU (unités administratives locales) dont la liste est disponible sur le site d’Eurostat.
La géographie des communes LAU est 2020 ou 2021 (dernier millésime Eurostat disponible avec les fonds de carte).
Les communes LAU étrangères du champ metric.osrm sont celles incluses dans le fond PBF (cf Article - Débuter avec le package {metric.osrm}), hors Andorre. La liste exhaustive des communes LAU du champ metric.osrm est disponible depuis un fichier csv en exécutant cette commande :
# Import de la liste des communes etrangeres du champ metric.osrm.
code_gisco <- rio::import(system.file("extdata",
"listeCodesGISCO.csv",
package = "metric.osrm"))
# Nombre de communes par pays dans le champ metric.osrm.
# Belgique - Suisse - Allemagne - Espagne - Italie - Luxembourg - Pays-Bas - Monaco
table(substr(code_gisco$codeGISCO,1,2))
#>
#> BE CH DE ES IT LU MO NL
#> 581 2198 4279 2375 2995 102 1 158
# Extrait des 5 premieres lignes du fichier.
rmarkdown::paged_table(code_gisco, options = list(max.print = 5))
Le code GISCO correspond à la concaténation du code pays sur 2 caractères et du code LAU de la commune pour assurer l’unicité de l’identifiant. GISCO est le système d’information géographique de la Commission au sein d’Eurostat.
La fonction codeLauToCoord
ne prend en compte que des
codes communes LAU étrangers du champ metric.osrm, hors communes de
France et d’Andorre et hors communes au-delà du PBF. Un message
d’avertissement viendra prévenir l’utilisateur si de tels codes existent
dans les données en entrée.
Pour information, il est possible de récupérer sous forme de table
l’ensemble des codes LAU avec leurs coordonnées (centroïde et pos) mais
seulement sur le millésime couramment intégré au package. Pour ce faire
il suffit de taper la commande
metric.osrm:::tablePassageLAU20xx
où xx est le dernier
millésime disponible.
# Communes etrangeres :
# Bruxelles (21004), Liège (62063), Luxembourg (0304) et Stuttgard (08111000)
commmunes_etrangeres <- data.frame(CODE_PAYS = c("BE","BE","LU","DE"),
CODE_LAU = c("21004","62063","0304","08111000"),
stringsAsFactors = FALSE)
commmunes_etrangeres
#> CODE_PAYS CODE_LAU
#> 1 BE 21004
#> 2 BE 62063
#> 3 LU 0304
#> 4 DE 08111000
# Renvoie les coordonnees des points sur la surface.
codeLauToCoord(codePays = commmunes_etrangeres$CODE_PAYS,
codeLau = commmunes_etrangeres$CODE_LAU,
type = "pos",
geo="2021")
#> code lon lat
#> 1 BE_21004 4.35174 50.85447
#> 2 BE_62063 5.59317 50.62402
#> 3 LU_0304 6.12975 49.60770
#> 4 DE_08111000 9.18974 48.77909
# Renvoie les coordonnees des centroides.
codeLauToCoord(codePays = commmunes_etrangeres$CODE_PAYS,
codeLau = commmunes_etrangeres$CODE_LAU,
type = "centroide",
geo="2021")
#> code lon lat
#> 1 BE_21004 4.37591 50.87265
#> 2 BE_62063 5.59039 50.63171
#> 3 LU_0304 6.12671 49.61408
#> 4 DE_08111000 9.17212 48.77474
# Communes francaises ou hors-champ de metric.osrm.
codeLauToCoord(codePays = c("FR","FR","DE"),
codeLau = c("57463","67482","11000000"),
type = "pos",
geo="2021")
#> [WARNING] Il y a 2 communes françaises.
#> Pour elles seulement, veuillez utiliser la fonction codeComToCoord.
#> [WARNING] Il y a 1 commune non géolocalisée ou hors du champ de metric.osrm.
#> Liste des codes communes non géolocalisées ou hors-champ :
#> DE_11000000
#> [1] code lon lat
#> <0 rows> (or 0-length row.names)
convertTo
La fonction convertTo
permet de convertir des données de
n’importe quel système de projection vers le système WGS84 (EPSG
4326).
Vous pouvez, à partir d’un data.frame de coordonnées ou d’un objet spatial sf, transformer cet objet dans un autre type et en WGS84 (EPSG 4326).
Les objets spatiaux sf peuvent être des points ou des polygones. S’il s’agit de polygones en entrée, les coordonnées de leurs sommets sont retournées si le type en sortie demandé est un data.frame.
En entrée, le data.frame peut être de 2 ou 3 colonnes. Les noms des variables n’ont pas d’importance. Si la table comporte 3 colonnes, la première colonne doit être l’identifiant et les deux autres les coordonnées.
Si l’argument to
n’est pas spécifié, l’objet en sortie
sera du même type que l’objet en entrée.
L’argument fromEpsg
doit obligatoirement être spécifié
si l’objet en entrée est un data.frame.
Par ailleurs, il est aussi possible de convertir des coordonnées vers
n’importe quel système de projection autre que le WGS84 (EPSG 4326)
grâce à l’argument toEpsg
. Cependant, le WGS84 (EPSG 4326)
est obligatoire pour requêter le serveur de calcul OSRM.
Ci-dessous quelques exemples d’utilisation de la fonction :
Cas 1 : En entrée, un data.frame de 2 colonnes X et Y (Lambert 93, EPSG 2154). En sortie, un data.frame de coordonnées (WGS84, EPSG 4326).
coord_lambert93 <- data.frame(X = c(897740.5,901367.8,874261.9,897740.5),
Y = c(6272912,6251706,6291801,6272912),
stringsAsFactors = FALSE)
coord_lambert93
#> X Y
#> 1 897740.5 6272912
#> 2 901367.8 6251706
#> 3 874261.9 6291801
#> 4 897740.5 6272912
convertTo(from = coord_lambert93,
fromEpsg = 2154)
#> lon lat
#> 1 5.44553 43.52772
#> 2 5.48212 43.33602
#> 3 5.16171 43.70377
#> 4 5.44553 43.52772
Cas 2 : En entrée, un data.frame de 3 colonnes ID, LON et LAT (WGS84) issu d’un fichier csv. En sortie, un data.frame de coordonnées (Lambert 93). Attention, dans ce cas, les colonnes appelées lon et lat ne correspondent plus à des longitudes et latitudes mais à des coordonnées métriques.
coord_wgs84 <- rio::import(file = system.file("extdata",
"convertTo_1.csv",
package = "metric.osrm"))
coord_wgs84
#> ID LON LAT
#> 1 1 5.44553 43.52772
#> 2 2 5.48212 43.33602
#> 3 3 5.16171 43.70377
#> 4 4 5.44553 43.52772
coord_lambert93<-convertTo(from = coord_wgs84,
fromEpsg = 4326,
toEpsg = 2154)
names(coord_lambert93)<-c("id","x_lambert93","y_lambert93")
coord_lambert93
#> id x_lambert93 y_lambert93
#> 1 1 897740.5 6272912
#> 2 2 901367.8 6251706
#> 3 3 874261.9 6291801
#> 4 4 897740.5 6272912
Cas 3 : En entrée, un data.frame de 3 colonnes ID, X et Y (Lambert 93) issu d’un fichier ods. En sortie, un objet sf POINT (WGS84).
# si besoin lancez au préalable install.packages("readODS") ou
# rio::install_formats()
coord_lambert93 <- rio::import(file = system.file("extdata",
"convertTo_2.ods",
package = "metric.osrm"))
coord_lambert93
#> ID X Y
#> 1 1 897740.5 6272912
#> 2 2 901367.8 6251706
#> 3 3 874261.9 6291801
#> 4 4 897740.5 6272912
sf_wgs84<-convertTo(from = coord_lambert93,
to = "sf",
fromEpsg = 2154)
sf_wgs84
#> Simple feature collection with 4 features and 1 field
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 5.16171 ymin: 43.33602 xmax: 5.48212 ymax: 43.70377
#> Geodetic CRS: WGS 84
#> id geometry
#> 1 1 POINT (5.44553 43.52772)
#> 2 2 POINT (5.48212 43.33602)
#> 3 3 POINT (5.16171 43.70377)
#> 4 4 POINT (5.44553 43.52772)
Cas 4 : En entrée, un data.frame de 3 colonnes ID, X et Y (Lambert 93, EPSG 2154) issu d’un fichier xls. En sortie, un objet sf (WGS84, EPSG 4326).
coord_lambert93 <- rio::import(file = system.file("extdata",
"convertTo_3.xls",
package = "metric.osrm"))
coord_lambert93
#> ID X Y
#> 1 1 897740.5 6272912
#> 2 2 901367.8 6251706
#> 3 3 874261.9 6291801
#> 4 4 897740.5 6272912
sf_wgs84<-convertTo(from = coord_lambert93,to = "sf",fromEpsg = 2154)
sf_wgs84
#> Simple feature collection with 4 features and 1 field
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 5.16171 ymin: 43.33602 xmax: 5.48212 ymax: 43.70377
#> Geodetic CRS: WGS 84
#> id geometry
#> 1 1 POINT (5.44553 43.52772)
#> 2 2 POINT (5.48212 43.33602)
#> 3 3 POINT (5.16171 43.70377)
#> 4 4 POINT (5.44553 43.52772)
Cas 5 : En entrée, un objet sf POLYGON (Lambert 93). En sortie, un data.frame de coordonnées (WGS84), les sommets du polygone.
polygon <- matrix(c(897740.5,6272912,901367.8,6251706,874261.9,6291801,897740.5,6272912),
ncol = 2,
byrow = TRUE)
sf_polygon <- sf::st_sf(ID = 1,
geometry = sf::st_sfc(sf::st_geometry(
sf::st_polygon(list(polygon))),
crs = 2154))
sf_polygon
#> Simple feature collection with 1 feature and 1 field
#> Geometry type: POLYGON
#> Dimension: XY
#> Bounding box: xmin: 874261.9 ymin: 6251706 xmax: 901367.8 ymax: 6291801
#> Projected CRS: RGF93 v1 / Lambert-93
#> ID geometry
#> 1 1 POLYGON ((897740.5 6272912,...
convertTo(from = sf_polygon,
to = "data.frame")
#> id lon lat
#> 1 1 5.44553 43.52772
#> 2 1 5.48212 43.33602
#> 3 1 5.16171 43.70377
#> 4 1 5.44553 43.52772
Cas 6 : En entrée, un objet sf POINT (Lambert 93). En sortie, un data.frame de coordonnées (WGS84).
sf_point_lambert93 <- sf::st_sf(ID = 1,
geometry = sf::st_sfc(sf::st_geometry(
sf::st_point(c(897740.5,6272912))),
crs = 2154))
sf_point_lambert93
#> Simple feature collection with 1 feature and 1 field
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 897740.5 ymin: 6272912 xmax: 897740.5 ymax: 6272912
#> Projected CRS: RGF93 v1 / Lambert-93
#> ID geometry
#> 1 1 POINT (897740.5 6272912)
df_wgs84<-convertTo(from = sf_point_lambert93,
to = "data.frame")
df_wgs84
#> id lon lat
#> 1 1 5.44553 43.52772
Cas 7 : En entrée, un objet sf POLYGON (Lambert 93) issu d’un shapefile. En sortie, un data.frame de coordonnées (WGS84), les centroïdes du polygone.
sf_polygon <- sf::read_sf(dsn = system.file("extdata",
"convertTo_4.shp",
package = "metric.osrm"))
sf_point <- suppressWarnings(sf::st_centroid(sf_polygon))
sf_point
#> Simple feature collection with 1 feature and 1 field
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 891123.4 ymin: 6272140 xmax: 891123.4 ymax: 6272140
#> Projected CRS: RGF93 v1 / Lambert-93
#> # A tibble: 1 × 2
#> ID geometry
#> * <dbl> <POINT [m]>
#> 1 1 (891123.4 6272140)
df_wgs84<-convertTo(from = sf_point,
to = "data.frame")
df_wgs84
#> id lon lat
#> 1 1 5.36346 43.52259
Cas 8 : En entrée, un objet sf POLYGON (Lambert 93) issu d’un shapefile. En sortie, un objet sf (WGS84).
sf_polygon_l93 <- sf::read_sf(dsn = system.file("extdata",
"convertTo_4.shp",
package = "metric.osrm"))
sf_polygon_wgs84<-sf::st_transform(sf_polygon_l93,crs =4326)
sf_polygon_wgs84
#> Simple feature collection with 1 feature and 1 field
#> Geometry type: POLYGON
#> Dimension: XY
#> Bounding box: xmin: 5.16171 ymin: 43.33602 xmax: 5.48212 ymax: 43.70377
#> Geodetic CRS: WGS 84
#> # A tibble: 1 × 2
#> ID geometry
#> * <dbl> <POLYGON [°]>
#> 1 1 ((5.44553 43.52772, 5.48212 43.33602, 5.16171 43.70377, 5.44553 43.5277…