You are not logged in.

#1 2021-06-08 09:05:48

floriangr
Member
Registered: 2020-10-20
Posts: 10

Overpass - Relations pro Straße für Liste von Straßen

Hallo zusammen,

ich würde gerne mit einem einzigen Overpass Call die Anzahl der Relations von ein paar (weniger als 10) Straßen abfragen. Ich brauche die Anzahl der Relations pro Straße.
Momentan benötige ich dafür einen Call pro Straße (Straße repräsentiert als osmid):

def getNumberRelations(osmid):
    api = overpy.Overpass()
    result = api.query(
        f"""
        [out:json][timeout:30];
        (way({osmid});
        <;
        );
        out;
        """)
   
    return len(result.relations)

Ich kann den Query String auch so schicken, dass ich mehrere osmids schicke und in der Query in einer Union zusammenfasse. Dann bekomme ich als Ergebnis allerdings nicht die Anzahl der Relations pro Straße, sondern alle Relations der geschickten Straßen. Dann müsste ich lokal wieder durch das Ergebnis iterieren und checken, welche Relation als Member welche Straße hat.
Nicht sonderlich elegant...

Habt ihr vielleicht eine bessere Idee? Kein Problem, falls die Lösung ohne overpy auskommt.

Viele Grüße,
Florian

Offline

#2 2021-06-08 09:16:05

mmd
Member
Registered: 2010-11-06
Posts: 1,859

Re: Overpass - Relations pro Straße für Liste von Straßen

Probier mal sowas: way(id: 1000,2000,3000,4000,... ); foreach(  out;  rel(bw);  out count; );

Last edited by mmd (2021-06-08 09:17:22)

Offline

#3 2021-06-08 09:52:00

floriangr
Member
Registered: 2020-10-20
Posts: 10

Re: Overpass - Relations pro Straße für Liste von Straßen

Genial - vielen Dank! smile

Falls du noch einen Moment hast und mir noch zwei Fragen zu deiner Antwort beantworten könntest....
- bw ist eine temporäre Variable für jeweils einen way aus der Liste der ids?
- warum wird zweimal out benötigt?

Offline

#4 2021-06-08 10:10:00

mmd
Member
Registered: 2010-11-06
Posts: 1,859

Re: Overpass - Relations pro Straße für Liste von Straßen

Also,
* das "foreach" iteriert über jeden einzelnen Weg in der Liste
* das "out;" gibt erstmal den Weg aus, damit man später weiß, wohin die Zahl der Relationen gehört
* das rel(bw) sucht zu einem "way" die entsprechenden Relationen (ist hier erklärt: https://wiki.openstreetmap.org/wiki/Ove … .2C_br.29). Im Prinzip ist das das gleiche, was "<;" in deinem Beispiel macht.
* "out count;" am Ende zählt dann die Relationen und gibt diese dann als Gesamtzahl für den jeweiligen Way aus.

In der Ausgabe findest du dann jeweils abwechselnd den Way gefolgt von der Zahl der Relationen pro Way.
Es gibt auch Möglichkeiten das ganze per "make" zu einer Ausgabe pro Way zu kombinieren, also sowas wie: id 1234 hat 5 Relationen

Last edited by mmd (2021-06-08 10:21:09)

Offline

#5 2021-06-08 10:28:17

floriangr
Member
Registered: 2020-10-20
Posts: 10

Re: Overpass - Relations pro Straße für Liste von Straßen

Verstanden. Dankeschön für die Erklärung!

Offline

Board footer

Powered by FluxBB