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

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é :

https://www.e-monsite.com/pages/tutoriels/configuration-avancee-du-site/obtenir-une-cle-google-maps-api.html

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 à

capture d ecran 258

Voici ce que donne OSM ... sans API_KEY

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

362file.xml (13.09 Ko)

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

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

395file2.xml (946.00 Octets)

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 !

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
Rechercher des sujets similaires à "coordonnees gps"