DE:Overpass API/Overpass QL
Servers status · Versions · Development · Technical design · Installation · XAPI compatibility layer · Public transport sketch lines · Anwendungen · Source code and issuesOverpass turbo · Wizard · Overpass turbo shortcuts · MapCSS stylesheets · Export to GeoJSON · mehr (Deutsch) · Development · Source code and issues · Web siteOverpass Ultra · Examples · Overpass Ultra extensions · MapLibre stylesheets · URL Params · mehr (Deutsch) · Source code and issues · Web site
Overpass QL (Abkürzung für "Overpass Query Language") ist die zweite Sprache, die für die Overpass API entwickelt wurde; die zuerst entwickelte Sprache ist Overpass XML.
Overpass QL ist eine prozedurale, imperative Programmiersprache, die in einem C-Syntax-Stil gehalten ist. Diese Wiki-Seite soll eine vollständige Referenz für die Struktur von Overpass QL sein.
Überblick über die Sprache
Anweisung
Der Overpass QL - Quelltext besteht aus Anweisungen. Jede Anweisung wird mit einem Semikolon ;
beendet. Anweisungen werden sequentiell in einem Prozess ausgeführt. Jede ausgeführte Anweisung ändert den Laufzeitzustand des Prozesses.
Laufzeitzustand
Der Overpass QL Laufzeitzustand besteht aus:
- dem Standard-Datensatz
_
(ein Unterstrich) - anderen benannten Datensätze, wenn der Benutzer welche erzeugt hat
- einem Stapelspeicher, der während der Ausführung der Overpass QL Blockanweisungen existiert
Datensätze
Overpass QL bearbeitet Datensätze. Eine Anweisung schreibt ihre Ergebnisse in einen Datensatz. Danach wird dieser Datensatz von der folgenden Anweisung als Eingabe verarbeitet. Ein Overpass QL Datensatz kann eine beliebige Kombination und eine beliebige Anzahl von OpenStreetMap Knoten (Nodes), Wegen (Ways),Relationen (Relationen) und Flächenelementen (area elements) enthalten.
Solange man keinen benannten Datensatz als Eingabe definiert hat, wird als Eingabe der Standarddatensatz _
verwendet. Ebenso werden alle Ergebnisse in den Standardatensatz _
geschrieben. Dabei ersetzen neue Ergebnisse immer die alten Daten, die noch im Standarddatensatz enthalten sind. Diese alten Daten stehen danach nicht mehr zur Verfügung. Overpass QL Datensätze sind immer global sichtbar ([1]).
Beispiel 1
node[name="Foo"];
Diese Anweisung schreibt das Ergebnis der Abfrage nach Nodes mit dem Namen "Foo" implizit in den Standarddatensatz _
. Dabei werden alte Daten überschrieben. Um ein Ergebnis in einen benannten Datensatz zu schreiben, verwendet man ->
, wobei der Name mit einem .
beginnen muss.
Beispiel 2
Obige Anweisung sieht dann so aus:
node[name="Foo"]->._;
Beispiel 3
Analog kombiniert dieser Befehl:
(
node[name="Foo"];
node[name="Bar"];
);
die Ergebnisse zweier Abfragen mit einem union statement, um das vereinigte Ergebnis dann in den Standarddatensatz _
zu schreiben. Das ist äquivalent mit:
Beispiel 4
(
node[name="Foo"];
node[name="Bar"];
)->._;
Beispiel 5
Um eine Ausgebe in einen benannten Datensatz mit Namen a
zu schreiben, wird nun wieder die Syntax mit->
verwendet, gefolgt mit dem Namen a
des Datensatzes.
Die Abfrage:
(node[name="Foo"];)->.a;
schreibt zum Beispiel alle Knoten mit dem Tag name=Foo
in den Datensatz mit dem Namen a
. Namen für Datensätze können Buchstaben, Ziffern und den Unterstrich enthalten. Sie dürfen allerdings nicht mit einer Ziffer anfangen. Um Elemente aus einem Datensatz zu lesen, schreibt man .
gefolgt von dem Datensatznamen hinter den Befehl:
node.a[amenity=foo];
Dieser Aufruf liefert alle Knoten im Datensatz a
, welche den Schlüssel amenity
mit dem Wert foo
haben.
Aufbau der Sprache
Es gibt verschiedene Arten von Overpass-QL-Anweisungen. Sie sind gruppiert in:
- Einstellungen, bei denen es sich um optionale, globale Variablen handelt, die in der ersten Anweisung der Abfrage festgelegt werden. Beispiele für Einstellungen sind der Server-Timeout für den Overpass-API-Server und das Ausgabeformat der Overpass-QL-Abfrage.
- Blockanweisungen: Blockanweisungen fassen Overpass-QL-Anweisungen zusammen, um Abfragen und Schleifen zu ermöglichen.
- Eigenständige Abfragen: Dies sind vollständige, eigenständige Anweisungen. Sie können Funktionen ausführen, wie z. B. die Abfrage des Overpass-API-Servers zur Erstellung eines Sets, die Bearbeitung des Inhalts eines vorhandenen Sets oder das Senden der Endergebnisse einer Abfrage an einen Ausgabespeicherort. Eigenständige Abfragen bestehen ihrerseits aus kleineren Overpass-QL-Sprachkomponenten, wie z. B. Auswertefunktionen, Filter und Operatoren.
Klammerausdrücke
Die QL-Syntax verwendet
- runde Klammern ()
- eckige Klammern []
- und geschweifte Klammern {}.
Diese Dokumentationsseite verwendet den Begriff Klammern für eckige []
Klammern. Siehe auch Wikipedia für die Nomenklatur
Einstellungen
Die Einstellungen von Overpass QL müssen in der ersten unkommentierten Anweisung des Overpass QL-Quellcodes angegeben werden. Einstellungen können nicht in mehreren Anweisungen deklariert werden.Einstellungsdeklarationen werden in eckige Klammern []
gesetzt. Zwischen dem Namen der Einstellung und dem Wert oder den Werten, die gesetzt werden sollen, steht ein Doppelpunkt :
. Die Einstellungsanweisung muss mit einem Semikolon :
abgeschlossen werden.
// Dies ist eine typische Zeile für eine Einstellungserklärung
// auf einem Overpass Turbo-Server
[out:json][timeout:25];
Zeitüberschreitung (timeout:)
Die Einstellung timeout:
hat einen Parameter, eine nichtnegative ganze Zahl. Der Standardwert ist 180.
Dieser Parameter gibt die maximal zulässige Laufzeit für die Abfrage in Sekunden an, wie sie vom Benutzer erwartet wird. Läuft die Abfrage länger als diese Zeit, bricht der Server die Abfrage mit einem Timeout ab. Je höher dieser Wert ist, desto wahrscheinlicher ist es, dass der Server die Abfrage ablehnt, bevor sie ausgeführt wird.
Wenn Sie also eine wirklich komplexe, große Abfrage senden, stellen Sie ihr einen höheren Wert voran, z. B. "3600" für eine Stunde. Und stellen Sie sicher, dass Ihr Client geduldig genug ist, um nicht wegen einer eigenen Zeitüberschreitung abzubrechen.
Beispiel:
[timeout:180]
maximale Datensatzgrösse (maxsize:)
Die Einstellung maxsize:
hat einen Parameter, eine nichtnegative ganze Zahl. Der Standardwert ist 536870912 (512 MB).
Beispiel:
[maxsize:1073741824]
Wichtiger Hinweis: Kürzlich wurde ein neuer Mechanismus eingeführt, um Abfragen abzubrechen, die 2 GB Speicherplatz überschreiten. Die genaue Größe dieses Limits wird derzeit noch diskutiert und könnte sich im Laufe der Zeit ändern. Wenn Sie Fehlermeldungen erhalten wie "Laufzeitfehler: Query run out of memory using about 2048 MB of RAM." erhalten, sollten Sie auch diesen Thread lesen.
Ausgabeformat (out:)
Die globale Einstellung out:
steht in keinem Zusammenhang mit der Anweisung out. Die Syntax sollte nicht vermischt werden. Mit der Einstellung out wird das Ausgabeformat für die Rückgabe von OSM-Daten festgelegt. Sie kann einen der fünf nachfolgenden Werte annehmen:
- xml
- json (nicht zu verwechseln mit geoJSON)
- csv
- custom
- Popup
Der Standardwert ist xml.
Beispiel:
[out:json]
csv-Ausgabeformat
Das csv-Ausgabeformat gibt OSM-Daten als csv-Dokument zurück, welches direkt in Programmen wie z. B. LibreOffice/MS Office geöffnet werden kann. Es erfordert zusätzliche Konfigurationsparameter, um eine Liste der anzuzeigenden Felder zu definieren, sowie zwei optionale Parameter zum Hinzufügen/Entfernen der csv-Kopfzeile und zum Ändern des Spaltentrennzeichens.
Format:
[out:csv( fieldname_1 [,fieldname_n ...] [; csv-Spaltenüberschrift [; csv-Trennzeichen] ] )]
- Bei numerischen Werten (Koordinaten, ids) wird kein Tausendertrennzeichen verwendet, und als Dezimaltrennzeichen (bei geometrischen Koordinaten) wird der englische Punkt (.) verwendet.
- Für bestimmte Zeichen in String-Werten wird kein Escaping vorgenommen. Dies wird sich mit Version 0.7.55 ändern.
- Das Standard-Trennzeichen (Tabulator) sollte immer noch erlauben, die tabellarischen Daten in den meisten Fällen ohne fehlende/gebrochene/versetzte Spalten zu parsen.
- Diese CSV-Standardwerte stimmen möglicherweise immer noch nicht mit den Erwartungen Ihrer Tabellenkalkulationssoftware überein (insbesondere das Dezimaltrennzeichen in nicht-englischen Versionen). Wenn Sie die CSV-Datei direkt mit Ihrer Anwendung öffnen, könnten die Daten beschädigt oder unlesbar erscheinen. Importieren Sie die Daten stattdessen in eine reine Textspalte einer neuen Tabellenkalkulation und konvertieren Sie sie in dieser Anwendung mit Ihren eigenen Einstellungen. Alternativ können Sie ein externes Filterskript zur Konvertierung der Datei vor dem Öffnen verwenden.
einfache Beispiele
[out:csv(name)] gibt nur das Tag name aus. Siehe unten für weitere ausführlichere Beispiele.
Liste der Feldnamen
Neben den normalen OSM-Feldnamen (Tags) gibt es für jedes Element in der auszugebenden Ergebnismenge auch spezielle Felder. Beachten Sie, dass allen diesen speziellen Feldnamen zwei Doppelpunkte vorangestellt werden müssen ::
Spezielle Feldnamen | Beschreibung |
---|---|
::id
|
OSM Objekt ID |
::type
|
OSM Objekttyp: node (Knoten), way (Weg), relation (Relation) |
::otype
|
OSM Objekt als numerischer Wert |
::lat
|
Breitengrad, verfügbar für nodes (Knoten), oder im Out-Center-Modus. |
::lon
|
Längengrad, verfügbar für nodes (Knoten), oder im Out-Center-Modus. |
Die nachfolgenden Metainformationsfelder sind nur verfügbar, wenn out meta ; zur Ausgabe von OSM-Elementen verwendet wird.
| |
::version
|
die Versionsnummer des OSM-Objektes |
::timestamp
|
Zeitstempel der letzten Änderung eines OSM-Objektes. |
::changeset
|
Changeset, in dem das Objekt geändert wurde |
::uid
|
OSM Benutzer ID |
::user
|
OSM Benutzername |
Die nachfolgenden Metainformationsfelder sind nur verfügbar, wenn out count; zur Ausgabe von OSM-Elementen verwendet wird.
| |
::count
|
Gibt die Gesamtzahl der Objekte (Knoten, Wege, Beziehungen und Flächen) im Inputset zurück |
::count:nodes
|
Gibt die Anzahl der Knoten im Inputset zurück |
::count:ways
|
Gibt die Anzahl der Wage im Inputset zurück |
::count:relations
|
Gibt die Anzahl der Relationen im Inputset zurück |
::count:areas
|
Gibt die Anzahl der Gebiete im Inputset zurück |
Beispiel 1 - Syntax
[out:csv(
::"id", amenity, name, operator, opening_hours, "contact:website", "contact:phone", brand, dispensing, lastcheck
)];
Beispiel 2 - Feuerwachen / Standardauswertung
[out:csv(::id,::type,"name")];
area[name="Singen (Hohentwiel)"];
nwr(area)[amenity=fire_station];
out;
CSV Spaltenüberschriften
Das Vorhandensein oder Nichtvorhandensein einer Kopfzeile kann durch den ersten optionalen Parameter gesteuert werden, der direkt nach der durch Semikolon getrennten Feldliste hinzugefügt werden kann. Mögliche Werte sind true und false. Der Standardwert ist true.
[out:csv(
::"id", amenity, name, operator, opening_hours, "contact:website", "contact:phone", brand, dispensing, lastcheck;
//optionaler Parameter zum deaktivieren der Kopfzeile.
//der Standardwert wurde von "true" auf "false" gesetzt.
false
)];
Beispiel 3 - Feuerwachen / ohne Kopfzeilen
CSV Trennzeichen
Standardmäßig werden alle Felder durch ein Tabulatorzeichen ("\t") getrennt. Diese Einstellung kann jedoch über den zweiten optionalen Parameter geändert werden. Im folgenden Beispiel werden alle Ausgabefelder stattdessen durch ein Pipe-Zeichen ("|") getrennt.
Beispiel 4 - Feuerwachen / mit Kopfzeilen und Spaltentrennung mit Pipe-Zeichen
[out:csv(
::"id", amenity, name, operator, opening_hours, "contact:website", "contact:phone", brand, dispensing, lastcheck;
//optionaler Parameter zum aktivieren der Kopfzeile.
//der Standardwert wurde auf "true" gesetzt.
true;
//die Spaltentrennung erfolgt mit dem Pipe-Zeichen "|"
"|"
)];
Überprüfung der CSV-Ausgabe auf Vollständigkeit der Daten
Im Gegensatz zu anderen Ausgabemodi wie XML und JSON gibt es derzeit keinerlei Hinweise auf Fehlermeldungen. Ein leeres Ergebnis oder ein Ergebnis mit nur einer Kopfzeile könnte entweder bedeuten, dass nichts gefunden wurde oder dass die Abfrage aufgrund einer Zeitüberschreitung oder eines anderen schwerwiegenderen Fehlers abgebrochen wurde. Eine Möglichkeit, dies zu umgehen, besteht darin, einen zusätzlichen Zähler einzuführen, welcher das vorherige Abfrageergebnis zusammenfasst und immer als allerletzte Ausgabeanweisung einer Abfrage eingefügt wird.
Das folgende Beispiel erweitert die zuvor gezeigte Liste um eine zusätzliche Ausgabeanweisung, die eine zusätzliche aggregierte Zeile in der CSV zurückgibt. Das Pseudo-Element vom Typ ::count
steht und beschreibt deren Wert in der letzten angeforderten @count-Spalte. Deren Wert bei normalen Datenzeilen bleiben leer.
[out:csv(::type,::id,"name",::count)];
area[name="Singen (Hohentwiel)"]->.a;
( node(area.a)[amenity=fire_station];
way(area.a)[amenity=fire_station];
rel(area.a)[amenity=fire_station];
);
out;
out count;
Die Ausgabe enthält nun eine zusätzliche Spalte mit dem Typ ::count
und der Angabe, wie viele Elemente insgesamt in der aktuellen Ergebnismenge enthalten sind. Wenn die letzte Zählzeile fehlt oder die Gesamtzahl abweicht, wissen Sie mit Sicherheit, dass etwas schief gelaufen ist und die Abfrageergebnisse unvollständig/inkonsistent sind.
@type @id name @count
way 119893668 Freiwillige Feuerwehr Singen/Htwl. Abt. Kernstadt
way 122443623 Freiwillige Feuerwehr Singen/Htwl. Abt. Friedingen
way 301858159 Freiwillige Feuerwehr Singen/Htwl. Abt. Bohlingen
way 302515288 Freiwillige Feuerwehr Singen/Htwl. Abt. Überlingen a. R.
way 349901132 Freiwilligen Feuerwehr Singen/Htwl. Abt. Hausen a. d. A.
way 349901414 Freiwilligen Feuerwehr Singen/Htwl. Abt. Schlatt u. K.
way 485114385 Werkfeuerwehr Takeda
way 604671405 Feuerwehr Singen/Htwl. Abt. Beuren a. d. A.
count 0 8
Die Werte "custom" und "popup" erfordern ebenfalls weitere Konfigurationen. Einzelheiten hierzu finden sich in der Dokumentation zu den Ausgabeformaten.
Globale "bounding box" (bbox) / Begrenzungsrahmen
Die "Bounding Box" definiert den Kartenbereich, den die Abfrage einschließt. Mit der globalen bbox-Einstellung kann ein Begrenzungsrahmen definiert werden, der dann implizit in allen Anweisungen verwendet wird, es sei denn, eine Anweisung gibt explizit eine andere bbox an. Wenn keine bbox angegeben wird, ist der Standardwert "die gesamte Welt".
In einem standardmäßigen Overpass-QL-Programm wird ein Begrenzungsrahmen mit zwei Dezimalgrad-Koordinatenpaaren in ISO 6709-Standardreihenfolge und -format konstruiert, wobei jeder Wert durch ein Komma getrennt wird. Die Werte lauten in dieser Reihenfolge:
- südlichster Breitengrad
- westlichster Längengrad
- nördlichster Breitengrad
- östlichster Längengrad
[bbox:south,west,north,east]
//Begrenzungsrahmen von Singen (Hohentwiel)
[bbox: 47.729647,8.804492,47.785943,8.9141583]
//Begrenzungsrahmen von Rio de Janeiro, Brazil
[bbox:-23,-43.3,-22.8,-43.1]
Hinweis: Wenn eine Abfrage als Wert des data=
Parameters URL-codiert ist, kann ein Begrenzungsrahmen auch als separate bbox
Variable angefügt werden. In diesem Fall ist die Reihenfolge umgekehrt (lon-lat). Dies ist die übliche Reihenfolge für OpenLayers und andere Frameworks.
Das obige Beispiel zeigt, wie es in einer URL-Kodierung verwendet wird:
/api/interpreter?data=[bbox];node[amenity=post_box];out;&bbox=8.804492,47.729647,8.914158,47.785943
Dieser findet alle Briefkästen grob in Singen/Htwl., Deutschland.
Datum
date ist eine globale Einstellung, die eine Overpass-QL-Abfrage dahingehend ändert, dass sie Speicherdaten untersucht und Ergebnisse auf der Grundlage der OpenStreetMap-Datenbank zum angegebenen Datum zurückgibt. Diese Einstellung kann zum Beispiel nützlich sein, um Daten zu rekonstruieren, die mutwillig zerstört wurden, oder einfach um ein Objekt so anzuzeigen, wie es in der Datenbank zu einem bestimmten Zeitpunkt in der Vergangenheit existierte.
Sie besteht aus dem Bezeichner date
, gefolgt von :
und einem in Anführungszeichen eingeschlossenen OpenStreetMap-Datenbank-Standarddatum nach ISO 8601 im Format JJJJ-MM-TTThh:mm:ssZ
.
In diesem Beispiel wird der Stand der Datenbank am 28. Oktober 2015 um 19:20:00 UTC abgefragt:
[date:"2021-10-28T19:20:00Z"]
In der OpenStreetMap-Datenbank gibt es keine Speicherdaten mit einem früheren Datum als 2012-09-12T06:55:00Z
(1347432900 in Epochensekunden). Dieses Datum entspricht der ersten Änderung, die in der ODbL-konformen Planetendatei enthalten ist. Die Verwendung eines früheren Datums ist technisch möglich, führt aber immer zum Stand der Datenbank ab 2012-09-12T06:55:00Z
.
Differenz zwischen zwei Daten (diff)
Mit der Einstellung diff kann die Datenbank den Unterschied zwischen zwei Abfragen zu verschiedenen Zeitpunkten ermitteln. Dies ist zum Beispiel für Deltas bei Datenbankauszügen nützlich.
Sie besteht aus dem Bezeichner diff
, gefolgt von :
, einem OpenStreetMap-Datenbank-Standarddatum nach ISO 8601 in Anführungszeichen, im Format JJJJ-MM-DTThh:mm:ssZ
, und optional einem Komma und einem zweiten Datum, das standardmäßig das aktuelle Datum ("jetzt") ist.
Beispiel:
[diff:"2012-09-14T15:00:00Z"]
Diese verarbeitet den Rest der Abfrage so, als ob sie am 14. September 2012 um 15:00 Uhr gestellt worden wäre, verarbeitet dann dieselbe Abfrage mit aktuellen Daten und gibt schließlich die Differenz zwischen den beiden Ergebnissen aus.
[diff:"2012-09-14T15:00:00Z","2012-09-21T15:00:00Z"]
Macht im Grunde dasselbe, vergleicht aber den Zustand vom 14. September mit dem vom 21. September.
Beachten Sie, dass die Ausgabe keine Zwischenversionen enthält, die zwischen dem ersten und dem letzten Zeitstempel existieren könnten. D. h. wenn es mehrere Änderungen an einem Objekt gibt, wird nur die letzte Version im angegebenen Zeitraum zurückgegeben.
Argumenten-Differenz zwischen zwei Daten (adiff)
adiff macht im Grunde dasselbe wie diff , aber für alle Elemente, die nicht im neueren Ergebnis enthalten sind, wird angezeigt, was mit ihnen passiert ist.
Wurde ein Element gelöscht, so wird sein letztes Löschdatum und die Angabe "visible=false" ausgegeben. Wenn sich ein Element so verändert hat, dass es nicht mehr zur Abfrage passt, wird sein letztes Änderungsdatum und die Angabe "visible=true" gedruckt.
Mehr Informationen finden Sie unter: Augmented Diffs.
Blockanweisung
union-Anweisung (Vereinigung)
Die Union-Blockanweisung wird als Klammerpaar geschrieben. Innerhalb des Union-Blocks kann eine beliebige Folge von Anweisungen stehen, einschließlich verschachtelter Union- und foreach-Anweisungen. Beachten Sie, dass die unten stehenden eckigen Klammern [ ... ]
einen optionalen Teil der Syntax darstellen und nicht wörtlich zu nehmen sind.
(statement_1; statement_2; …)[->.result_set];
Die union-Blockanweisung benötigt keine Eingabemenge. Sie erzeugt eine Ergebnismenge, die die Vereinigung der Ergebnismengen aller Teilanweisungen ist unabhängig davon, ob eine Teilanweisung eine umgeleitete Ergebnismenge hat oder nicht.
(node[name="Foo"]; way[name="Foo"];);
Die erste Anweisung sammelt alle Knoten, die ein Namens-Tag "Foo" haben; die zweite Anweisung sammelt alle Wege, die ein Namens-Tag "Foo" haben. Nach der union-Anweisung ist die Ergebnismenge die Vereinigung der Ergebnismengen der beiden Anweisungen. Die Ergebnismenge der union-Anweisung kann mit der üblichen Postfix-Notation umgelenkt werden.
(node[name="Foo"]; way[name="Foo"];)->.a;
Dies ist dasselbe wie im vorhergehenden Beispiel, aber das Ergebnis wird in die Variable a geschrieben.
Begrenzung: Beachten Sie, dass foreach- und print-Anweisungen keine Unterelemente des Elements union sein können.
difference-Anweisung (Unterschied / Differenz)
Die Differenz-Blockanweisung wird als Klammerpaar geschrieben. Innerhalb der Differenzanweisung müssen genau zwei Anweisungen stehen, die durch ein Minuszeichen getrennt sind.
Beachten Sie, dass die unten stehenden eckigen Klammern [ ... ]
einen optionalen Teil der Syntax darstellen und nicht wörtlich zu nehmen sind.
(statement_1; - statement_2;)[->.result_set];
Die Differenz-Blockanweisung benötigt keine Eingabemenge. Sie erzeugt eine Ergebnismenge, die alle Elemente enthält, die Ergebnis der ersten Teilanweisung sind und nicht im Ergebnis der zweiten Teilanweisung enthalten sind.
(node[name="Foo"]; - node(50.0,7.0,51.0,8.0););
Diese sammelt alle Knoten, die ein Namens-Tag "Foo" haben, aber nicht innerhalb des angegebenen Begrenzungsrahmens liegen. Die Ergebnismenge der Differenzanweisung kann mit der üblichen Postfix-Notation umgelenkt werden.
(node[name="Foo"]; - node(50.0,7.0,51.0,8.0);)->.a;
Dies ist dasselbe wie im vorangegangenen Beispiel, aber das Ergebnis wird in die Variable a geschrieben.
intersection-Anweisung (Schnittmengen)
Diese Anweisung ist keine Blockanweisung, wird aber hier aufgeführt, weil sie in engem Zusammenhang mit der oben beschriebenen Differenzanweisung steht.
Es ist auch möglich, eine Menge von Elementen zu erzeugen, die in beiden Eingabemengen vorkommen, d. h. Elemente, die in beiden Mengen enthalten sind. Dies wird im Folgenden unter dem Eingabesatz (.setname) beschrieben:
node.a.b;
if-Anweisung (wenn-Anweisung
seit Version v0.7.55 verfügbar.
Die Blockanweisung if führt ihre Substatements nur dann aus, wenn ihre Bedingung als boolesches true ausgewertet wird. Dies erlaubt es z. B., lockerere Suchbedingungen auszuprobieren, wenn strengere Suchbedingungen kein Ergebnis geliefert haben.
Die Anweisung interagiert nicht direkt mit irgendwelchen Mengen.
Die Basissyntax lautet:
if (<Evaluator>)
{
<List of Substatements>
}
Die erweitere Syntax lautet:
if (<Evaluator>)
{
<List of Substatements>
}
else
{
<List of Substatements>
}
Wobei <Evaluator> eine Bedingung und <List of Substatements> eine Liste von Subanweisungen ist.
for-each loop (for each)-Schleife
seit Version v0.7.51 verfügbar
Die foreach-Blockanweisung wird als das Schlüsselwort foreach geschrieben, gefolgt von einem Paar geschweifter {...}
Klammern. Zwischen diesen geschweiften Klammern kann eine beliebige Folge von Anweisungen stehen, einschließlich verschachtelter union- und foreach-Anweisungen.
Die foreach-Blockanweisung nimmt eine Eingabemenge entgegen und erzeugt keine eigene Ergebnismenge. Die foreach-Anweisung durchläuft den Inhalt der Eingabemenge in einer Schleife, und zwar einmal für jedes Element der Eingabemenge.
way[name="Foo"];
foreach
{
(
._;
>;
);
out;
}
Für jeden Weg, der ein Namens-Tag mit dem Wert "Foo" hat, werden die Knoten ausgegeben, die zu diesem Weg gehören, unmittelbar gefolgt von dem Weg selbst. Im Einzelnen wird die Ergebnismenge von way[name="Foo"] als Eingabemenge genommen. Dann wird für jedes Element in dieser Eingabemenge der Schleifenkörper einmal ausgeführt. Innerhalb des Schleifenkörpers wird die Vereinigung des Elements und seiner Knoten gebildet. Diese Vereinigung wird dann gedruckt.
Beachten Sie, dass während der Ausführung jede gedruckte Teilmenge in einer Iteration unabhängig von den Teilmengen ist, die in anderen Iterationen gedruckt werden, was zu doppelten Objekten in der globalen Ausgabe führen kann (es wird keine Vereinigung durch die out-Anweisung innerhalb der Schleife berechnet).
Die Eingabemenge der foreach-Anweisung kann von einer Variablen mit der üblichen Postfix-Notation übernommen werden:
foreach.a(...);
Dies führt zu einer Schleife über den Inhalt der Menge a anstelle der Standardmenge "_". Der Name der Variablen, in die das Schleifenelement eingefügt werden soll, kann durch Hinzufügen eines Postfixes unmittelbar vor der öffnenden Klammer gewählt werden.
foreach->.b(...);
Dadurch wird das Element, über das eine Schleife laufen soll, in die Variable b eingefügt. Ohne diese Anweisung fügt die foreach-Anweisung die Elemente in keine Menge ein. Beispiel für sowohl Eingabe- als auch Schleifenmenge geändert:
foreach.a->.b(...);
Beachten Sie, dass die Eingabemenge durch die Schleife nicht verändert werden kann. Alle Aktualisierungen der Menge werden für die weitere Verwendung gespeichert. Die Anzahl der Iterationen wird dadurch jedoch nicht verändert.
for-Anweisung
seit Version 0.7.55 verfügbar
Die Blockanweisung for unterteilt ihre Eingabe in Teilmengen und führt alle Anweisungen im Schleifenkörper für jede Teilmenge einmal aus. Die Eingabemenge wird wie folgt aufgeteilt: Für jedes Element wird der angegebene Evaluator ausgewertet und Elemente mit gleichem Wert werden zusammengefasst. Zu Beginn jeder Schleifenausführung wird die Ausgabemenge mit der entsprechenden Teilmenge gefüllt.
Die Basissyntax lautet:
for (<Evaluator>)
{
<List of Substatements>
}
Die Ein- und Ausgabemenge kann zwischen for und der öffnenden Klammer angegeben werden, d. h. Sie setzen die Eingabemenge
for.<Name of Input Set> (<Evaluator>)
{
<List of Substatements>
}
oder das Ausgangsset
for->.<Name of Output Set> (<Evaluator>)
{
<List of Substatements>
}
oder beide
for.<Name of Input Set>->.<Name of Output Set> (<Evaluator>)
{
<List of Substatements>
}
Innerhalb der Schleife ist der Wert des Evaluators über die Eigenschaft val der Ausgabemenge verfügbar. D. h. mit
<Output Set>.val
kann man auf den Wert des Ausdrucks für diese Schleife zugreifen. Mit dem speziellen Evaluator keys() kann man eine Schleife über alle in der Teilmenge vorhandenen Schlüssel ziehen. Die jeweilige Teilmenge für jeden Schlüssel sind die Elemente, die diese Schlüsselmenge haben. Anders als bei einem gewöhnlichen Auswerter sind die Mengen in diesem Fall nicht voneinander verschieden.
complete-Anweisung
seit Version v0.7.55 verfügbar
Die Blockanweisung durchläuft ihre Substatements in einer Schleife, bis sich die Ergebnisse der Schleife stabilisieren. Dies ermöglicht es, eine Gruppe von lose oder eng miteinander verbundenen Elementen zu verfolgen, wie z. B. alle Abschnitte eines Weges mit demselben Namen oder ein System von Nebenflüssen.
Die Anweisung liefert die kumulierten Elemente in ihrer Ausgabemenge sowohl zu Beginn jeder Schleifenausführung als auch als Ausgabe der gesamten Anweisung.
Die Elemente werden aus der Eingabemenge vor Eintritt in die Schleife und erneut aus der Eingabemenge am Ende der Schleife akkumuliert. Wenn die Eingabemenge zusätzliche Elemente enthält, wird die Schleife erneut ausgeführt.
Die Basissyntax der complete-Anweisung lautet:
complete
{
<List of Substatements>
}
Wobei <Liste der Substatements> eine Liste von Substatements ist. Die maximale Anzahl der Schleifen beträgt standardmäßig 4096. Dieser Wert kann für diese Schleife auf einen beliebigen Wert zwischen 1 und 1048576 geändert werden. Setzen Sie dazu den gewünschten Wert in Klammern hinter das Schlüsselwort "complete":
complete(<Number>)
{
<List of Substatements>
}
Die Eingabe- und Ausgabemenge kann zwischen der vollständigen und der öffnenden Klammer angegeben werden, d. h. Sie setzen die Eingabemenge
complete.<Name of Input Set>
{
<List of Substatements>
}
oder den Ausgangssatz
complete->.<Name of Output Set>
{
<List of Substatements>
}
oder zwischen beide
complete.<Name of Input Set>->.<Name of Output Set>
{
<List of Substatements>
}
bzw.
complete(<Number>).<Name of Input Set>->.<Name of Output Set>
{
<List of Substatements>
}
retro-Anweisung
seit Version v0.7.55 verfügbar
Die Blockanweisung führt ihre Substatements rückwirkend zu dem im Evaluator angegebenen Datum aus.
Es ist derzeit nicht definiert, ob der Inhalt von Variablen von außerhalb des Blocks innerhalb des Blocks verfügbar ist und umgekehrt. Künftige Versionen werden möglicherweise nur abgeleitete Elemente übertragen, die Umgebungen vollständig getrennt halten oder Elemente von einem Zeitpunkt zum anderen umwandeln.
Die Basissyntax lautet:
retro (<Evaluator>)
{
<List of Substatements>
}
Dabei ist <Evaluator> ein Evaluator und <List of Substatements> eine Liste von Substatements.
compare-Anweisung
seit Version v0.7.55 verfügbar.
Die Anweisung compare berechnet den Unterschied zwischen den Daten zweier Zeitstempel. Dieser Unterschied kann aus beliebigen Elementen bestehen, aber auch nur aus solchen mit bestimmten Eigenschaften.
Die Anweisung kann einen Block von Substatements enthalten. Der Block von Unteranweisungen wird nach der Berechnung des Unterschieds im zweiten Durchlauf ausgeführt, einmal für den alten Zeitstempel und dann noch einmal für den neuen Zeitstempel. Dadurch können zusätzliche Berechnungen auf der Grundlage der diff-Ergebnisse durchgeführt werden.
Die Anweisung kann nur im diff-Modus verwendet werden. In anderen Modi ist ihr Verhalten undefiniert, und in zukünftigen Versionen könnte es ein Syntaxfehler sein, sie an anderer Stelle zu verwenden.
Im ersten Durchlauf einer diff-Abfrage gibt sie eine leere Menge zurück. Im zweiten Durchlauf einer diff-Abfrage gibt sie die Differenz der Elemente zurück. Wenn die Anweisung einen Evaluator als Argument erhält, werden nur die Elemente zurückgegeben, die in beiden Zeitstempeln unterschiedliche Werte haben. Wenn das Element auf einem der Zeitstempel nicht vorhanden ist, wird sein Wert als leere Zeichenkette betrachtet. Derzeit besteht der einzige Zweck einer solchen Differenz darin, sie in eine Ausgabeanweisung einzuspeisen.
Die Basissyntax lautet
compare();
Darüber hinaus kann ein Eingangs- und/oder Ausgangsset angegeben werden:
.<Set> compare()->.<Set>;
Mit dem Evaluator wird die Syntax zu
compare(delta:<Evaluator>);
bzw.
.<Set> compare->.<Set>(delta:<Evaluator>);
In allen Syntaxvarianten kann ein Block von Substatements angehängt werden:
compare()
{
<List of Substatements>
};
bzw.
.<Set> compare(delta:<Evaluator>)->.<Set>;
{
<List of Substatements>
};
Alleinstehende Anweisungen
out-Anweisung
Die out-Anweisung steht in keinem Zusammenhang mit der globalen Einstellung out:. Die Syntax sollte nicht vermischt werden.
Die out-Anweisung gibt den Inhalt eines Sets aus. Sie wird fast immer in jeder Overpass-QL-Abfrage verwendet.
out count;
ist eine Anweisung, die nur die Gesamtzahl der Elemente in der Eingabemenge nach Typ (Knoten, Wege, Beziehungen, Flächen) ausgibt. Sie kann nicht mit etwas anderem kombiniert werden.
Die einfachste Form der out-Anweisung hat mehrere implizite Standardwerte.
out; //einfachste Form der out-anweisung
._ out body; // dieselbe Bedeutung wie oben
Der Standardeingabesatz _
kann überschrieben werden, indem der out-Anweisung ein Punkt und ein benannter Satzname vorangestellt wird.
.mystuff out; // Ausgabe der benannten Menge 'mystuff'
Die out-Anweisung kann mit einer beliebigen Anzahl von Parametern konfiguriert werden, die durch Leerzeichen getrennt zwischen dem Wort out und dem Semikolon angehängt werden.
Erlaubte Werte, in beliebiger Reihenfolge, sind:
- Einer der folgenden für den Ausführlichkeitsgrad der Ausgabe; der Standardwert ist body:
- ids: Gibt nur die IDs der Elemente in der Menge aus.
- skel: Druckt die für die Geometrie erforderlichen Mindestinformationen:
- für nodes: id und Koordinaten
- für ways: id und die ids der Mitgliedsknoten
- für relations: id der Relation sowie id, Typ und Rolle aller ihrer Mitglieder.
- body: Geben Sie alle Informationen aus, die zur Verwendung der Daten erforderlich sind. Dies sind auch die Tags für alle Elemente und die Rollen für die Relationenmitglieder.
- tags: Es werden nur die IDs und Tags für jedes Element ausgegeben, nicht aber die Koordinaten oder Mitglieder.
- meta: Druckt alles, was über die Elemente bekannt ist. meta enthält alles, was von body für jedes OSM-Element ausgegeben wird, sowie die Version, die Changeset-ID, den Zeitstempel und die Benutzerdaten des Benutzers, der das Objekt zuletzt berührt hat. Die Metadatenattribute abgeleiteter Elemente fehlen auch bei abgeleiteten Elementen.
- noids: Mit dem Modifikator noids können alle ids in der Anweisung weggelassen werden. Hinweis: Seit dem 28.12.2021 gibt es einen Fehler in Overpass Turbo, der die Verwendung von noids verhindert
- Einer der folgenden Modifikatoren für geografische Informationen; standardmäßig wird keiner ausgegeben:
- geom: Fügt die vollständige Geometrie zu jedem Objekt hinzu. Dies fügt jedem Knoten, jedem Knotenelement eines Weges oder einer Beziehung Koordinaten hinzu und fügt eine Folge von "nd"-Elementen mit Koordinaten zu allen Beziehungen hinzu.
- bb: Fügt nur den Begrenzungsrahmen jedes Elements zum Element hinzu. Für Knoten ist dies äquivalent zu "geom". Bei Wegen ist es der umschließende Begrenzungsrahmen aller Knoten. Für Relationen ist es der umschließende Begrenzungsrahmen aller Knoten- und Wegeglieder, Relationen als Mitglieder haben keine Wirkung.
- center: Dies fügt nur den Mittelpunkt des oben genannten Begrenzungsrahmens zu Wegen und Relationen hinzu. Hinweis: Es ist nicht garantiert, dass der Mittelpunkt innerhalb des Polygons liegt (Beispiel).
Own
object type |
Own
object ID |
For nodes:
Own coordinates |
For ways: IDs of
member nodes |
For relations:
ID, type, role of members |
Own
tags |
Timestamp, Version,
Changeset, User, User ID | |
---|---|---|---|---|---|---|---|
ids | ja | ja | |||||
skel | ja | ja | ja | ja | ja | ||
body | ja | ja | ja | ja | ja | ja | |
tags | ja | ja | ja | ||||
meta | ja | ja | ja | ja | ja | ja | ja |
- Ein Begrenzungsrahmen im Format "(Süd,West,Nord,Ost)" wird normalerweise mit dem Verbositätstyp geom verwendet. In diesem Fall werden nur Elemente erzeugt, deren Koordinaten innerhalb dieses Begrenzungsrahmens liegen. Bei Wegsegmenten werden auch die ersten oder letzten Koordinaten außerhalb dieses Begrenzungsrahmens erzeugt, um korrekt geformte Segmente zu ermöglichen. Diese Einschränkung hat keine Auswirkungen auf abgeleitete Elemente ohne Geometrie.
- Für die Sortierreihenfolge kann eine der folgenden Angaben gemacht werden. Standard ist asc:
- asc: Sortieren nach Objekt-ID.
- qt: Sortierung nach Quartil-Index. Dies ist grob geographisch und wesentlich schneller als die Sortierung nach ids. Abgeleitete Elemente, die durch die make- oder convert-Anweisungen ohne Geometrie erzeugt wurden, werden separat gruppiert und nur nach id sortiert.
- Eine nicht negative ganze Zahl, die die Ausgabe auf maximal die angegebene Zahl begrenzt. Wird sie nicht angegeben, wird die gesamte Menge ausgegeben.
item-Anweisung
Die eigenständige Positionsabfrage besteht nur aus einem Präfix für die Eingabemenge. Sie nimmt die durch ihr Präfix angegebene Eingabemenge. Dies ist insbesondere für Vereinigungsanweisungen nützlich: Sie gibt ihre Eingabemenge als (Teil des) Ergebnisses der Vereinigungsanweisung wieder. Die häufigste Verwendung ist die Verwendung mit der Standard-Eingabegruppe _
, wie unten gezeigt.
._;
Die folgende union-Anweisung verbindet alle Elemente in der Standardeingabegruppe mit dem Ergebnis von recurse down der Standardeingabegruppe. Das Ergebnis wird dann an die Standardeingabe zurückgegeben und überschreibt diese.
(._; >;);
Aber natürlich sind auch andere Sets möglich:
.a;
Aber natürlich sind auch andere Sets möglich:
(.a; .a >;);
Hinweis: Nachfolgende Anweisungen in einer Union-Anweisung werden von der item-Anweisung nicht beeinflusst. Insbesondere fügt .a;
den Inhalt der Eingabemenge nicht zu _
, der Standard-Eingabemenge, hinzu.
Die item-Anweisung kann auch als Filter verwendet werden.
Recurs up (<)-Anweisung
Die eigenständige Abfrage recurse up wird als einzelnes less than-Symbol, "<", geschrieben.
Sie nimmt eine Eingabemenge an und erzeugt eine selbige, welche sich wie folgt zusammensetzt:
- aus allen Wegen, die einen Knoten haben, der in der Eingabemenge erscheint; plus
- aus allen Relationen, die einen Knoten oder Weg haben, der in der Eingabemenge vorkommt; plus
- aus allen Relationen, die einen Weg haben, der in der Ergebnismenge vorkommt
Beispiel:
<;
Die Eingabemenge der Anweisung recurse up kann mit der üblichen Präfix-Notation gewählt werden:
.a <;
Die Ergebnismenge der Anweisung recurse up kann mit der üblichen Postfix-Notation umgekehrt werden:
< ->.b;
Natürlich können Sie auch beides ändern:
.a < ->.b;
Recurs up relations (<<)-Anweisung
Die eigenständige Anweisung recurse up relations hat eine ähnliche Syntax wie die Anweisung recurse-up, wird aber als double less than geschrieben. Insbesondere können Sie die Eingabe und/oder die Ergebnismenge mit der gleichen Notation wie bei der eigenständigen Abfrage recurse up ändern. Zusätzlich zu den recurse-up-Ergebnissen werden die gefundenen Relationen mit Backlinks weiterverfolgt, bis alle Relationen enthalten sind, die auf ein Objekt in der Eingabe- oder Ergebnismenge zeigen. Genau genommen gibt die eigenständige Abfrage recurse up relations den transitiven und reflexiven Abschluss der Mitgliedschaft rückwärts zurück.
Beachte: Wird die Abfrage auf einen Knoten oder einen Weg angewendet, werden die Eltern dieses Knotens oder Weges wie erwartet zurückgegeben. Bei einer Beziehung werden sowohl die Beziehung selbst als auch ihre Eltern zurückgegeben. Wenn du nur die Eltern willst, kannst du das tun: (<<; - rel._;);
stattdessen.
Syntax:
<<;
Recurs down (>)-Anweisung
Die eigenständige recurse down-Abfrage wird als ein einziges "größer als" geschrieben.
Sie nimmt eine Eingabemenge entgegen und produziert eine Ausgabemenge, die sich wie folgt zusammensetzt:
- alle Knoten, die Teil eines Weges sind, der in der Eingabemenge erscheint; plus
- alle Knoten und Wege, die Mitglieder einer Beziehung sind, die in der Eingabemenge vorkommt; plus
- alle Knoten, die Teil eines Weges sind, der in der Ergebnismenge vorkommt
Insbesondere können Sie die Eingabe- und/oder Ergebnismenge mit der gleichen Notation wie bei der eigenständigen Abfrage recurse up ändern.
Beispiel:
>;
Recurs down relations (>>)-Anweisung
Die recurse down relations-Anweisung hat eine ähnliche Syntax wie die recurse down-Anweisung , aber sie wird als doppeltes größer als (>>) geschrieben. Insbesondere können Sie die Eingabe- und/oder Ergebnismenge mit der gleichen Notation wie bei der eigenständigen recurse-down-Abfrage ändern. Sie folgt den Mitgliedschaftsverknüpfungen, einschließlich der Knoten, so lange, bis für jedes Objekt in der Eingabe- oder Ergebnismenge alle Mitglieder dieses Objekts auch in der Ergebnismenge enthalten sind. Genau genommen gibt die Anweisung recurse down relations den transitiven und reflexiven Abschluss der Mitgliedschaft zurück.
Syntax:
>>;
Abfrage für Gebiete (is_in)-Anweisung
Die eigenständige is_in-Abfrage gibt die Flächen und geschlossenen Wege zurück, die sich über die angegebenen Koordinaten, und wenn angegeben oder über einen oder mehrere Knoten aus der Eingabemenge (wenn keine Koordinaten angegeben sind). Sie nimmt entweder eine Eingabemenge oder eine Koordinate und erzeugt eine Ergebnismenge. Die Ergebnisse sind alle Bereiche, die mindestens einen der Knoten aus der Eingabemenge oder die angegebene Koordinate enthalten. is_in kann nicht direkt mit einem der Overpass-QL-Filter verwendet werden. Für die Filterung des is_in-Ergebnisses ist eine weitere Abfrage erforderlich (siehe unten). Hinweis: Die unten gezeigten eckigen Klammern [ ] kennzeichnen optionale Teile und sind nicht Teil der zu gebenden Syntax.
[.input_set] is_in [-> .result_set];
is_in(latitude, longitude) [-> .result_set];
In seiner kürzesten Form nimmt es seine Eingabemenge als die zu suchenden Orte. Beispiel:
is_in;
Die Eingabemenge kann mit der üblichen Präfix-Notation gewählt werden:
.a is_in;
Die Ergebnismenge kann mit der üblichen Postfix-Notation umgekehrt werden:
is_in->.b;
Natürlich können Sie auch beides ändern:
is_in(50.7,7.2)->.b;
Die Erstellung von Gebieten hängt von einigen spezifischen Extraktionsregeln ab, es gibt kein Gebiets-Gegenstück für jede einzelne OSM-Relation! Für weitere Details siehe areas.osm3s und die Areas Wiki Seite. Um das von is_in zurückgegebene Ergebnis nach weiteren Filterkriterien zu filtern, ist eine zusätzliche Abfrage erforderlich:
is_in(48.856089,2.29789);
area._[admin_level="2"]; // ._ steht für das Standardeingabeset, das alle von ''is_in'' zurückgegebenen Bereiche enthält
timeline-Anweisung
seit Version v0.7.55 verfügbar
Die timeline -Anweisung nimmt type und id eines Objekts und optional version als Argumente entgegen. Sie gibt dann eine abgeleitete Struktur zurück, die die Metainformationen der angegebenen Version enthält. Wenn keine Version angegeben wird, wird ein Objekt für jede bekannte Version zurückgegeben. Jedes dieser Objekte hat die Tags
- ref
- reftype
- refversion
um den Verweis zu identifizieren. Darüber hinaus enthält es die Tags created und expired, die die entsprechenden Zeitstempel enthalten.
Die Basissyntax lautet:
timeline(<Type>, <Ref>);
bzw.
timeline(<Type>, <Ref>, <Version>);
wobei <Typ> eines der drei Literale Knoten, Weg oder Beziehung ist. Darüber hinaus kann eine Ausgabemenge <Set> angegeben werden:
timeline(<Type>, <Ref>)->.<Set>;
bzw.
timeline(<Type>, <Ref>, <Version>)->.<Set>;
local-Anweisung
seit Version v0.7.55 verfügbar
Die local-Anweisung wandelt die gegebene Eingabe in die lokalisierte Darstellung von OSM-Daten um. Der Output-Parameter steuert, welche Klassen von Daten enthalten sind. Ohne einen Typ-Parameter liefert local Geometrie und Tags. Dies ist ein Objekt pro getaggten Knoten plus ein Objekt pro Teil eines Weges plus ein Objekt pro Teil einer Beziehungsgeometrie.
Mit dem Typparameter "ll" liefert es zusätzlich lose Objekte. Das ist ein Objekt pro Weg mit Tags, aber ohne Knotenelemente und ein Objekt pro Relationsteil einer beliebigen Relation ohne Knoten- oder Wegelemente.
Mit dem Typparameter "llb" liefert er noch mehr Daten: Er liefert die Objekte, die die OSM-Element-IDs mit den vorgenannten Objekten verknüpfen.
Die Basissyntax lautet:
local <Type>
wobei <Typ> leer, "ll" oder "llb" ist. Sie können auch andere Eingabe- und/oder Ausgabesätze als "_" angeben:
.<Set> local <Type> ->.<Set>
Der erste Satz ist der Eingabesatz, der zweite ist der Ausgabesatz.
convert-Anweisung
seit Version v0.7.54 verfügbar
Die Anweisung make erzeugt eine Menge, die ein einziges Ausgabeelement enthält. Ihre Ausgabemenge ist immer die Standardmenge. Die Anweisung hat keine Eingabemenge.
Der Inhalt des Ausgabeelements wird durch die Parameter der Anweisung gesteuert. Die Anweisung kann keine Geometrie (Lat/Lon-Informationen) auf ihrem Ausgabeelement erzeugen.
Die Basissyntax lautet
convert <Type> <Liste von Tags>
wobei<Liste von Tags>
eine durch Komma getrennte Liste von Elementen ist, von denen jedes eines der folgenden sein muss
<Key> = <Evaluator>
::id = <Evaluator>
:: = <Evaluator>
!<Key>
Der erste Parameter, <Type>
, muss einen festen Wert haben. <Type>
muss mit einem Buchstaben beginnen, und jedes folgende Zeichen kann entweder ein alphanumerisches Zeichen oder ein "_" sein. <Type> steuert den Typ eines jeden Ausgabeelements.
Die folgenden Parameter werden verwendet, um eine beliebige Anzahl von Tags für jedes Ausgabeelement festzulegen.
In der folgenden Beschreibung wird jeder <Evaluator>
mit einem Eingabeelement im Kontext ausgewertet. Siehe hierzu Overpass_API/Overpass_QL#Element_Dependent_Operators.
Für jedes Element in der Eingabemenge:
<Key> = <Evaluator>
fügt dem entsprechenden Ausgabeelement mit dem Wert<Auswerter>
, das mit dem Schlüssel<Key>
ausgewertet wird, einen Schlüssel hinzu welcher für den für den generischen Auswerter relevant ist..
::id = <Evaluator>
setzt die ID des entsprechenden Ausgabeelements auf den Wert von<Evaluator>
:: = <Evaluator>
ist äquivalent zu<Key> = <Evaluator>
für jeden Schlüssel im Eingabeelement. Dies wird als allgemeiner Schlüsselmechanismus bezeichnet.
!<Key>
verhindert, dass der Schlüssel<Key>
im Ausgabeelement durch den generischen Schlüsselmechanismus gesetzt wird.
Schlüssel, die explizit mit der Syntax <Key> = <Evaluator>
gesetzt werden, haben Vorrang vor Schlüsseln, die mit dem generischen Schlüsselmechanismus gesetzt wurden.
Wenn Sie keine ID festlegen, wird eine eindeutige ID aus einem globalen aufsteigenden Zähler zugewiesen.
Es ist ein Syntaxfehler, denselben Schlüssel zweimal mit den Elementen <Key> = <Evaluator>
oder !<Key>
zu setzen.
make-Anweisung
seit Version v0.7.54 verfügbar
Die Anweisung make erzeugt eine Menge, die ein einziges Ausgabeelement enthält. Ihre Ausgabemenge ist immer die Standardmenge. Die Anweisung hat keine Eingabemenge. Der Inhalt des Ausgabeelements wird durch die Parameter der Anweisung gesteuert. Die Anweisung selbst kann keine Geometrie (Lat/Lon-Informationen) auf ihrem Ausgabeelement erzeugen.
Die Basissyntax lautet
make <Type> <List of Tags>
Wobei <List of Tags>
eine durch Kommata getrennte Liste von Elementen ist, von denen jedes eines der folgenden sein muss.
<Key> = <Evaluator>
::id = <Evaluator>
<Set>:: = <Evaluator>
!<Key>
Beachten Sie den Unterschied zur Syntax der convert-Anweisung. In der make-Anweisung erfordert der generische Schlüsselmechanismus einen expliziten Eingabesatz. Der erste Parameter, <Type>
, muss einen festen Wert haben. <Type>
muss mit einem Buchstaben beginnen und kann dann alphanumerische Zeichen und "_" enthalten. <Typ>
steuert den Typ der einzelnen Ausgabeelemente. Die folgenden Parameter werden verwendet, um eine beliebige Anzahl von Tags für das Ausgabeelement festzulegen. Eine Beschreibung der einzelnen Parameter finden Sie weiter unten. Beachten Sie, dass es im Gegensatz zu einer Konvertierungsanweisung kein Element im Kontext für die Evaluatoren gibt, so dass elementabhängige Operatoren nicht verwendet werden können.
<Key> = <Evaluator>
fügt dem Ausgabeelement einen Schlüssel mit dem Wert<Evaluator>
hinzu, der mit dem Schlüssel<Key>
ausgewertet wird welcher für den generischen Auswerter relevant ist.::id = <Evaluator>
setzt die id des Ausgabeelements auf den Wert von <Auswerter><Set>:: = <Evaluator>
ist äquivalent zu<Key> = <Evaluator>
für jeden Schlüssel, der mindestens einmal in einem Element in<Set>
erscheint. Dieses Element wird als allgemeiner Schlüsselmechanismus bezeichnet.!<Key>
verhindert, dass der Schlüssel<Key>
im Ausgangselement durch den generischen Schlüsselmechanismus gesetzt wird.
Schlüssel, die explizit mit der Syntax <Key> = <Evaluator>
gesetzt werden, haben Vorrang vor Schlüsseln, die mit dem generischen Schlüsselmechanismus gesetzt wurden. Wenn Sie keine ID setzen, wird eine eindeutige ID aus einem globalen aufsteigenden Zähler zugewiesen. Es ist ein Syntaxfehler, denselben Schlüssel zweimal mit den Elementen <Key>=<Evaluator>
oder !<Key>
zu setzen. Außerdem kann höchstens ein generischer Schlüssel gesetzt werden.
Query-Anweisung
Die wichtigste Anweisung ist die Abfrageanweisung. Es handelt sich dabei nicht um eine einzelne Anweisung, sondern sie besteht aus einer der Typangaben node, way, relation (oder kurz rel), derived, area oder nwr (kurz für "nodes, ways or relations"), gefolgt von einem oder mehreren Filtern. Die Ergebnismenge ist die Menge aller Elemente, die die Bedingungen aller Filter erfüllen.
Beispiel:
// ein Filter
node[name="Foo"];
way[name="Foo"];
rel[name="Foo"];
nwr[name="Foo"];
nw[name="Foo"];
nr[name="Foo"];
wr[name="Foo"];
derived[name="Foo"];
area[name="Foo"];
// mehrere Filter
node[name="Foo"][type="Bar"];
Hier sind node, way, rel, nwr, derived und area die Typspezifizierer. [name="Foo"] bzw. [type="Bar"] ist der Filter und das Semikolon beendet die Anweisung. Die Abfrageanweisung hat eine Ergebnismenge, die mit der üblichen Postfix-Notation geändert werden kann.
node[name="Foo"]->.a;
Die einzelnen Filter können zusätzlich Eingabesätze haben, die in den einzelnen Filtern geändert werden können. Bitte sehen Sie hierzu bei dem jeweiligen Filter nach.
Query Filter-Anweisung
Der Abfragefilter kann als Bedingung zu einer Abfrageanweisung hinzugefügt werden. Er hat einen Evaluator als Argument und lässt nur die Elemente durch, für die der Ausdruck den booleschen Wert true liefert. Im Moment kann der Abfragefilter nicht die einzige Bedingung in einer Abfrage sein. Dies ist auf Implementierungsgründe zurückzuführen und wird sich in zukünftigen Versionen ändern. Es ist technisch möglich, mehrere Abfragefilter in einer einzigen Abfrage zu haben. Dies ist jedoch nicht sinnvoll: Ihre Evaluatoren können mit einer Konjunktion in einem einzigen Abfragefilter kombiniert werden. Dieser hat die gleiche Semantik und ist schneller.
Seine Syntax lautet
(if: <Evaluator>)
Das Leerzeichen ist optional.
(if:<Evaluator>)
Filter
tag-Filter (hast-kv)
Der has-kv-Filter wählt alle Elemente aus, die ein Tag mit einem bestimmten Wert haben oder nicht haben. Er unterstützt die OSM-Grundtypen node, way und relation sowie den erweiterten Typ area. Er hat keine Eingabemenge. Wie bei allen Filtern wird die Ergebnismenge durch die gesamte Anweisung angegeben, nicht durch den einzelnen Filter. Alle Varianten bestehen aus einer öffnenden Klammer, dann einem Stringliteral in einfachen oder doppelten Anführungszeichen. Danach unterscheiden sich die Varianten. Alle Varianten enden mit einer schließenden Klammer. Besteht das Zeichenfolgenliteral nur aus Buchstaben, können die Anführungszeichen weggelassen werden.
"ist gleich"- filter (=, !=)
Die häufigste Variante wählt alle Elemente aus, bei denen das Tag mit dem angegebenen Schlüssel einen bestimmten Wert hat. Diese Variante enthält nach dem Schlüsselliteral ein Gleichheitszeichen und ein weiteres Literal, das den Wert enthält. Beispiele, alle gleichwertig:
node[name=Foo];
node[name='Foo'];
node[name="Foo"];
node['name'="Foo"];
node["name"="Foo"];
node["name"='Foo'];
Wenn Sie eine Ziffer, ein Leerzeichen oder etwas anderes im Wert haben, brauchen Sie einfache oder doppelte Anführungszeichen:
node[name="Foo Street"];
node["name:fr"="Rue Feau"];
Die Abfrage nach leeren Werten ist mit dem Gleichheitswertoperator nicht möglich. Dies kann nur durch die Verwendung eines regulären Ausdrucks erreicht werden:
node[power=""]; // nicht unterstützt
node[power~"^$"]; // stattdessen reguläre Ausdrücke verwenden
Auch die Abfrage von leeren Schlüsselwerten ist mit dieser Art von Schlüssel-Wert-Abfrage nicht möglich und muss über reguläre Ausdrücke ausgedrückt werden.
node[~"^$"~"."]; // finde Knoten mit leerem Schlüssel ("") und irgendeinem Wert
NB: Der Überbrückungs-Turbo-Assistent verfügt bereits über eine Logik zur automatischen Umwandlung von ""="" entsprechend.
vorhanden-Filter (exists)
Die zweite Variante wählt alle Elemente aus, die ein Tag mit einem bestimmten Schlüssel und einem beliebigen Wert haben. Sie enthält nichts zwischen dem Schlüsselliteral und der schließenden Klammer:
node["name"];
node['name'];
node[name];
"existiert nicht"-Filter (not exists)
seit Version v0.7.53 verfügbar
Diese Variante wählt alle Elemente aus, die kein Tag mit einem bestimmten Schlüssel und einem beliebigen Wert haben.
node[!"name"];
node[!'name'];
node[!name];
In früheren Versionen musste 'not exists' als node["name"!~".*"];
geschrieben werden.
Wert entspricht einem regulären Ausdruck (~, !~)
Schlüssel/Wert stimmt mit regulärem Ausdruck überein (~"Schlüssel regex"~"Wert regex")
Begrenzungsrahmen (bounding box)
Der Begrenzungsrahmen-Filter wählt alle Elemente innerhalb des rechteckigen Rahmens aus.
(Süd,West,Nord,Ost)
Der Filter besteht aus einer öffnenden und schließenden runden Klammer. Innerhalb der Klammern stehen vier Dezimalzahlen (mit Punkt als Dezimaltrennzeichen), die durch Komma getrennt sind. Die Dezimalzahlen bestimmen das Rechteck des Begrenzungsrahmens durch die Breiten- und Längengrade.
Wie bei allen Filtern wird die Ergebnismenge nicht allein durch den Filter bestimmt, sondern durch das gesamte Statement.
Beipiel:
node(50.6,7.0,50.8,7.3);
siehe auch: #Globale "bounding box" (bbox) / Begrenzungsrahmen
Recurse-Filter (n, w, r, bn, bw, br)
Der recurse-Filter wählt alle Elemente aus, die Mitglieder eines Elements aus der Eingabemenge sind oder ein Element der Eingabemenge als Mitglied haben, je nach dem angegebenen Parameter.
Eingabesatz-Filter
element-id-Filter
Der id-query Filter wählt das Element des gegebenen Typs mit der gegebenen id aus. Er unterstützt neben den OSM-Datentypen node, way, und relation auch den Typ area.
Er hat keine Eingabemenge. Wie bei allen Filtern wird die Ergebnismenge durch die gesamte Anweisung angegeben, nicht durch den einzelnen Filter.
Sie besteht aus einer öffnenden Klammer. Dann folgt eine positive ganze Zahl. Der Filter wird mit einer schließenden Klammer abgeschlossen.
Beispiele:
node(1);
way(1);
rel(1);
area(1);
Die Area-IDs werden von einem bestehenden OSM-way abgeleitet, indem 2400000000 zu seiner OSM-ID oder im Falle einer Beziehung 3600000000 addiert werden. Hinweis: Aufgrund des großen OSM-Datenwachstums müssen diese Werte möglicherweise 2022 oder 2023 geändert werden, um Überschneidungen zu vermeiden (!) Ihr solltet die Funktion map_to_area verwenden, um zu vermeiden, dass Ihr diese Berechnungen manuell durchführen müsst und von fest kodierten Konstanten in eurer Abfrage abhängig seid.
Die Erstellung von Areas unterliegt einigen Extraktionsregeln, d.h. nicht alle Wege/Relationen haben ein Gegenstück in Form eines Gebiets. Siehe areas.osm3s für Details.
Seit Version 0.7.54 unterstützt der id-query Filter auch mehrere Werte. Um Konflikte mit dem Bounding-Box-Filter zu vermeiden, muss in diesem Fall ein neues obligatorisches Präfix id: verwendet werden.
node(id:1000,1001,1002,1003,1004,1005);
way(id:3998029,3998240,4065354,4065364,4065392,4065421);
rel(id:10815,10816);
area(id:1234);
Hinweis zur Leistung: Versucht mehrere id-Abfragen in einer Anweisung zu bündeln, d. h. anstatt (way(3998029);way(3998240);way(4065354);) zu schreiben, verwendet way(id:3998029,3998240,4065354);
Relativ zu anderen Elementen
polygon-Filter (poly)
neuere Daten (newer)
nach Änderungsdatum (changed)
nach Benutzer (user, uid)
nach Gebiet (area)
area povit (povit)
Abfrage mit Bedingungen (if.)
Bewerter / Evaluatoren
Evaluatoren sind Bausteine, die bei der Ausführung einen Wert ergeben. Welcher der Evaluatoren sinnvoll ist, hängt vom jeweiligen Kontext ab.
Zeichenfolgen
Zeichenfolgen fixer Werte
Element in Abhängigkeit des Operators
Tag-Wert und generische Wertoperatoren
Alle Schlüsselauswerter
Operatoren für Metadaten
Zählung von Elementeigenschaften
Aggregatoren pro Mitglied
pro Mitglied
pro Scheitelpunkt
Zugehörigkeitsabhängige Funktionen von Elementen
Position des Elementes
Verweis auf das Element
Rolle des Elements
Winkel eines Weges an der Position eine Elementes
Geometriebezogenene Operatoren
geschlossene
Geometrie
Länge
Längen- und Breitengrad
Punktauswerter
Linienauswerter
Polygonauswerter
Aggregatoren
Vereinigungen und Sätze
Min und Max
Summe
Statistische Zählung
Vereinigung von Geometrien
Unäre Operatoren
Boolean´sche Negation
Unäre Minuszeichen
Binäre Operatoren
Boolesche Disjunktion
Boolesche Konjunktion
Gleichheit und Ungleichheit
Kleiner, Kleiner-Gleich, Größer und Größer-Gleich
Plus und Minus
Zeit und Differenz
Der ternäre Operator
Zeichenfolge Endomorhismen
Number Check, Normalizer and Suffix
Datumsprüfung und Normalisierer
Geometrischer Endomorhismus
Zentrum
Spur
Hülle
Liste dargestellter Mengenoperatoren
Listenrepräsentierte mengentheoretische Operatoren
Irs_in
Irs_isect
Irs_union
Liste der statistischen Operatoren der repräsentierten Menge
Irs_min
Irs_max
Schlüssel-Werte-Auswerter festlegen
Spezielle Syntaxen
Kommentare
Erweiterte Overpass-turbo Abfragen
Escape
Diverse Merkmale
Karte way/relation zu area (map_to_area)
Hinweise
Siehe auch