Suche nach allen Objekten, die ein bestimmtes Tag besitzen.
Wir wollen weltweit alle Objekte finden, bei denen ein spezielles Tag vorhanden ist.
Das ist per Overpass API nur bei Tags mit weniger als 10.000 Vorkommen sinnvoll; die jeweilige Anzahl können Sie bei Taginfo finden. Bei größeren Anzahlen kann es zu lange dauern, die Daten überhaupt zu bekommen, oder der Browser stürzt beim Anzeigen ab oder beides.
Suchen mit räumlicher Beschränkung funktionieren auch sinnvoll auf häufigen Tags.
Ein typisches Beispiel für seltene Tags sind Namen von Dingen, hier Köln:
nwr[name="Köln"]; out center;
Wie Sie sehen, sehen Sie auch nach dem Klick auf Ausführen nichts. Erst die Lupe bringt die Daten in Sicht. Für alle folgenden Abfragen verwenden wir eine globale Sicht, so dass Sie nicht nachfokussieren müssen.
Auch in naheliegenden Fällen können solche Suchen allerdings scheitern. Zu Frankfurt gibt es Treffer quer über den Globus, und das Objekt für die Stadt am Main ist nicht einmal dabei:
nwr[name="Frankfurt"]; out center;
Der Grund dafür ist, das der Zusatz am Main im Namen steht. Die Overpass API würde ihre Kernaufgabe vernachlässigen, wenn sie trotzdem das Objekt findet. Eine interpretierende Suche ist Aufgabe eines Geocoders, z.B. Nominatim.
Es gibt trotzdem Abfragen dafür, z.B. durch reguläre Ausdrücke. Wir können nach allen Objekten suchen, deren Name mit Frankfurt beginnt; wegen der vielen Treffer dauert die Suche lange, aber die Ergebnisgröße ist in diesem Fall trotz Warnmeldung noch harmlos:
nwr[name~"^Frankfurt"]; out center;
Viele weitere typische Verwendungen für reguläre Ausdrücke werden weiter unten erklärt.
Dies sind nun sehr viele Treffer, insbesondere Straßen, deren Name mit Frankfurt beginnt. In der Regel sucht man aber einen spezifischen Objekttyp. Im Falle einer Stadtgrenze handelt es sich immer um eine Relation. Wir können gezielt danach suchen, indem wir statt nwr (für Nodes-Ways-Relations) den Ausdruck relation schreiben:
relation[name="Köln"]; out geom;
Hier ist auch die Ausgabeart von center auf geom geändert, damit man die volle Geometrie des Objekts sieht.
Entsprechend gibt es auch die Typen node und way anstelle von nwr. Sie liefern nur Nodes bzw. nur Ways zurück.
Zuletzt sei noch auf Tags mit Sonderzeichen (alles außer Buchstaben, Zahlen und dem Unterstrich) im Key oder Value hingewiesen. Dem aufmerksamen Beobachter ist nicht entgangen, dass der Value in den Abfragen oben stets in Anführungszeichen steht. Dies wäre eigentlich gleicher Weise auch für Keys nötig; die obige Abfrage lautet also ganz formal:
relation["name"="Köln"]; out geom;
Die Overpass API ergänzt jedoch die Anführungszeichen stillschweigend, wenn klar ist, dass dies gemeint ist. Mit Sonderzeichen kann das nicht funktionieren, da die Sonderzeichen ja auch eine andere Bedeutung haben könnten und der Benutzer sich an einer anderen Stelle beim Aufschreiben der Anfrage vertippt haben könnte.
Anführungszeichen in Values werden formuliert, indem man ihnen einen Backslash voranstellt.
Möchte man nach allen Objekten mit einem Tag in einem Gebiet suchen, so ist dies eigentlich eine Kombination mehrerer Operatoren; dies wird bei und/oder-Kombinationen und Verketten systematisch beschrieben. Hier geht es daher nur um einige Standardfälle.
Alle Objekte in einem eindeutigen Ort sind z.B. alle Cafés in Köln:
area[name="Köln"]; nwr[amenity=cafe](area); out center;
Die genaue Funktionsweise der ersten Zeile wird unter Areas erklärt.
Uns interessiert vor allem die zweite Zeile:
Dies ist eine Query mit Zieltyp nwr (d.h. wir suchen nach Nodes, Ways und Relations);
es ist dann zum einen der Filter [amenity=cafe]
gesetzt,
d.h. wir lassen nur Objekte zu, bei denen das Tag mit Key amenity existiert und auf den Wert cafe gesetzt ist.
Zum zweiten ist der das Gebiet einschränkende Filter (area)
gesetzt.
Der Filter (area)
wirkt durch Aneinanderreihung.
Auf diese Weise suchen wir Obekte bei denen die Tag-Bedingung und die räumliche Bedingung zutrifft. Diese stehen, wieder per Aneinanderreihung, dann in der nachfolgenden Zeile zur Ausgabe bereit.
Wenn Ihnen dies zu kompliziert ist, gibt es aber auch einen einfacheren Weg: Sie können per Bounding-Box räumlich einschränken und dies mit dem Filter nach einem Tag kombinieren (Beispiel):
nwr[amenity=cafe]({{bbox}}); out center;
Das zentrale Element ist auch hier die mit nwr beginnende Zeile:
der Filter [amenity=cafe]
wirkt wie im vorhergehenden Beispiel;
den Filter ({{bbox}})
befüllt Overpass Turbo für uns mit der aktuell sichtbaren Bounding-Box,
und die OVerpass API wendet diese Bounding-Box dann als zweiten Filter an.
Die Reihenfolge der beiden Filter ist, wie bei allen Filtern, egal:
nwr({{bbox}})[amenity=cafe]; out center;
hat das gleiche Ergebnis wie die Abfrage vorher.
Auch hier kann und sollte der Typ der Query-Anweisung zwischen node, way und relation passend gewählt werden, z.B. nur Ways für Gleise:
way[railway=rail]({{bbox}}); out geom;
Im Fall Frankfurt sind wir bereits auf das Problem gestoßen, dass wir unscharf nach einem Wert suchen wollen. Ein sehr mächtiges Werkzeug dafür sind reguläre Ausdrücke. Eine systematische Einführung in reguläre Ausdrücke übersteigt den Umfang dieses Handbuchs, aber es gibt zumindest Beispiele für ein paar gängige Fälle.
In vielen Fällen kennen wir den Anfang eines Namens. Z.B. suchen wir hier nach Straßen, deren Name mit Emmy beginnt:
way[name~"^Emmy"]; out geom;
Das wichtigste Zeichen in der ganzen Abfrage ist die Tilde ~
.
Diese zeigt im Filter in der ersten Zeile an,
dass die Werte mit einem regulären Ausdruck verglichen werden sollen.
Es werden jetzt alle für den Key name
in der Datenbank existierenden Values mit dem regulären Ausdruck hinter der Tilde abgeglichen.
Das zweitwichtigste Zeichen ist das Caret im Ausdruck ^Emmy
;
dieses ist Bestandteil des regulären Ausdrucks
und sorgt dafür, dass nur Werte passen, die mit Emmy
beginnen.
Insgesamt steht dort also:
Finde alle Objekte vom Typ way,
die ein Tag mit Key name
und einem Value besitzen,
der mit Emmy
beginnt.
In der zweiten Zeile steht dann noch eine passende Ausgabeanweisung.
Ebenso kann man nach Werten suchen, die auf einem bestimmten Wert enden, z.B. Noether:
way[name~"Noether$"]; out geom;
Die Tilde ~
zeigt wieder den Filter nach einem regulären Ausdruck an.
Das Dollarzeichen $
innerhalb des regulären Ausdrucks definiert,
dass der Wert mit Noether
enden soll.
Die Lupe als Komfortfunktion in Overpass Turbo zoomt auf den nur einen Treffer in Paris.
Es ist auch möglich, nach einer Teilzeichenkette zu suchen, die irgendwo in der Mitte steht:
way[name~"Noether"]; out geom;
Dazu schreibt man einfach die Teilzeichenkette ohne zusätzliche Zeichen.
Etwas schwieriger wird es, wenn man zwei (oder mehr) Teilzeichenketten finden will, z.B. Vor- und Nachnamen, aber nicht weiß, was dazwischen steht. Bei Emmy Noether kommt sowohl der Bindestrich als auch das Leerzeichen vor. Dazu kann man alle in Frage kommenden Zeichen (zwei oder auch mehr) in eckige Klammern einschließen:
way[name~"Emmy[ -]Noether"]; out geom;
Alternativ kann man auch gleich alle Zeichen zulassen:
way[name~"Emmy.Noether"]; out geom;
Das entscheidende Zeichen ist hier der einzelne Punkt .
.
Er vertritt ein einzelnes beliebiges Zeichen.
Manchmal ist es auch nötig, beliebig viele Zwischenzeichen zuzulassen. Damit sucht man dann also nach zwei getrennten Teilstrings. Ein Beispiel ist der Komponist Bach; er hat nach Johann noch mehr Vornamen:
way[name~"Johann.*Bach"]; out geom;
Hier wirken die beiden Sonderzeichen Punkt .
und Stern *
zusammen.
Der Punkt passt auf ein beliebiges Zeichen,
und der Stern bedeutet,
dass das vorangehende Zeichen beliebig oft (gar nicht, einmal oder mehrmals) wiederholt werden darf.
Ergänzt wird das durch das Fragezeichen. Dann darf ein Zeichen null oder einmal vorkommen. Das hilft uns bei Gerhard bzw. Gerard bzw. Gerardo Mercator:
way[name~"Gerh?ardo?.Mercator"]; out geom;
Zuletzt soll noch der Fall erwähnt werden, der gleich bei Und und Oder wiederkommt: Finde einen Wert aus einer Liste wie z.B. die Standardwerte trunk, primary, secondary, tertiary für Hauptverkehrsstraßen!
way[highway~"^(trunk|primary|secondary|tertiary)$"]({{bbox}}); out geom;
Uns interessiert der Filter [highway~"^(trunk|primary|secondary|tertiary)$"]
;
das Zeichen ~
zeigt den regulären Ausdruck an.
Im regulären Ausdruck bedeuten das Caret am Anfang und das Dollarzeichen am Ende,
dass der volle Value und nicht nur eine Teilzeichenkette auf den Wert dazwischen passen muss.
Der senkrechte Strich |
steht für oder,
und die Klammern sorgen dafür,
dass Caret und Dollarzeichen nicht nur auf einen Wert wirken.
...
weiter: Verketten