Geocoding mit Excel
Kategorien: Excel, Geocoding, Maps, TomTom, Webservices
Ich habe mich entschlossen, das ohnehin vorhandene Excel zu benutzen. Die meisten Adressbücher können nach CSV exportieren, und damit ist eine recht einfache Konvertierung gewährleistet.
Die Kommunikation mit der Yahoo-API ist simpel: In der URL gibt man die zu konvertierende Adresse an, und bekommt Längen- und Breitengrad sowie weitere Angaben in der Antwort im XML-Format.
Um die API zu nutzen, ist ein Entwicklerschlüssel notwendig, den man kostenlos beantragen kann. Tipp: Für Tests tut es auch die ID “YahooDemo”… Leider geht YahooDemo nicht mehr
Um die XML-Antwort verarbeiten zu können, verwende ich die Microsoft Core XML Services (MSXML) in der Version 6.0 (ob andere Versionen auch gehen, habe ich nicht getestet).
Die Funktion, um die Yahoo-API anzusprechen, sieht damit so aus:
Private Function Geocode(Address As String) As Collection
' Bei Yahoo eine ID beantragen
Const APPID = "XXXXXXXXX"
Const YahooURL = "http://local.yahooapis.com/MapsService/V1/geocode"
Dim url As String
Dim Request As XMLHTTP
Dim Response As DOMDocument
Dim Section As IXMLDOMNode
Dim Node As IXMLDOMNode
' Adresse basteln
url = YahooURL & "?appid=" & APPID & "&location=" & Address
' Abfrage der Adresse
Set Request = New XMLHTTP
Request.Open "get", url, False
Request.send
' Antwort verarbeiten
Set Response = New DOMDocument
Response.loadXML Request.responseText
' XML-Antwort analysieren
Set Section = Response.selectSingleNode("//ResultSet/Result")
Set Geocode = New Collection
For Each Node In Section.childNodes
Geocode.Add Node.Text, Node.nodeName
Next
Geocode.Add Section.Attributes.getNamedItem("precision").Text, "Precision"
' Ressourcen freigeben
Set Section = Nothing
Set Response = Nothing
Set Request = Nothing
End Function
Damit bekommt man z.B. den Breitengrad mit der folgenden Funktion:
Public Function Latitude(Address As String) As Double
Dim coords As Collection
Set coords = Geocode(Address)
Latitude = Val(coords("Latitude"))
End Function
Der Charme dieser Lösung besteht darin, dass die Funktionen jetzt den Excel-Umfamg erweitern. Wenn also in A1 die Straße und in B1 der Ort steht, so liefert mir
=Latitude(A1 & " " & B1)
den Breitengrad dieser Adresse.
' Ermittelt den Längengrad einer Adresse
Public Function Longitude(Address As String) As Double
Dim coords As Collection
Set coords = Geocode(Address)
Longitude = Val(coords("Longitude"))
End Function
' Ermittelt die Straße einer Adresse
Public Function Street(Address As String) As String
Dim coords As Collection
Set coords = Geocode(Address)
Street = coords("Address")
End Function
' Ermittelt die Stadt einer Adresse
Public Function City(Address As String) As String
Dim coords As Collection
Set coords = Geocode(Address)
City = coords("City")
End Function
' Ermittelt die Präzision des Geocodings einer Adresse
Public Function Precision(Address As String) As String
Dim coords As Collection
Set coords = Geocode(Address)
Precision = coords("Precision")
End Function
Die so erhaltenen Werte eignen sich perfekt, um beispielsweise eine ASC-Datei zu erzeugen, aus der man mit PoiEdit eine TomTom-OVI machen kann.
Kommentare
2 Kommentare:
Kommentar abgeben
RSS
Hallo Jörg,
ich suche genau eine solche Lösung, wie du in “Geocoding mit Excel” aufzeigst. Ich bekomme es aber nicht zum laufen
Ich erhalte eine Fehlermeldung sobald die “falsche?” URL mit request.send senden möchte.
Die URL im VBA-code wird ja so nicht als String akzeptiert. Ich habe unterschiedliche urls getestet und bekomme im Browser (firefox) auch richtige Ergebisse.
(zb. url = YahooURL & “?appid=%22″ & APPID & “%22″ & Chr(38) & “location=” & Address)
Kannst du mir einen Tipp geben was ich falsch mache?
Vielen Dank
Matze
In http://joergnapp.de/2008/07/08/geocoding-mit-excel-reloaded/ ist die Excel-Datei zum Download