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.

La fonction 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.

La fonction 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”.

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

La fonction 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…