Sep 21 2007

Geocoding mit Excel

Kategorien: , , , ,  

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:

  1. Matze Matze sagte am 05.06.2008 um 20:38:

    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

  2. Jörg Jörg sagte am 08.07.2008 um 18:47:

Kommentar abgeben