Daten von OSM API in Excel VBA

Hallo zusammen,

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.

Moin,

für diese Art von Abfragen ist die Main API nicht gedacht, schau dir mal die Overpass API an.

Was genau ist denn die placeid? Hoffentlich nicht der Wert, der von Nominatim kommt? Denn dieser ist außerhalb von Nominatim absolut bedeutungslos.

Was soll denn das Ziel der ganzen Übung sein?

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.

Bei dieser Adresse beispielsweise möchte ich die Infos bekommen, dass es sich um highway=residential und maxspeed=20 handelt: http://www.openstreetmap.org/api/0.6/way/9824079

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 :confused:
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 :confused:
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

Ist denn irgendwo im Result-XML ein Elementknoten, der “status” heisst?

Ich vermute mal nein. Er will wohl den Status des Requests abfragen. Auch wenn das jetzt über unseren Support hinausgeht:

Results.parseError.errorCode<>0

Wäre vermutlich das richtige.

PS: ich persönlich würde übrigens eine neue Version der XML API nehmen und mal die MSDN dazu lesen :wink:

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.

Ok, vielen Dank für die ganzen Infos!!