Géocodage avec Google Earth
-
19-09-2019 - |
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..)
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
Image 2 Cliquez géocodage, le code attend le zoom pour arrêter
Image 3 code enregistre la s'ils sont satisfaits de la finale lat / long, l'utilisateur clique enregistrement.
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)