Coordonnées GPS
Bonjour,
J'ai un tableau Excel avec plein de coordonnées GPS (Longitude latitude).
Je souhaite les convertir en adresse de façon automatique.
Quelqu'un à une solution ?
J'utilise Excel 2016.
Merci la communauté
Pascal
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
La solution est de passer par l'API de Google : "Geocoding API". Mais il faut disposer d'une clé. Cette clé peut être obtenue gratuitement mais le quota gratuit de requêtes est limité à une par jour.
Voir ce lien pour obtenir une clé :
Voir ce lien pour le tarif (0,50 USD pour 1000 requêtes) :
ci-dessous la fonction nécessaire :
Option Explicit
Function Adresse_GeoCode(latitude As String, longitude As String) As String
'// ajouter la référence Microsoft XML v6.0
Dim Apikey As String, url As String
Dim temps_début As Long
Dim doc_xml As DOMDocument60
Const doc_loading As Integer = 1, doc_loaded As Integer = 2, doc_interactive As Integer = 3, doc_completed As Integer = 4
Apikey = "votre clé"
url = "https://maps.googleapis.com/maps/api/geocode/xml?latlng=" & latitude & "," & longitude & "&key=" & Apikey
'// chargement du document xml à partir de l'url
Set doc_xml = New DOMDocument60: doc_xml.Load url
temps_début = Timer
While doc_xml.readyState <> doc_completed
DoEvents
If Timer > temps_début + 30 Then MsgBox "temps de chargement de l'API > 30 secondes -- Abandon": Exit Function
Wend
If doc_xml.Text = Empty Then Adresse_GeoCode = "Erreur URL": Exit Function
'// test de la réponse à la requête
Select Case UCase(doc_xml.SelectSingleNode("/GeocodeResponse/status").Text)
Case "OK"
Adresse_GeoCode = doc_xml.SelectSingleNode("/GeocodeResponse/result/formatted_address").Text
Case "ZERO_RESULTS"
Adresse_GeoCode = "Auncun résultat! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case "OVER_QUERY_LIMIT"
Adresse_GeoCode = "Limite de reqêtes atteinte! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case "REQUEST_DENIED"
Adresse_GeoCode = "Requête rejetée! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case "INVALID_REQUEST"
Adresse_GeoCode = "Requête invalide! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case "UNKNOWN_ERROR"
Adresse_GeoCode = "Erreur serveur! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case Else
Adresse_GeoCode = "Erreur inconnue!"
End Select
End Function
Bonjour,
Bonjour Thev,
tu peux le faire aussi avec SERVICEWEB et FILTRE.XML (mais toujours avec clé ici)
=SERVICEWEB("https://maps.googleapis.com/maps/api/geocode/xml?latlng=" & [Latitude] & "," & [Longitude] & "&key=" & 'API-KEY'!$A$1 )
=FILTRE.XML([Https];Tableau1[[#En-têtes];[/GeocodeResponse/result/formatted_address]])
il est aussi possible de passer à
Voici ce que donne OSM ... sans API_KEY
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour Steelson,
L'utilisation des fonctions déjà implémentées est évidemment plus simple. Ma fonction permet seulement une gestion plus automatisée du code retour.
L'API d'OpenStreetMap est intéressante car elle ne nécessite pas de clé mais elle semble moins précise que celle de Google.
Edit : Pour info, ci-joint le fichier XML de l'API Google correspondant à ton exemple
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Pour info, ci-joint le fichier XML de l'API Google correspondant à ton exemple
En examinant plus attentivement ce fichier, je m'aperçois qu'il y a effectivement plusieurs réponses car les coordonnées GPS de ton exemple ne sont pas suffisamment précises pour ne donner qu'un seul résultat.
Du coup, je vais améliorer ma fonction pour donner l'ensemble des résultats.
A priori et à tester
Case "OK"
Dim résultats As IXMLDOMNode, tb(), i As Integer
Set résultats = doc_xml.SelectSingleNode("/GeocodeResponse/result/formatted_address")
For i = 0 To résultats.ChildNodes.Length - 1
ReDim Preserve tb(i): tb(i) = résultats.ChildNodes(i).Text
Next i
Adresse_GeoCode = Join(tb, "---")
Il faudrait prendre <location_type>ROOFTOP</location_type>
en réalité ! C'est le plus précis.
Mais en fait il faudrait comparer les lat et lon et prendre les plus proches...
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
En comparant les 2 solutions :
- Google est plus précis et donne plusieurs résultats mais nécessite une clé
- OpenStreetMap donne un seul résultat correspondant à une fourchette GPS mais ne nécessite pas de clé.
ci-joint fichier XML OpenStreetMap
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Il faudrait prendre <location_type>ROOFTOP</location_type> en réalité ! C'est le plus précis
De toute façon, c'est celle par défaut.
Les 2 suivantes sont classées en "RANGE_INTERPOLATED" et "GEOMETRIC_CENTER",
Le reste en "APPROXIMATE" .
Au fond, le plus simple est d'utiliser OpenStreetMap mais si l'on veut affiner ,, alors Google avec un choix à faire entre ROOFTOP, RANGE_INTERPOLATED, et GEOMETRIC_CENTER.
Maintenant, il faut que je jette un œil, je dois avoir une solution google sans clé API ! Chut ... c'est un peu complexe car il faut générer une page web locale considérée en "développement" par google qui lui renvoie les infos. Mais c'est un peu tordu ... si on veut utiliser google, autant le faire avec la clé (d'ailleurs je n'ai encore jamais payé, je suis toujours sur mon crédit offert).
ach, j'aime bien quand un sujet permet aussi d'échanger les bonnes pratiques !
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
ci-jointe fonction complétée pour la restitution de l'API Google :
- restitution des 3 résultats ROOFTOP, RANGE_INTERPOLATED" et "GEOMETRIC_CENTER avec les géocodes associés.
Option Explicit
Function Adresse_GeoCode(latitude As String, longitude As String, Apikey As String) As String
'// ajouter la référence Microsoft XML v6.0
Dim url As String
Dim temps_début As Long
Dim doc_xml As DOMDocument60
Const doc_loading As Integer = 1, doc_loaded As Integer = 2, doc_interactive As Integer = 3, doc_completed As Integer = 4
'// chargement du document xml à partir de l'url
url = "https://maps.googleapis.com/maps/api/geocode/xml?latlng=" & latitude & "," & longitude & "&key=" & Apikey
Set doc_xml = New DOMDocument60: doc_xml.Load url
temps_début = Timer
While doc_xml.readyState <> doc_completed
DoEvents
If Timer > temps_début + 30 Then MsgBox "temps de chargement de la page > 30 secondes -- Abandon": Exit Function
Wend
If doc_xml.Text = Empty Then Adresse_GeoCode = "Erreur URL": Exit Function
'// test de la réponse à la requête
Select Case UCase(doc_xml.SelectSingleNode("/GeocodeResponse/status").Text)
Case "OK"
Dim adresses As IXMLDOMNodeList, géocodes As IXMLDOMNodeList
Dim tb(), i As Integer
Dim adresse_i As String, lat_i As String, lng_i As String, type_adresse As String
On Error Resume Next
Set adresses = doc_xml.SelectNodes("/GeocodeResponse/result/formatted_address")
Set géocodes = doc_xml.SelectNodes("/GeocodeResponse/result/geometry")
For i = 0 To adresses.Length - 1
type_adresse = géocodes(i).ChildNodes(1).Text
If type_adresse = "APPROXIMATE" Then Exit For
adresse_i = adresses(i).Text
lat_i = géocodes(i).ChildNodes(0).ChildNodes(0).Text
lng_i = géocodes(i).ChildNodes(0).ChildNodes(1).Text
ReDim Preserve tb(i): tb(i) = adresse_i & " / lat=" & lat_i & ", lng =" & lng_i
Next i
Adresse_GeoCode = Join(tb, Chr(10))
Case "ZERO_RESULTS"
Adresse_GeoCode = "Auncun résultat! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case "OVER_QUERY_LIMIT"
Adresse_GeoCode = "Limite de req?tes atteinte! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case "REQUEST_DENIED"
Adresse_GeoCode = "Requ?te rejet?e! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case "INVALID_REQUEST"
Adresse_GeoCode = "Requ?te invalide! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case "UNKNOWN_ERROR"
Adresse_GeoCode = "Erreur serveur! "
Adresse_GeoCode = Adresse_GeoCode & doc_xml.SelectSingleNode("/GeocodeResponse/error_message").Text
Case Else
Adresse_GeoCode = "Erreur inconnue!"
End Select
End Function