{"id":34,"date":"2007-09-21T21:56:34","date_gmt":"2007-09-21T19:56:34","guid":{"rendered":"http:\/\/joergnapp.de\/2007\/09\/20\/geocoding-mit-excel\/"},"modified":"2008-09-27T19:26:43","modified_gmt":"2008-09-27T18:26:43","slug":"geocoding_mit_excel","status":"publish","type":"post","link":"https:\/\/joergnapp.de\/blog\/geocoding_mit_excel\/","title":{"rendered":"Geocoding mit Excel"},"content":{"rendered":"<p>Ich habe mich entschlossen, das ohnehin vorhandene Excel zu benutzen. Die meisten Adressb\u00fccher k\u00f6nnen nach CSV exportieren, und damit ist eine recht einfache Konvertierung gew\u00e4hrleistet.<\/p>\n<p><!--more--><br \/>\nDie Kommunikation mit der Yahoo-API ist simpel: In der URL gibt man die zu konvertierende Adresse an, und bekommt L\u00e4ngen- und Breitengrad sowie weitere Angaben in der Antwort im XML-Format.  <\/p>\n<p>Um die API zu nutzen, ist ein Entwicklerschl\u00fcssel notwendig, den man <a href=\"href=\">kostenlos<\/a> beantragen kann. Tipp: <strike>F\u00fcr Tests tut es auch die ID &#8222;YahooDemo&#8220;\u2026 <\/strike> Leider geht YahooDemo nicht mehr<\/p>\n<p>Um die XML-Antwort verarbeiten zu k\u00f6nnen, verwende ich die <a href=\"href=\">Microsoft Core XML Services<\/a> (MSXML) in der Version 6.0 (ob andere Versionen auch gehen, habe ich nicht getestet).<\/p>\n<p>Die Funktion, um die Yahoo-API anzusprechen, sieht damit so aus:<\/p>\n<pre lang=\"vb\" line=\"1\">\r\nPrivate Function Geocode(Address As String) As Collection\r\n    ' Bei Yahoo eine ID beantragen\r\n    Const APPID = \"XXXXXXXXX\"\r\n\r\n    Const YahooURL = \"http:\/\/local.yahooapis.com\/MapsService\/V1\/geocode\"\r\n\r\n    Dim url As String\r\n    Dim Request As XMLHTTP\r\n    Dim Response As DOMDocument\r\n    Dim Section As IXMLDOMNode\r\n    Dim Node As IXMLDOMNode\r\n\r\n    ' Adresse basteln\r\n    url = YahooURL &amp; \"?appid=\" & APPID & \"&location=\" & Address\r\n\r\n    ' Abfrage der Adresse\r\n    Set Request = New XMLHTTP\r\n\r\n    Request.Open \"get\", url, False\r\n    Request.send\r\n\r\n    ' Antwort verarbeiten\r\n    Set Response = New DOMDocument\r\n    Response.loadXML Request.responseText\r\n\r\n    ' XML-Antwort analysieren\r\n    Set Section = Response.selectSingleNode(\"\/\/ResultSet\/Result\")\r\n\r\n    Set Geocode = New Collection\r\n    For Each Node In Section.childNodes\r\n        Geocode.Add Node.Text, Node.nodeName\r\n    Next\r\n\r\n    Geocode.Add Section.Attributes.getNamedItem(\"precision\").Text, \"Precision\"\r\n\r\n    ' Ressourcen freigeben\r\n    Set Section = Nothing\r\n    Set Response = Nothing\r\n    Set Request = Nothing\r\nEnd Function\r\n<\/pre>\n<p>Damit bekommt man z.B. den Breitengrad mit der folgenden Funktion:<\/p>\n<pre lang=\"vb\" line=\"1\">\r\nPublic Function Latitude(Address As String) As Double\r\n    Dim coords As Collection\r\n    Set coords = Geocode(Address)\r\n\r\n    Latitude = Val(coords(\"Latitude\"))\r\nEnd Function\r\n<\/pre>\n<p>Der Charme dieser L\u00f6sung besteht darin, dass die Funktionen jetzt den Excel-Umfamg erweitern. Wenn also in A1 die Stra\u00dfe und in B1 der Ort steht, so liefert mir <\/p>\n<pre>\r\n=Latitude(A1 & \" \" & B1)\r\n<\/pre>\n<p> den Breitengrad dieser Adresse.<\/p>\n<pre lang=\"vb\" line=\"1\">\r\n' Ermittelt den L\u00e4ngengrad einer Adresse\r\nPublic Function Longitude(Address As String) As Double\r\n    Dim coords As Collection\r\n    Set coords = Geocode(Address)\r\n    Longitude = Val(coords(\"Longitude\"))\r\nEnd Function\r\n\r\n' Ermittelt die Stra\u00dfe einer Adresse\r\nPublic Function Street(Address As String) As String\r\n    Dim coords As Collection\r\n    Set coords = Geocode(Address)\r\n    Street = coords(\"Address\")\r\nEnd Function\r\n\r\n' Ermittelt die Stadt einer Adresse\r\nPublic Function City(Address As String) As String\r\n    Dim coords As Collection\r\n    Set coords = Geocode(Address)\r\n    City = coords(\"City\")\r\nEnd Function\r\n\r\n' Ermittelt die Pr\u00e4zision des Geocodings einer Adresse\r\nPublic Function Precision(Address As String) As String\r\n    Dim coords As Collection\r\n    Set coords = Geocode(Address)\r\n    Precision = coords(\"Precision\")\r\nEnd Function\r\n<\/pre>\n<p>Die so erhaltenen Werte eignen sich perfekt, um beispielsweise eine ASC-Datei zu erzeugen, aus der man mit <a href=\"http:\/\/www.poiedit.com\/\">PoiEdit<\/a> eine TomTom-OVI machen kann.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe mich entschlossen, das ohnehin vorhandene Excel zu benutzen. Die meisten Adressb\u00fccher k\u00f6nnen nach CSV exportieren, und damit ist eine recht einfache Konvertierung gew\u00e4hrleistet.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[10,13,134,5,12],"class_list":["post-34","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-excel","tag-geocoding","tag-maps","tag-tomtom","tag-webservices"],"_links":{"self":[{"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/posts\/34","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/comments?post=34"}],"version-history":[{"count":0,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/posts\/34\/revisions"}],"wp:attachment":[{"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/media?parent=34"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/categories?post=34"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/joergnapp.de\/blog\/wp-json\/wp\/v2\/tags?post=34"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}