Woran liegt das? Meine erste Annahme, dass es ein Problem gibt, sobald die Abschnitt über das Stadtgebiet hinaus gehen, hat sich nicht bestätigt. Denn das machen die Railways auch.
Indem Zusammenhang auch die Frage, ob es eine gut verständliche Doku zu den Abfragen gibt. Die Hilfe in Overpass Turbo ist ja grandios unverständlich.
soweit würde ich das auch als logisch empfinden.
Allerdings zeigt er mit in dem Fall nur das Ergebnis der ersten Abfrage an, nicht jedoch das der Zweiten (motorway_link). Die unterschlägt Overpass.
Muss ich da irgendwas anders verknüpfen?
Sorry, bei der ersten Abfrage habe ich nicht richtig auf das Ergebnis geschaut.
So habe ich es eigentlich immer gemacht und so funktioniert es auch.
[out:json][timeout:25];
// fetch area “Köln” to search in
{{geocodeArea:Köln}}->.searchArea;
// gather results
(
way[highway=motorway](area.searchArea);
way[highway=motorway_link](area.searchArea);
);
// print results
out body;
>;
out skel qt;
vielen Dank. Das funktioniert.
Nur für mein Verständnis: Was ist der Unterschied zwischen den beiden Bereichsfestlegungen? Also warum geht das eine und das andere nicht?
Und noch eine Frage zur geocodeArea. Kann ich da auch mehr als eine angeben? Also z.B. Köln und Leverkusen?
Muss man sich das so vorstellen?
In der ersten Form wird die Such-area[xxx] in den default set gespeichert, der Query-Parameter area greift auf das default set zu und das Ergebnis überschreibt den default set.
Bei der zweiten Query wird dann ein area auf das default set (Ergebnis der ersten Query) versucht → liefert ergo kein zusätzliches Ergebnis.
Edit: Yep:
Bei der zweiten Form wird die Such-area[xxx] in einer dedizierten Variablen zwischengespeichert, auf die das query-area jeweils zugreift.
Zwei Such-area => Zwei Variablen => doppelte Query auf beide Variablen.
[out:csv(::type,::id,"name",::count)];
area[name="Bonn"]->.a;
( node(area.a)[railway=station];
way(area.a)[railway=station];
rel(area.a)[railway=station];
);
out;
out count;
Das Entscheidende scheint zu sein, das Zwischenergebnis von area[name=“Bonn”] zu speichern (-> .a),
bevor es von anderen Operationen überschrieben wird.
Ich vermute es liegt daran, dass du mehrere Ergebnisse nicht mit einem ( ); zusammenbaust. Dann bekommst du irgendwie nicht alles richtig bei raus. Hilfreich ist halt auch einfach mal den Wizard zu nutzen bei sowas. Der bastelt einem dann was zurecht ^^
Was ich immer mitlerweile mache, dass ich mir meine Ergebnisse immer in ein .result wegschreibe und dann explizit das dann ausgebe.
Siehe: https://overpass-turbo.eu/s/10OQ
Kern ist halt:
( XXXXXX; .result;) -> .result;
Für das XXXX steht halt die Abfrage, welche Ergebnisse ich (u.a.) haben will. Da es ggf. durch eine vorherige Abfrage Ergebnisse in .result gibt, werden jetzt Ergebnisse aus XXXX und .result mittels ( ) zusammengefügt und dann die Gesamtergebnismenge mit → wiederum in .result geschrieben.
Ist zwar mehr Text und man muss es ein wenig ordentlich formatieren, damit man Überblick dadurch nicht verliert, aber finde ich letztlich besser, weil so explizit ist, WAS genau man als Ergebnis bekommt.
Gruß,
asca
PS: Wenn du je eine umfangreiche Doku (oder auch nur eine welche die Grundzüge klar rüberbringt und nicht nur eine Beispielabfragesammlung ohne Erklärung WIESO das SO geschrieben ist), dann sag mir bitte auch bescheid
Ups, das passiert wenn man Themen/Tabs schonmal öffnet und dann 3h später erst die Antwort abschickt. Manche waren wohl flotter ^^
Ja, einfach das gleiche Spiel, wie ich es im Beitrag zuvor geschrieben habe. Einfach mehrere Suchbereiche in .searchArea nacheinander reinpacken.
Siehe: https://overpass-turbo.eu/s/10OZ
Die Sache mit den zwei Suchgebieten ist dort nicht dokumentiert,
habe ich eben mal interessehalber (für mich) nach GeorgFausB #7 ausprobiert - funktioniert http://overpass-turbo.eu/s/10Po
Nur eine wirkliche Erklärung der Syntax, Operatoren, etc. ist das halt nicht - das hätte ich mal gern.
Was du gemacht hast, sind im Prinzip jeweils die gleiche Abfrage in zwei unterschiedlichen Gebieten. Kann man machen, will man aber viele unterschiedliche Dinge in unterschiedlichen Gebieten abfragen, wird es schnell arg unübersichtlich, weil du je Gebiet ja alles nochmal schreiben müsstest
Naja, habe ich im letzten Beispiel #10 ja schon gezeigt wie’s sauber geht. Halt erstmal das Suchgebiet zusammenstellen. Also jedes einzelne Gebiet in eine Variable wie .searchArea einfügen. Dann halt je gesuchtes Objekt eine Abfrage für diese .searchArea.
Was alternativ zu meiner Version oben auch noch ginge wäre:
area[name~"^(Köln|Leverkusen)$"] -> .searchArea;
Halt über einen regulären Ausdruck alles gesucht und als Suchgebiet genutzt was vom Namen EXAKT “Köln” oder “Leverkusen” ist. Ganz wichtig sind die Zeichen:
^ - der Name muss mit dem folgenden beginnen
(…|…) - quasi der Oder-Teil, kann man auch (…|…|…|…|…) erweitern
$ - der Name muss mit dem vorangegangenem aufhören
Lässt man ^ oder $ weg, würden auch Areas wie “Hotel Köln” mit reinzählen, welche vl. irgendwo in Timbuktu sich befindet.
Wenn man die Klammer weglässte würde das ^ nur für den ersten Suchbegriff gelten und das $ nur für den letzten. Somit würden weiterhin “Kölnische Höfe” (falls es sowas irgendwo gibt) oder “Hotel Leverkusen” irgendwo anders gefunden werden. Mit der Klammer gilt ^ und $ für alle Suchbegriffe jeweils.