{"id":1267,"date":"2020-11-09T14:06:04","date_gmt":"2020-11-09T13:06:04","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=1267"},"modified":"2021-01-04T09:24:18","modified_gmt":"2021-01-04T08:24:18","slug":"geocodage-sous-r-via-une-api","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/geocodage-sous-r-via-une-api\/","title":{"rendered":"G\u00e9ocodage sous R via une API"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/geocodage\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<h1>G\u00e9ocodage via une API: was ist das?<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/geocodage\/API.png\" alt=\"\" \/><\/p>\n<h2>G\u00e9ocodage<\/h2>\n<p>Le <strong>g\u00e9ocodage d\u2019abord<\/strong>: Il s\u2019agit d\u2019une op\u00e9ration qui consiste \u00e0 associer des <strong>coordonn\u00e9es g\u00e9ographiques<\/strong> \u00e0 un <strong>nom de lieu<\/strong> ou <strong>une adresse<\/strong>. C\u2019est donc une op\u00e9ration incontournable si vous disposez par exemple d\u2019un jeu de donn\u00e9es comprenant des lieux sous forme de cha\u00eenes de caract\u00e8re, et que vous voudriez l\u2019utiliser pour produire une <strong>carte<\/strong>.<\/p>\n<h2>API<\/h2>\n<p>Qu\u2019est-ce qu\u2019une <strong>API<\/strong>, maintenant:<\/p>\n<p><strong>API<\/strong> cela veut dire <strong>Application Programming Interface<\/strong>. C\u2019est un service qui permet aux d\u00e9veloppeurs de r\u00e9cup\u00e9rer des donn\u00e9es via internet pour les utiliser dans leurs applications. Imaginez par exemple que, aiguillonn\u00e9 par la faim, vous vous rendiez sur un site de commande de repas en ligne pour commander un burgher. Pour que seuls s\u2019affichent les restaurants qui peuvent vous livrer et faire en sorte de vous fournir un temps d\u2019attente probable, les d\u00e9veloppeurs de ce site ont fait en sorte de r\u00e9cup\u00e9rer votre position \u00e0 partir de l\u2019adresse postale que vous leur avez fournie. Cette op\u00e9ration se fait automatiquement, \u00e0 travers une API de g\u00e9ocodage (celle de Google par exemple). Dans ce cas, on comprend bien pourquoi cela s\u2019appelle une API: l\u2019<strong>interface<\/strong> du service vous permet de r\u00e9cup\u00e9rer des donn\u00e9es, qui seront utilis\u00e9es dans une <strong>autre application<\/strong> (ici le site de vente de burghers en livraison).<\/p>\n<h2>J\u2019en ai vraiment besoin?<\/h2>\n<p>\u201cMais moi je suis pas d\u00e9veloppeur\u201d me direz-vous peut-\u00eatre. Effectivement, vous n\u2019avez peut-\u00eatre pas l\u2019intention de construire un site web ou une application qui sollicitera r\u00e9guli\u00e8rement telle ou telle API. Mais sans d\u00e9velopper une application \u00e0 proprement parler vous pouvez tout-de-m\u00eame avoir besoin de g\u00e9ocoder un certain nombre d\u2019adresses de mani\u00e8re automatique\u2026 Dans ce cas vous aurez une utilisation d\u2019API <strong>ponctuelle et limit\u00e9e \u00e0 un nombre fixe de requ\u00eates<\/strong> (le nombre d\u2019\u00e9l\u00e9ments que vous voulez g\u00e9ocoder pour compl\u00e9ter votre jeu de donn\u00e9es)\u2026 \u00e7a tombe bien, souvent l\u2019utilisation gratuite des API est limit\u00e9e \u00e0 un certain nombre de requ\u00eates par jour ou seconde (ben oui parce que c\u2019est un service, et un service c\u2019est rarement gratuit, sauf peut-\u00eatre si c\u2019est un petit service).<\/p>\n<p>Personnellement, les quelques fois o\u00f9 j\u2019ai souhait\u00e9 faire du g\u00e9ocodage, c\u2019\u00e9tait dans le but d\u2019exploiter les renseignements de <strong>localisation d\u2019utilisateurs Twitter<\/strong>: \u00e7a signifiait g\u00e9ocoder des noms de lieux renseign\u00e9s \u00e0 des niveaux de pr\u00e9cision et d\u2019exactitude divers (par exemple \u201cQuartier Beauregard, Trifouillis-les-Oies\u201d, ou juste \u201cFrance\u201d, ou \u201cAllemagne et USA\u201d, ou encore \u201cJe suis partout o\u00f9 le vent me porte\u201d\u2026 cette rubrique des profils Twitter pouvant \u00eatre renseign\u00e9e -ou au contraire laiss\u00e9e vide- totalement librement). Je souhaitais r\u00e9cup\u00e9rer non seulement la <strong>localisation (latitude-longitude)<\/strong> mais aussi des <strong>informations d\u2019appartenance<\/strong> (\u00e0 une ville, ou un pays) \u00e0 l\u2019\u00e9chelle la plus fine possible selon le degr\u00e9 de pr\u00e9cision avec lequel l\u2019utilisateur avait sp\u00e9cifi\u00e9 sa localisation.<\/p>\n<p>Il existe diverses <strong>API<\/strong> qui permettent de r\u00e9aliser le g\u00e9ocodage de noms de lieux et de r\u00e9cup\u00e9rer non seulement la localisation mais \u00e9galement divers renseignements. Dans ce billet, je parlerai de l\u2019API de g\u00e9ocodage de <strong>Google<\/strong>, de l\u2019API <strong>Opencage<\/strong>, et de l\u2019API <strong>Nominatim<\/strong> d\u2019OSM.<\/p>\n<h2>Exemple<\/h2>\n<p>Dans la suite de ce billet je testerai ces trois API pour collecter des informations sur les lieux suivants:<\/p>\n<pre><code>mydf &lt;-tibble::tibble(loc=c(\"Lyon, France\",\n                            \"22 place du G\u00e9n\u00e9ral de Gaulle, Paris\",\n                            \"la Guilloti\u00e8re, Lyon\",\n                            \"Europe\",\n                            NA,\n                            \"Tucson, AZ\",\n                            \"Rio Grande do Sul\"))\n<\/code><\/pre>\n<p>Pour l\u2019exemple j\u2019ai choisi des lieux d\u00e9sign\u00e9s de fa\u00e7on plus ou moins vague, \u00e0 des \u00e9chelles vari\u00e9es et un peu partout dans le monde.<\/p>\n<h1>Pour utiliser une API: montrez patte blanche!<\/h1>\n<p>Pour acc\u00e9der \u00e0 une API, il est la plupart du temps de s\u2019<strong>enregistrer<\/strong> aupr\u00e8s de son fournisseur afin de disposer d\u2019une <strong>cl\u00e9 d\u2019acc\u00e8s (API key)<\/strong>: une esp\u00e8ce de long mot de passe qui permet \u00e0 l\u2019API de vous identifier vous et d\u2019identifier l\u2019application pour laquelle la requ\u00eate est pass\u00e9e.<\/p>\n<h2>Nominatim (OSM)<\/h2>\n<p>Pour acc\u00e9der \u00e0 cette API: bonne nouvelle! Nul besoin d\u2019une cl\u00e9 :-). L\u2019utilisation est en principe accord\u00e9e pour un usage \u201ccr\u00e9atif et inattendu\u201d\u2026 Attention n\u00e9anmoins \u00e0 utiliser le service de mani\u00e8re \u201crespectueuse\u201d (ie ne pas envoyer 2000 requ\u00eates en 5 minutes par exemple, pour ne pas surcharger les serveurs par des demandes inconsid\u00e9r\u00e9es). Plus de d\u00e9tails &#91;ici&#93; (<a href=\"https:\/\/operations.osmfoundation.org\/policies\/nominatim\/\" class=\"uri\">https:\/\/operations.osmfoundation.org\/policies\/nominatim\/<\/a>)<\/p>\n<h2>Google<\/h2>\n<p>Pour acc\u00e9der \u00e0 l\u2019API de g\u00e9ocodage de google, il faut disposer d\u2019un <strong>compte Google<\/strong> et aller r\u00e9cup\u00e9rer une cl\u00e9 pour les \u201cmaps-APIs\u201d Google <a href=\"https:\/\/console.cloud.google.com\/google\/maps-apis\/\">ici<\/a>. Il va falloir aussi renseigner une <strong>carte de cr\u00e9dit<\/strong>, m\u00eame si vous ne pensez pas d\u00e9passer les quotas d\u2019acc\u00e8s gratuit (\u00e7a ne fait pas trop plaisir mais sans ces \u201cbilling informations\u201d la cl\u00e9 ne fonctionnera pas\u2026).<\/p>\n<p>La cl\u00e9 devrait ressembler \u00e0 un truc sympa du genre: \u201cBEiz89gzKNzlcpaK90ver80A_230Lli0N173kinvB\u201d (c\u2019est \u00e9videmment une fausse cl\u00e9 que j\u2019indique ici \ud83d\ude09 ).<\/p>\n<p>Notez que si vous disposer d\u2019une cl\u00e9 pour l\u2019API Google, cela vous permettra aussi de disposer des fonds de carte lorsque vous utilisez ggmap pour faire vos cartes (voir billet de blog <a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/par-ici-les-jolies-cartes-avec-ggmap\/\">ici<\/a> -billet que j\u2019avais r\u00e9dig\u00e9 \u00e0 une \u00e9poque o\u00f9 une cl\u00e9 n\u2019\u00e9tait pas encore n\u00e9cessaire pour cela-)<\/p>\n<h2>Opencage<\/h2>\n<p>Pour acc\u00e9der \u00e0 l\u2019API Opencage, vous pouvez vous enregistrer <a href=\"https:\/\/opencagedata.com\/pricing\">ici<\/a>. Pour une utilisation ponctuelle et limit\u00e9e (2500 requ\u00eates par jour max) vous n\u2019aurez pas besoin de renseigner votre carte de cr\u00e9dit (ouf!).<\/p>\n<p>Votre cl\u00e9 sera un truc du genre \u201c6fjzlc8z2s6f113qx215zlk22ig1vq\u201d (encore une fois, c\u2019est une cl\u00e9 que j\u2019ai invent\u00e9e pour vous montrer l\u2019allure de la chose \ud83d\ude09 ).<\/p>\n<h2>O\u00f9 enregistrer vos cl\u00e9s d\u2019acc\u00e8s aux API?<\/h2>\n<p>Si vous travaillez avec R, il y a de fortes chances que vous soyez amen\u00e9 \u00e0 <strong>partager vos scripts<\/strong> avec des collaborateurs ou m\u00eame avec le monde (via github par exemple). C\u2019est donc une <strong>mauvaise id\u00e9e d\u2019enregistrer vos cl\u00e9s dans vos scripts<\/strong> ou dans tout autre document que vous pourriez partager par inadvertance. Il vaut mieux aller les cacher dans un document aux tr\u00e9fonds de votre machine, qui vous permette d\u2019acc\u00e9der \u00e0 leurs valeurs sans risquer de les partager.<\/p>\n<p>Une solution pour cela consiste \u00e0 les enregistrer comme variable d\u2019environnement dans R. Pour faire cela vous pouvez faire<\/p>\n<pre><code>usethis::edit_r_environ()\n<\/code><\/pre>\n<p>ce qui va vous ouvrir le fichier .Renviron, o\u00f9 qu\u2019il se trouve sur votre machine.<\/p>\n<p>Ensuite, vous taperez les lignes suivantes (avec les bonnes cl\u00e9s bien s\u00fbr) dans ce fichier:<\/p>\n<pre><code>GOOGLE_KEY=\"BEiz89gzKNzlcpaK90ver80A_230Lli0N173kinvB\"\nOPENCAGE_KEY=\"6fjzlc8z2s6f113qx215zlk22ig1vq\"\n<\/code><\/pre>\n<p>Apr\u00e8s <strong>enregistrement de .Renviron<\/strong> et <strong>r\u00e9ouverture de R<\/strong>, vous pourrez acc\u00e9der aux valeurs de ces variables \u00e0 l\u2019aide des commandes <code>Sys.getenv(\"GOOGLE_KEY\")<\/code> et <code>Sys.getenv(\"OPENCAGE_KEY\")<\/code>.<\/p>\n<h1>Comment \u00e7a fonctionne?<\/h1>\n<p>Les requ\u00eates envoy\u00e9es aux API ressemblent \u00e0 des URL un peu complexes de ce genre (ici pour rechercher \u201cLa Guilloti\u00e8re, Lyon\u201d aupr\u00e8s de l\u2019API de g\u00e9ocodage Google):<\/p>\n<pre><code>\"https:\/\/maps.googleapis.com\/maps\/api\/geocode\/json?address=Grande+Rue+de+la+Guilloti%C3%A8re,+Lyon&amp;key=BEiz89gzKNzlcpaK90ver80A_230Lli0N173kinvB\"\n<\/code><\/pre>\n<p><small>{Au passage, notez que \u201cURL\u201d (pour \u201cUniform Resource Locator\u201d) prend ici tout son sens\u2026<\/small><\/p>\n<p>On peut voir que cette URL correspond d\u2019abord \u00e0 l\u2019\u201cadresse\u201d de l\u2019API (<a href=\"https:\/\/maps.googleapis.com\/maps\/api\/geocode\/json\" class=\"uri\">https:\/\/maps.googleapis.com\/maps\/api\/geocode\/json<\/a>), ensuite \u00e0 la requ\u00eate elle-m\u00eame suivie du param\u00e8tre \u201ckey\u201d (address=Grande+Rue+de+la+Guilloti%C3%A8re,+Lyon&amp;key=BEiz89gzKNzlcpaK90ver80A_230Lli0N173kinvB\u00a0\u00bb) dont la nature et les valeurs possibles sont document\u00e9es directement par le fournisseur des API :<\/p>\n<ul>\n<li>pour Nominatim (OSM), c\u2019est <a href=\"https:\/\/nominatim.org\/release-docs\/develop\/api\/Search\/\">ici<\/a><\/li>\n<li>pour Google, c\u2019est <a href=\"https:\/\/developers.google.com\/maps\/documentation\/geocoding\/overview\">ici<\/a><\/li>\n<li>pour Opencage, c\u2019est <a href=\"https:\/\/opencagedata.com\/api\">ici<\/a><\/li>\n<\/ul>\n<p>En principe, donc, on peut tr\u00e8s bien construire cette URL nous-m\u00eame, en \u00e9tudiant bien la doc de chaque API, et obtenir la r\u00e9ponse \u00e0 travers la commande <code>httr::GET()<\/code> qui permet de r\u00e9cup\u00e9rer l\u2019info correspondante par http.<\/p>\n<p>La r\u00e9ponse obtenue (par exemple avec l\u2019URL ci-dessus) ressemble g\u00e9n\u00e9ralement \u00e0 quelque chose de ce genre:<\/p>\n<pre><code>{\n   \"results\" : [\n      {\n         \"address_components\" : [\n            {\n               \"long_name\" : \"Grande Rue de la Guilloti\u00e8re\",\n               \"short_name\" : \"Grande Rue de la Guilloti\u00e8re\",\n               \"types\" : [ \"route\" ]\n            },\n            {\n               \"long_name\" : \"Lyon\",\n               \"short_name\" : \"Lyon\",\n               \"types\" : [ \"locality\", \"political\" ]\n            },\n            {\n               \"long_name\" : \"Rh\u00f4ne\",\n               \"short_name\" : \"Rh\u00f4ne\",\n               \"types\" : [ \"administrative_area_level_2\", \"political\" ]\n            },\n            {\n               \"long_name\" : \"Auvergne-Rh\u00f4ne-Alpes\",\n               \"short_name\" : \"Auvergne-Rh\u00f4ne-Alpes\",\n               \"types\" : [ \"administrative_area_level_1\", \"political\" ]\n            },\n            {\n               \"long_name\" : \"France\",\n               \"short_name\" : \"FR\",\n               \"types\" : [ \"country\", \"political\" ]\n            }\n         ],\n         \"formatted_address\" : \"Grande Rue de la Guilloti\u00e8re, Lyon, France\",\n         \"geometry\" : {\n            \"bounds\" : {\n               \"northeast\" : {\n                  \"lat\" : 45.7553017,\n                  \"lng\" : 4.8602422\n               },\n               \"southwest\" : {\n                  \"lat\" : 45.7461895,\n                  \"lng\" : 4.842601\n               }\n            },\n            \"location\" : {\n               \"lat\" : 45.7502745,\n               \"lng\" : 4.8504236\n            },\n            \"location_type\" : \"GEOMETRIC_CENTER\",\n            \"viewport\" : {\n               \"northeast\" : {\n                  \"lat\" : 45.7553017,\n                  \"lng\" : 4.8602422\n               },\n               \"southwest\" : {\n                  \"lat\" : 45.7461895,\n                  \"lng\" : 4.842601\n               }\n            }\n         },\n         \"place_id\" : \"ChIJefk7rWnq9EcRDacYDiq2NLA\",\n         \"types\" : [ \"route\" ]\n      }\n   ],\n   \"status\" : \"OK\"\n}\n<\/code><\/pre>\n<p>C\u2019est un r\u00e9sultat qui correspond \u00e0 un format <strong>json<\/strong> (on pourrait aussi l\u2019avoir au format \u201clist\u201d R).<\/p>\n<p>Il est ainsi possible de <strong>r\u00e9cup\u00e9rer les \u00e9l\u00e9ments de r\u00e9ponse<\/strong> qui nous int\u00e9ressent moyennant une petite \u201cgymnastique\u201d de manipulation de listes sous R.<\/p>\n<p>Dans un cas (construction de l\u2019URL) comme dans l\u2019autre (r\u00e9cup\u00e9ration des donn\u00e9es depuis la liste) n\u00e9anmoins, cela exige un peu de travail.<\/p>\n<p>C\u2019est pour cela qu\u2019il existe des <strong>API clients<\/strong> R, c\u2019est-\u00e0-dire des packages qui visent \u00e0 simplifier l\u2019envoi de requ\u00eates et la r\u00e9cup\u00e9ration de donn\u00e9es pour les utilisateurs de R. La simplification intervient \u00e0 deux niveaux:<\/p>\n<ul>\n<li>pour construire l\u2019URL, les param\u00e8tres sont pass\u00e9s (de mani\u00e8re classique pour des habitu\u00e9s de R) comme <strong>valeurs d\u2019arguments des fonctions<\/strong>. Par ailleurs, il y a souvent eu un \u201c\u00e9cr\u00e9mage\u201d des param\u00e8tres possibles pour ne garder que les plus importants aux yeux des d\u00e9veloppeurs de ces packages.<\/li>\n<li>les r\u00e9sultats sont <strong>formatt\u00e9s<\/strong> d\u2019une mani\u00e8re all\u00e9g\u00e9e et simplifi\u00e9e pour des utilisateurs de R (par exemple sous forme de tableau plut\u00f4t que sous forme de liste).<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/geocodage\/API_2.png\" alt=\"\" \/><\/p>\n<h1>API clients opencage, mixr, tidygeocode<\/h1>\n<p>Je vais ici vous montrer les API clients<\/p>\n<ul>\n<li><code>tidygeocoder<\/code> (qui interroge l\u2019API <strong>Nominatim (OSM)<\/strong>)<\/li>\n<li><code>opencage<\/code> (qui interroge l\u2019API <strong>Opencage<\/strong>)<\/li>\n<li><code>mixr<\/code> (qui interroge les API <strong>google<\/strong> et <strong>Opencage<\/strong>)<\/li>\n<\/ul>\n<h2>API OSM: package tidygeocoder<\/h2>\n<p>Comme son nom l\u2019indique le package <code>tidygeocoder<\/code> a en entr\u00e9e et en sortie des donn\u00e9es sous forme <strong>tidy<\/strong>, il est donc particuli\u00e8rement agr\u00e9able \u00e0 utiliser pour tous les aficionados du tidyverse.<\/p>\n<p>Il peut aussi r\u00e9cup\u00e9rer les donn\u00e9es depuis l\u2019API UScensus (sa source par d\u00e9faut) mais pour des noms de lieu hors USA ce n\u2019est \u00e9videmment pas indiqu\u00e9\u2026 Je pr\u00e9cise donc <code>method=\"osm\"<\/code> dans l\u2019appel \u00e0 la fonction <code>geocode()<\/code> de <code>tidygeocoder<\/code> ci-dessous:<\/p>\n<pre><code>result_tidygeocoder=tidygeocoder::geocode(mydf,\n                                          loc,\n                                          method=\"osm\")\nresult_tidygeocoder\n\n## # A tibble: 7 x 3\n##   loc                                    lat    long\n##   &lt;chr&gt;                                &lt;dbl&gt;   &lt;dbl&gt;\n## 1 Lyon, France                          45.8    4.83\n## 2 22 place du G\u00e9n\u00e9ral de Gaulle, Paris  NA     NA   \n## 3 la Guilloti\u00e8re, Lyon                  45.8    4.84\n## 4 Europe                                51     10   \n## 5 &lt;NA&gt;                                  NA     NA   \n## 6 Tucson, AZ                            32.2 -111.  \n## 7 Rio Grande do Sul                    -29.8  -53.8\n<\/code><\/pre>\n<p>On peut \u00e9galement r\u00e9cup\u00e9rer plus d\u2019infos que simplement celles de latitude-longitude. Pour cela, il faut pr\u00e9ciser l\u2019argument <code>full_results=TRUE<\/code><\/p>\n<pre><code>result_tidygeocoder_full=tidygeocoder::geocode(mydf,\n                                               loc,\n                                               method=\"osm\",\n                                               full_results=TRUE)\ncolnames(result_tidygeocoder_full)\n\n##  [1] \"loc\"          \"lat\"          \"long\"         \"place_id\"     \"licence\"      \"osm_type\"     \"osm_id\"       \"boundingbox\"  \"display_name\" \"class\"        \"type\"         \"importance\"   \"icon\"\n<\/code><\/pre>\n<p>Pour en savoir plus sur ce package vous pouvez consulter <a href=\"https:\/\/www.r-bloggers.com\/2019\/11\/geocoding-with-tidygeocoder\/\">cette page<\/a><\/p>\n<h2>API Google\/Opencage: package mixr<\/h2>\n<p><code>mixr<\/code>, c\u2019est un petit package \u201cmaison\u201d que je me suis fait pour pouvoir r\u00e9exploiter plus facilement un certain nombre de fonctions que je m\u2019\u00e9tais cr\u00e9\u00e9es pour travailler avec des donn\u00e9es Twitter. Il est encore en d\u00e9veloppement mais il est d\u2019ores et d\u00e9j\u00e0 possible de l\u2019installer depuis github <a href=\"https:\/\/github.com\/lvaudor\/mixr\">ici<\/a> si vous le souhaitez. En termes de g\u00e9ocodage, il permet de r\u00e9cup\u00e9rer des donn\u00e9es depuis l\u2019API Google et depuis l\u2019API Opencage.<\/p>\n<p>Pour cette deuxi\u00e8me option (API Opencage) il s\u2019appuie tr\u00e8s largement sur un autre package R: <code>opencage<\/code> voir <a href=\"https:\/\/github.com\/ropensci\/opencage\">ici<\/a>. Son avantage principal par rapport \u00e0 la fonction <code>opencage::opencage_forward()<\/code> est qu\u2019il permet de g\u00e9ocoder plusieurs noms de lieux \u00e0 la fois. Il s\u2019agit apparemment d\u2019une chose que les d\u00e9veloppeurs d\u2019<code>opencage<\/code> ont pr\u00e9f\u00e9r\u00e9 ne pas impl\u00e9menter directement pour diverses raisons, l\u2019une d\u2019entre elles \u00e9tant que les utilisateurs risquaient d\u2019utiliser le service de mani\u00e8re immod\u00e9r\u00e9e: j\u2019ai donc fait en sorte que dans la fonction <code>mixr::tidy_geocode(method=\"opencage\")<\/code> chaque envoi de requ\u00eate prenne a minima 1 seconde\u2026<\/p>\n<h2>Appel de la fonction tidy_geocode() pour l\u2019API Google:<\/h2>\n<pre><code>result_mixr_google=mixr::tidy_geocode(mydf,\n                                      location=loc,\n                                      method=\"google\",\n                                      info=c(\"lat\",\"lng\",\"country\"))\nresult_mixr_google\n\n## # A tibble: 7 x 4\n##   stringlocation                         lat     lng country      \n##   &lt;chr&gt;                                &lt;dbl&gt;   &lt;dbl&gt; &lt;chr&gt;        \n## 1 Lyon, France                          45.8    4.84 France       \n## 2 22 place du G\u00e9n\u00e9ral de Gaulle, Paris  48.9    2.43 France       \n## 3 la Guilloti\u00e8re, Lyon                  45.8    4.84 France       \n## 4 Europe                                54.5   15.3  &lt;NA&gt;         \n## 5 &lt;NA&gt;                                  NA     NA    &lt;NA&gt;         \n## 6 Tucson, AZ                            32.2 -111.   United States\n## 7 Rio Grande do Sul                    -30.0  -51.2  Brazil\n<\/code><\/pre>\n<h2>Appel de la fonction tidy_geocode() pour l\u2019API Opencage:<\/h2>\n<pre><code>result_mixr_opencage=mixr::tidy_geocode(mydf,\n                                        location=loc,\n                                        method=\"opencage\",\n                               info=c(\"lat\",\"lng\",\"components.country_code\"))\n\n## Warning: `tbl_df()` is deprecated as of dplyr 1.0.0.\n## Please use `tibble::as_tibble()` instead.\n## This warning is displayed once every 8 hours.\n## Call `lifecycle::last_warnings()` to see where this warning was generated.\n\nresult_mixr_opencage\n\n## # A tibble: 37 x 4\n##    stringlocation   lat     lng components.country_code\n##    &lt;chr&gt;          &lt;dbl&gt;   &lt;dbl&gt; &lt;fct&gt;                  \n##  1 Lyon, France    45.8  4.83   fr                     \n##  2 Lyon, France    45.7  4.74   fr                     \n##  3 Lyon, France    44.1  0.0135 fr                     \n##  4 Lyon, France    46.6 -1.38   fr                     \n##  5 Lyon, France    46.5 -1.34   fr                     \n##  6 Lyon, France    45.7  4.74   fr                     \n##  7 Lyon, France    46.7 -1.25   fr                     \n##  8 Lyon, France    48.9  2.32   fr                     \n##  9 Lyon, France    45.7  4.83   fr                     \n## 10 Lyon, France    50.5  2.50   fr                     \n## # \u2026 with 27 more rows\n<\/code><\/pre>\n<p>Pour l\u2019une comme pour l\u2019autre, vous pouvez consulter l\u2019<strong>aide des fonctions<\/strong> pour voir quelles sont les infos que vous pouvez esp\u00e9rer obtenir\u2026<\/p>\n<h2>Citation<\/h2>\n<p>Merci de citer ce billet de la mani\u00e8re suivante:<\/p>\n<p>Vaudor L (2020). \u201cG\u00e9ocodage sous R via une API.\u201d <em>R-atique: Analyse de donn\u00e9es avec R<\/em>. <url: <a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/geocodage-sous-r-via-une-api\/\" class=\"uri\">http:\/\/perso.ens-lyon.fr\/lise.vaudor\/geocodage-sous-r-via-une-api\/>.<\/url:><\/p>\n<p>(<span class=\"citeproc-not-found\"\ndata-reference-id=\"Misc\"><strong>???<\/strong><\/span>){vaudor_geocodage, author = {Lise Vaudor}, title = {G\u00e9ocodage sous R via une API}, month = {nov}, year = {2020}, journal = {R-atique: Analyse de donn\u00e9es avec R}, type = {blog}, url = {<a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/geocodage-sous-r-via-une-api\/\" class=\"uri\">http:\/\/perso.ens-lyon.fr\/lise.vaudor\/geocodage-sous-r-via-une-api\/<\/a>}, }<\/p>\n","protected":false},"excerpt":{"rendered":"<p>G\u00e9ocodage via une API: was ist das? G\u00e9ocodage Le g\u00e9ocodage d\u2019abord: Il s\u2019agit d\u2019une op\u00e9ration qui consiste \u00e0 associer des coordonn\u00e9es g\u00e9ographiques \u00e0 un nom de lieu ou une adresse. C\u2019est donc une op\u00e9ration incontournable si vous disposez par exemple d\u2019un jeu de donn\u00e9es comprenant des lieux sous forme de cha\u00eenes de caract\u00e8re, et que vous voudriez l\u2019utiliser pour produire une carte. API Qu\u2019est-ce qu\u2019une API, maintenant: API cela veut.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/geocodage-sous-r-via-une-api\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1267","post","type-post","status-publish","format-standard","hentry","category-tous-les-posts"],"_links":{"self":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/comments?post=1267"}],"version-history":[{"count":14,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1267\/revisions"}],"predecessor-version":[{"id":1288,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1267\/revisions\/1288"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=1267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=1267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=1267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}