Hausnummern von Straßen mit Relation Overpass API

Hallo,
ich würde gerne ein Script für die Overpass API haben, welches zu einer Straße und der Relation in der die Straße liegt alle Hausnummern dieser Straße ausgibt. Das Script sollte so ungefähr aussehen:

[out:json];
rel(3329151)->.searchArea;

nwr[“addr:housenumber”]“addr:street”=“Berliner Straße”;
for(t[“addr:housenumber”]) {
make stat housenumber=_.val;
out;
}

Dieses Script gibt mir jedoch nichts zurück, also ist noch ein Fehler vorhanden. Weiß jemand wie man das behebt. Und es wäre super, wenn der Code keine geschweiften Klammern enthalten würde, wenn das möglich ist, da ich die Abfrage über Python mache und man dort nicht so einfach geschweifte Klammern verwenden kann.

Vielen Dank im voraus!

Geschweifte Klammern einfach verdoppeln, siehe z.B. python - How do I escape curly-brace ({}) characters in a string while using .format (or an f-string)? - Stack Overflow

1 Like

Das behebt das eine Problem. Vielen Dank! Leider hat die obengenannte Syntax aber immer noch ein leeres Ergebnis…

So würde ich es machen (Overpass-Turbo Abfrage):

[out:csv("housenumber";false)];
rel(3329151);
map_to_area;

nwr(area)["addr:housenumber"]["addr:street"="Berliner Straße"];
for(t["addr:housenumber"]) {
  make stat housenumber=_.val;
  out;
}

Da overpy ja wie wir festgestelt haben, kein CSV unterstützt, musst du die erste Zeile halt durch [out:json] o.ä. ersetzen.


Und noch ein Tipp: Wenn du Codeauszüge im Forum postest, nutze am besten den “Vorformatierter Text”-Abschnitt, dann wird es schöner formatiert.

1 Like

Ein Träumchen. Vielen Dank! Das ist die Lösung

Eine kurze Frage habe ich aber noch. Ich lasse es mir also JSON Format ausgeben:

"elements": [

{
  "type": "stat",
  "id": 1,
  "tags": {
    "housenumber": "10"
  }
},
{
  "type": "stat",
  "id": 2,
  "tags": {
    "housenumber": "11"
  }
},

Jedoch finde ich nicht den Pfad um an die housenumber zu kommen. Den ich weiß nicht wie das Object genau aufgebaut ist. Kennst du/jemand zufällig den Pfad. Also bspw. result.elements[0].tags.get(“housenumber”)?

Da overpy scheinbar nur die Typen node, way, relation und area kennt, müsstest du in der Abfrage oben das stat durch z.B. node ersetzen. So erzeugen wir uns dann praktisch eigene Nodes, die jeweils die Hausnummer als einzelnen Tag haben. Dann kannst du dir alle Hausnummern wie folgt ausgeben lassen:

import overpy

api = overpy.Overpass()

result = api.query("""
    [out:json];
    rel(3329151);
    map_to_area;

    nwr(area)["addr:housenumber"]["addr:street"="Berliner Straße"];
    for(t["addr:housenumber"]) {
        make node housenumber=_.val;
        out;
    }
    """)

for node in result.nodes:
    print(node.tags.get("housenumber"))
1 Like

Vielen Dank! Das ist die Lösung!