Question

Je voudrais obtenir une paire de coordonnées (longitude, latitude) à partir d'une adresse postale.

Je suis codage VBA dans un classeur Excel. Je peux supposer que Google Earth est installé et enregistré en tant que serveur COM. Ainsi je cherchais un moyen d'utiliser l'API Google Earth COM pour y parvenir, mais je ne l'ai pas réussi à trouver quoi que ce soit.

La plupart des coups que j'ai trouvé sur le web sont pour les programmeurs web et sont sur l'utilisation de la « Google API de géocodage », qui est JavaScript, que je pense est pas possible pour mon cas.

(Mise à jour: Ce devait être fait comme un traitement par lots pour des dizaines / centaines d'adresses Comme rjmunro a souligné, il est privé et donc contre les termes Google d'utilisation, donc je devais chercher un autre service..)

Était-ce utile?

La solution

Pourquoi voulez-vous utiliser Google Earth? Il ne peut pas géocodage si l'ordinateur est en ligne, et si elle est en ligne, vous pouvez aussi bien utiliser le web apis directement. Il y a beaucoup d'exemples d'utilisation VBA pour accéder apis géocodage sur le web, à la fois avec Google, et avec d'autres fournisseurs (Bing, Yahoo, etc.).

Notez que si cela est pour une application privée, plutôt que que tout le monde peut télécharger, il est peut-être contre les conditions de service Google, et vous pouvez avoir besoin d'utiliser un autre fournisseur. Voir cette question dans la FAQ de Google.

Autres conseils

cette Excel Addin pour faire ce que votre demande, vous pouvez le trouver utile.

Il est, bien sûr, à vous de respecter TOS de Google.

(Le Addin applique des limites de taux Google, tel que spécifié dans la documentation).

Je l'ai effectivement fait cela en VBA, je vais vous donner ma solution:

J'utilise l'API de Google Earth (Référence: Terre 1.0 Type Library) Je commence par prendre les informations d'adresse (de la cellule Tools.Range (rngGeocoderAddress)). Je construis des données KML pour le point et de l'envoyer à Google Earth (probablement pas nécessaire), je puis exécuter une recherche sur les informations d'adresse. Cela déclenchera Google pour commencer le zoom à l'emplacement résultant.

Dans une boucle, je surveille périodiquement Google Earth pour voir si elle est encore en train d'effectuer un zoom vers un nouvel emplacement. Une fois qu'il a cessé de bouger, je sais qu'il a zoomé au résultat de la recherche, et je peux capturer le Lat long en utilisant GetPointOnTerrainFromScreenCoords (0,0)

Le résultat final est que j'ai utilisé Google Earth pour géocoder l'adresse.

Public Sub LookUpAddress_Click()
    Dim GEI As ApplicationGE
    Dim PointOnTerrain As PointOnTerrainGE
    Dim Search As SearchControllerGE
    Dim KMLData As String
    Dim row As Long

    'Get the row of the location selected to look up'
    With ddGeocoderID()
        If .listCount <= 1 Then Exit Sub
        row = .ListIndex + 1
    End With

    Set GEI = GEInit()
    If GEI Is Nothing Then Exit Sub

    KMLData = "<?xml version=""1.0"" encoding=""UTF-8""?>" & _
            "<kml xmlns=""http://www.opengis.net/kml/2.2"">" & _
            "<Placemark>" & _
                "<name>" & ddGeocoderID().List(ddGeocoderID().ListIndex) & "</name>" & _
                "<visibility>1</visibility>" & _
                "<open>1</open>" & _
                "<description>" & "<![CDATA[" & Tools.Range(rngGeocoderDescription) & "]]></description>" & _
                "<address>" & Tools.Range(rngGeocoderAddress) & "</address>" & _
            "</Placemark>" & _
            "</kml>"
    GEI.LoadKmlData KMLData

    Set Search = GEI.SearchController()
    Call Search.Search(Tools.Range(rngGeocoderAddress))
    Dim resul As Variant
    Set resul = Search.GetResults()
    Dim lat As Double, lon As Double, prevlat As Double, prevlon As Double, checkChange As Double
    Dim steady As Boolean
    steady = False: checkChange = -1
    lat = 0: lon = 0: prevlat = -1: prevlon = -1
    While Not steady
        Set PointOnTerrain = GEI.GetPointOnTerrainFromScreenCoords(0, 0)
        lat = PointOnTerrain.Latitude
        lon = PointOnTerrain.Longitude
        lblGeoedLat().Caption = sigFigs(lat, 8)
        lblGeoedLong().Caption = sigFigs(lon, 8)
        DoEvents
        If (checkChange = 100) Then
            If (lat = prevlat And lon = prevlon) Then steady = True
            prevlat = lat: prevlon = lon
            checkChange = -1
        End If
        checkChange = checkChange + 1
        Sleep 10
    Wend
End Sub

Voici quelques captures d'écran montrant comment je l'ai fait travailler avec une interface utilisateur:

Image 1 Entrez une adresse entrer image description ici

Image 2 Cliquez géocodage, le code attend le zoom pour arrêter entrer image description ici

Image 3 code enregistre la s'ils sont satisfaits de la finale lat / long, l'utilisateur clique enregistrement. entrer image description ici

Je l'ai essayé en boucle le code géocodage de nombreux endroits programatically. Il fonctionne mieux si vous configurez la vitesse du zoom de Google Earth pour être aussi assez rapide (mais pas instantanée)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top