ich möchte mithilfe von Excel VBA Daten aus der OSM API bekommen, z.B. welchen Wert der Schlüssel “highway” hat. Diese Info soll dann in meinem Excel-Sheet ausgegeben werden.
Bisher sieht meine Funktion so aus:
Option Explicit
Function LageStreet(placeid As Long) As Long
Dim Request As New XMLHTTP30
Dim Results As New DOMDocument30
Dim StatusNode As IXMLDOMNode
Dim StreetNode As IXMLDOMNode
On Error GoTo errorHandler
Request.Open "GET", "[url]http://www.openstreetmap.org/api/0.6/way/[/url]" _
& placeid & "&sensor=false", False
Request.send
Results.LoadXML Request.responseText
Set StatusNode = Results.SelectSingleNode("//status")
Select Case UCase(StatusNode.Text)
Case "OK"
Set StreetNode = Results.SelectSingleNode("//way/highway")
LageStreet = StreetNode.Text
Case "ZERO_RESULTS"
LageStreet = "The address probably not exists"
Case Else
LageStreet = "Error"
End Select
errorHandler:
Set StatusNode = Nothing
Set StreetNode = Nothing
Set Results = Nothing
Set Request = Nothing
End Function
Kann mir da bitte jemand weiterhelfen? Ich bin totaler Neuling was API bzw. Programmieren angeht und bin für jede Hilfe dankbar.
Das ging aber schnell, danke schon mal!
Ich habe eine Excel mit Adressdaten zu denen ich mit VBA anzeigen lassen will, um welche Straße es sich z.B. handelt, oder um welche Art von Geschäft etc.
Mit der aktuellen url bin ich also total auf dem Holzweg? Mit placeid meine ich die Nummer, die zu jedem Suchergebnis auf der OSM Website mit ausgegeben wird.
Ja, die URL ist eigentlich für Mapper gedacht, nicht jedoch um größere Mengen Daten für andere Zwecke herunterzuladen.
Ich habe immer noch etwas Probleme, mir das ganze vorzustellen. Können wir das mal an einem konkreten Beispiel durchspielen, so auf Papier und ohne Excel? Wenn ich Adressdaten habe, ist dort doch eigentlich eine Straße dabei. Warum muss ich die nochmal abfragen? Oder soll da herauskommen, dass es ein highway=primary oder highway=residential ist?
Das ist mir auch nicht klar. Wie rufst du denn die Suche aus Excel heraus auf? Und meinst du einen Link wie: http://www.openstreetmap.org/node/4761734421 oder nochmal etwas anderes?
Naja, also wenn du bereits den OSM-Typ (node, way, relation) kennst und die entsprechende OSM-ObjektID hast, dann könntest du mit dieser URL durchaus etwas anfangen … aber mich beschleicht auch irgendwie so das Gefühl, dass du das noch nicht hast, oder?
Ich möchte verschiedene VBA Funktionen erstellen, um zu vorgegebene Adressen Infos zu bekommen.
Z.B. an welcher Straße (also ist es eine Fußgängerzone, eine Hauptstraße oder eine Staatsstraße) eine Adresse liegt, was ist die Höchstgeschwindigkeit der entsprechenden Straße, handelt es sich bei der Adresse um ein Wohnhaus oder ein Geschäft etc.
Mir liegen nur Adressen (Straße, Hausnummer, PLZ) vor, ich weiß weder den OSM-Typ noch die OSM-ObjektID. Aber das kann ich beides theoretisch über die OSM Website herausfinden, oder?
Ja, manuell halt, sprich wenn du selbst auf osm.org gehst, suchst und dir die ID(s) geben lässt (so wie bis jetzt wohl auch) und dann deiner Excel-Funktion übergibst (inkl Objekt-Typ).*
Automatisch (also Geocoding) wird das schon eine etwas kniffligere Sache und geschweige dessen, dass wir von 100% Adressabdeckung auf Hausnummern-Ebene noch sehr weit entfernt sind
Und wenn du das hättest (also Geocoding) dann bräuchtest du ja trotzdem noch eine (kleine) Umkreissuche, sprich welche Straße liegt denn überhaupt am nächsten, usw. Und da, genauso wie beim Thema “Spatiale Abfrage” bin ich dann definitiv raus…
Und dahingehend - ich habe es jetzt nicht getestet - sieht deine Funktion doch gar nicht so schlecht aus.
Deshalb vielleicht nochmal die Frage nach einer klaren Fragestellung deinerseits: was genau möchtest du jetzt von uns wissen?
Damit, dass ich mir die Objekt-Typen und IDs manuell raussuchen muss habe ich mich fast schon abgefunden
Mir geht’s tatsächlich nur darum, was ich an meinem Code änder muss, damit ich z.B. “highway=secondary” ausgegebene bekomme. Aktuell ist das Ergebnis meiner Funktion leider immer “0”.
Kann es sein, dass in dem Teil hier was nicht stimmt?
Set StatusNode = Results.SelectSingleNode(“//status”)
Select Case UCase(StatusNode.Text)
Case “OK”
Set StreetNode = Results.SelectSingleNode(“//way/highway”)
LageStreet = StreetNode.Text
Das nehme ich auch an. Dann wäre aber die Status-Eigenschaft XMLHTTP30-Objekts interessant, nicht die des XML-Parsers.
Das ist grundsätzlich zu empfehlen, erst mal die “Bedienungsanleitungen” der Werkzeuge zu studieren, die man anwenden will. Und sich mit der Struktur der Reponse zu befassen. Sonst ist spätestens beim Versuch Schluss, die Lagedaten der Straße wie im Beispielcode zu extrahieren.
Das ist richtig. Nehmen wir mal an, wir finden über die Suche ein Objekt mit der entsprechenden Adresse. Das ist möglicherweise ein Haus, vielleicht auch irgendein Geschäft. Mit ziemlicher Sicherheit wird die direkte Suche aber keine Straße zurückliefern, womit das Ermitteln von Straßentyp oder Geschwindigkeit von vornherein gar nicht mit diesem Ansatz funktioniert. Es wird also ohne eine Form von Umkreissuche definitiv nicht funktionieren. Da ist die Main API also erstmal komplett raus, da hilft dann z.B. noch Overpass weiter.
Ich würde dringend empfehlen, selbst etwas zu mappen, um mit dem OSM Datenmodell vertraut zu werden. In der Zwischenzeit würde ich vorschlagen, das ganze Excel und VBA Zeug einmal links liegen zu lassen. Automatisieren kann man später immer noch. Mit dem jetzigen Ansatz macht es jedenfalls nicht wirklich Sinn.