DE:Overpass API/Language Guide
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 site
![]() | Dieser Artikel ist eine deutsche Übersetzung des Originals (in der Regel auf Englisch), aber der Inhalt scheint unvollständig oder nicht aktuell zu sein! Bitte aktualisiere diese Übersetzung, wenn möglich. |
![]() | This wiki page doesn't cover some of the more recent Overpass API features. For a comprehensive list of features, please refer to the Overpass QL wiki page. |
Hintergrund und Grundidee
Die Overpass API erlaubt es, gezielt OSM-Daten nach eigenen Kriterien zu finden. Dafür steht eine eigens entworfene Abfragesprache bereit.
Der grundlegenden Aufbau der Overpass API ist, dass Auflistungen von OSM-Daten (nodes, ways...) durch nacheinander ausgeführte Befehle generiert und modifiziert werden. Als Beispiel listet die folgende einfache Abfrage alle nodes in einer bestimmten bounding box (Begrenzungsrahmen) auf und gibt das Ergebnis dann aus:
node(50.745,7.17,50.75,7.18);out;
Du kannst in einem nächsten Schritt diese Auflistung filtern, indem du zum Beispiel nur nach Bushaltestellen (highway=bus_stop) suchst:
node(50.745,7.17,50.75,7.18)[highway=bus_stop];out;
Alternativ kannst du die Suche erweitern, indem du die ways einschließt, die die Nodes benutzen. Vielleicht willst du, wie im folgenden Beispiel, zusätzlich auch alle Nodes dieser ways ausgegeben bekommen:
node(50.745,7.17,50.75,7.18);
way(bn);
(._;>;);
out;
Diese Ausdrücke und ihre Syntax sind im folgenden detailliert beschrieben.
Die Sprachen
Auf alle Funktionen der Overpass API kann über eine einfache HTTP GET Anfrage zugegriffen werden. Um das zu erreichen wurde die neue Abfragesprache Overpass QL parallel zur etablierten XML Abfragesprache eingeführt. Du kannst immer zwischen beiden Formen übersetzen: Dazu einfach eines der folgenden Beispiele in http://overpass-api.de/convert_form.html kopieren. Dort kannst du das Ausgabeformat auswählen als
- XML query format: Das ist identisch mit allen XML-Ausdrücken im Folgenden.
- pretty Overpass QL: Das ist identisch mit den Overpass QL-Ausdrücken im folgenden
- to concise Overpass QL: Das ergibt eine einzeiligen HTTP GET-Anfrage für den selben Ausdruck.
Um eine Abfrage auszuführen, verwende stattdessen bitte http://overpass-api.de/query_form.html.
Du hast schon einige Beispiele für die QL-Syntax gesehen. Die QL-Syntax basiert auf der Syntax von C. Ein Befehl endet immer mit einem Semikolon ;
.
Es gibt drei Arten von Befehlen:
- Ein Befehl ist entweder ein Abfragebefehl, dann fängt er mit "node" (Punkt), "way" (Weg), "rel" (Rel.) oder "relation" (Relation) ("rel" ist nur eine Kurzschreibweise für "relation") an.
- oder es ist einer der speziellen Befehle ">", ">>", "<", oder "<<".
- oder der Befehl ist ein Ausgabebefehl, dann fängt er mit "out" (Ausgabe) an.
Abfragebefehle bestehen aus der Art der Abfrage und mindestens einer Bedingung. Es gibt verschiedene Arten, wie eine Bedingung aussehen kann.
Alle Arten von tag-Anfragen. z.B.:
["key"="value"]
["key"]
["key"~"value"]
["key"!="value"]
["key"!~"value"]
Oder bounding box-Anfragen:
(51.0,7.0,52.0,8.0)
Beschränkungen des Gebietes fangen immer mit dem kleineren Breitengrad an gefolgt von beim kleineren Längengrad. Dann der größere Breitengrad und der größere Längengrad. Bitte beachte, dass die XAPI-Syntax anders ist. Der XML-Syntax ist die Reihenfolge egal, da sie die Zahlen benennt.
Oder man sucht über mehrere Schritte (rekursiv) vorwärts oder rückwärts über vorhandene Verknüpfungen.
(r)
(w)
(n)
(br)
(bw)
(>)
(>>)
(<)
(<<)
Oder man verwendet spezielle Bedingungen von der Form "(type:value)".
Mehr Informationen dazu findet man in den entsprechenden Abschnitten der Beispiele.
Über die Links
Für die meisten Beispiele liegen Links vor, die das Ergebnis in einer Karte visualisieren. Das ist aber noch in einem experimentellen Stadium. Die Gebietsbeschränkung liegt immer auf der deutschen Stadt Bonn. Außerdem brauchen einige Abfragen recht lange, so sind Zeiten von über einer Minute möglich, wenn keine der benötigten Daten im Cache des Servers liegen. Die Befehle sehen teilweise nicht schön aus, mit einem passenden User-Interface brauchen diese von einem normalen Benutzer aber nicht gesehen zu werden.
Benutzungsbeispiele
Wie man etwas findet
Etwas in den OpenStreetMap-Daten zu finden bedeutet immer, dass man entweder nach einem Ort oder bestimmten Werten in einem Tag suchen muss. Du kannst für die folgenden Beispiele jede beliebigen Zeichenkombination als Wert verwenden. Im ersten Schritt suchen wir Objekte anhand ihres Namens. Deshalb suchen wir Werte für den Schlüssel "name"
Durch exakten Namen
In unserem ersten Beispiel suchen wir nach Punkten(node) mit dem Schlüssel(key) "name" und dem Wert(value) "Gielgen".
Overpass QL:
node["name"="Gielgen"];
out body;
XML:
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
</query>
<print/>
</osm-script>
Ergebnis anzeigen: OpenLayers map JSON, XML.
durch exakten Namen und geschätzte Position
Wenn die letzte Abfrage nicht genau ist können wir noch einen Bereich(bounding box) angeben, um die Ergebnisse nur von dort zu erhalten. Die Koordinatenreihenfolge ist: "kleinerer Breitengrad","kleinerer Längengrad","größerer Breitengrad","größerer Längengrad". Die Angabe der Zahlen erfolgt mit einem Punkt als Dezimaltrennzeichen. Wenn du spontan keinen Bereich hast kannst du es mal mit dem aus dem nächsten Beispiel versuchen:
Overpass QL:
node
["name"="Gielgen"]
(50.7,7.1,50.8,7.2);
out body;
XML:
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
Ergebnis anzeigen:OpenLayers map JSON, XML.
etwas in der Nähe von etwas anderem
Eine etwas weniger technische Methode das gewünschte Ergebnis bei einer großen Auswahlmenge zu bekommen ist es in der Umgebung um ein bekanntes Objekt zu suchen. Du kannst zum Beispiel einen Ort "Gielgen" in einem Radius von 1000 Meter um einen Ort suchen der "Bonn" genannt wird.
Overpass QL:
node["name"="Bonn"];
node
(around:1000)
["name"="Gielgen"];
out body;
XML:
<osm-script>
<query type="node">
<has-kv k="name" v="Bonn"/>
</query>
<query type="node">
<around radius="1000"/>
<has-kv k="name" v="Gielgen"/>
</query>
<print/>
</osm-script>
Ergebnis anzeigen: OpenLayers map JSON, XML.
Nicht exakte Namen
Sogar, wenn du den exakten Namen nicht kennst kannst du ein Objekt finden. Hierzu erlaubt es die Overpass-API reguläre Ausdrücke zu verwenden. Wir geben einige Beispiele der Verwendung.
Im ersten Beispiel suchen wir für einen Punkt, der "holtorf" im Namen hat:
Overpass QL:
node
["name"~"holtorf"]
(50.7,7.1,50.8,7.25);
out body;
XML:
<osm-script>
<query type="node">
<has-kv k="name" regv="holtorf"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
Ergebnis anzeigen: OpenLayers map JSON, XML.
Das zweite Beispiel sucht nach Punkten, dessen Namen mit "Holtorf" anfangen:
Overpass QL:
node
["name"~"^Holtorf"]
(50.7,7.1,50.8,7.25);
out body;
XML:
<osm-script>
<query type="node">
<has-kv k="name" regv="^Holtorf"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
Ergebnis anzeigen: OpenLayers map JSON, XML.
Das dritte Beispiel sucht für Punkte, deren Namen mit "holtorf" enden:
Overpass QL:
node
["name"~"holtorf$"]
(50.7,7.1,50.8,7.25);
out body;
XML:
<osm-script>
<query type="node">
<has-kv k="name" regv="Holtorf$"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
Ergebnis anzeigen: OpenLayers map JSON, XML.
Natürlich könntest du auch nach "^Holtorf$" suchen, das gibt aber die gleiche Ausgabe wie eine einfache Suche nach dem gleichen Wert.
Zusätzlich kann man mit den regulären Ausdrücken auch ohne Beachtung der Groß- und Kleinschreibung suchen. Hierzu muss man beide Varianten in eckige Klammern schreiben:
Overpass QL:
node
["name"~"[hH]oltorf"]
(50.7,7.1,50.8,7.25);
out body;
XML:
<osm-script>
<query type="node">
<has-kv k="name" regv="[hH]oltorf"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
Ergebnis anzeigen: OpenLayers map JSON, XML.
Einen Namen aus einer Auswahl
Wenn du verschiedene Werte erlauben willst kannst du sie Mithilfe des vertikalen Striches "|" trennen. Dieses Zeichen befindet sich auf der Deutschen Tastatur links von der Y-Taste (am Mac: alt+7 unter Verwendung der oberen Zahlenreihe).
Overpass QL:
node
["name"~"holtorf|Gielgen"]
(50.7,7.1,50.8,7.25);
out body;
XML:
<osm-script>
<query type="node">
<has-kv k="name" regv="holtorf|Gielgen"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
Ergebnis anzeigen: OpenLayers map JSON, XML.
Du kannst mehr Informationen über (POSIX extended) reguläre Ausdrücke in Linux über die Konsole oder die Suche im Internet nach "man 7 regex" erhalten. (Auf Deutsch leider nicht ganz so gut wie auf Englisch)
Verneinungen
Ein regulärer Ausdruck selbst kann nicht verneint werden. Deshalb gibt es in der Overpass QL einen Verneinungs-Operator.
Overpass XML: modv="not"
Overpass QL: ! (bei regulären Ausdrücken), != (bei Wertvergleichen)
Beispielsweise sucht folgende Abfrage nach allen "ways", die keinen Tag "highway" haben:
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="way">
<has-kv k="highway" modv="not" regv="."/>
<bbox-query e="7.18" n="50.75" s="50.74" w="7.17"/>
</query>
<print limit="" mode="body" order="id"/>
</osm-script>
|
way
["highway"!~"."]
(50.74,7.17,50.75,7.18);
out body;
|
Ergebnis anzeigen: OpenLayers map, JSON, XML.
Ein weiteres Beispiel zeigt, wie man die Suche nach Bushaltestellen auf solche einschränken kann, die ein Wartehäuschen haben. Formal wird nach einer Bushaltestelle ("highway"="bus_stop") gesucht, die mit dem Tag "shelter" (Wartehäuschen) markiert ist und der Wert des Tags nicht "no" ist.
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="highway" v="bus_stop"/>
<has-kv k="shelter"/>
<has-kv k="shelter" modv="not" v="no"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["highway"="bus_stop"]
["shelter"]
["shelter"!="no"]
(50.7,7.1,50.8,7.25);
out body;
|
Ergebnis anzeigen: OpenLayers map, JSON, XML.
Die gleiche Abfrage mit regulärem Ausdruck:
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="highway" v="bus_stop"/>
<has-kv k="shelter"/>
<has-kv k="shelter" modv="not" regv="no"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["highway"="bus_stop"]
["shelter"]
["shelter"!~"no"]
(50.7,7.1,50.8,7.25);
out body;
|
Ergebnis anzeigen: OpenLayers map, JSON, XML.
mehrere Tags
Natürlich kannst du auch Nodes mit mehreren Tags suchen, um wie im Beispiel Bushaltestellen mit Wartehäuschen zu finden. Also solche, die einen Tag "highway" = "bus_stop" und einen Tag "shelter" = "yes" haben:
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="highway" v="bus_stop"/>
<has-kv k="shelter" v="yes"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["highway"="bus_stop"]
["shelter"="yes"]
(50.7,7.1,50.8,7.25);
out body;
|
Ergebnis anzeigen: OpenLayers map, JSON, XML.
Straßen und andere Wege
Jede der oben genannten Abfragen funktioniert auch mit Linien (way) oder Relationen (relation). Wir suchen für die Straße "Gielgenstraße" im bekanntn Kartenrahmen:
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="way">
<has-kv k="name" v="Gielgenstraße"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
way
["name"="Gielgenstraße"]
(50.7,7.1,50.8,7.25);
out;
|
Ergebnis anzeigen: OpenLayers map, JSON, XML.
Damit ein Weg so wie er angelegt wurde, dargestellt werden kann oder du benötigst die Koordinaten aus einem anderen Grund, müssen die Punkte des Weges auch abgefragt werden. Dies wird mit einer speziellen rekursiven Abfrage (extra-recurse down statement) getan. Damit auch die Linie angezeigt wird, setzen wir sie in eine zusammenfassende Abfrage (union statement). Genauer wird dies in den folgenden Abschnitten erklärt.
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="way">
<has-kv k="name" v="Gielgenstraße"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<union>
<item />
<recurse type="way-node"/>
</union>
<print/>
</osm-script>
|
(
way
["name"="Gielgenstraße"]
(50.7,7.1,50.8,7.25);
>;
);
out;
|
Relationen
Eine Relation befindet sich in einer Bounding Box, wenn eines ihrer Elemente vom Typ Knoten oder Weg innerhalb der Bounding Box ist. Folgende Abfragen geben alle Relationen aus, die ein Element in der Bounding Box (50.746,7.154,50.748,7.157) haben.
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="relation">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
</query>
<print/>
</osm-script>
|
relation(50.746,7.154,50.748,7.157);
out body;
|
Ergebnisse anzeigen: OpenLayers map, JSON, XML.
alle Objektarten
alle Daten in einem Gebiet
Punkte
Wege
Relationen
Beispiele von Kartenaufrufen
Einfachst möglicher Kartenaufruf
komplette Wege aber keine Relationen
komplette Wege und Realtionen
Realtionen in Relationen
Region durch Polygon festlegen
Versuch einer Übersetzung durch Google.
Ergebnis für mich unbrauchbar:
Die "Gebiets" -Objekte sind nicht direkt OSM-Objekte, sie werden von einem Stapel, der regelmäßig auf diesem Server ausgeführt wird, generiert (und auf dem Overpass-API-Server zwischengespeichert), um alle neuen oder geänderten Datenänderungen in der Datenbank zu verarbeiten und nach Nicht-Knotenobjekten zu suchen beschreibt eine geschlossene Oberfläche; diese Objekte schließen geschlossene Wege oder Relationen (insbesondere "Grenz-" und "Multipolygon" -Relationen) ein, deren Glieder eine oder mehrere Arten umfassen, die miteinander verbunden sind, um geschlossene "innere" oder "äußere" Ringe zu bilden, die eine Oberfläche begrenzen. Überführung verarbeitet diese Objekte, um ihre Geometrie zu extrahieren (und sie im Fall von Relationen neu zu verbinden und anzuordnen) als eine Menge polygonaler Grenzen. Der Overpass-API-Server speichert dann die berechnete Geometrie und ordnet sie (nach ID) dem OSM-Weg oder Beziehungsobjekt zu, das ihre Tags auflistet; Der Stapel erkennt auch einige Benennungs-Tags, die hilfreich sind, um sie leichter zu identifizieren. Übersteuerungsbereiche sind nützlich, um die Verwendung von expliziten Rekursionsabfragen zu vermeiden und auch als vorberechnete Filter, die keine Beziehungen und Wege zurückgeben, die tatsächlich keinen Bereich umschließen. Da sie jedoch von peridischen Batches generiert werden, geben sie möglicherweise nicht den neuesten Stand der OSM-Datenbank wieder (oder sogar alle neuesten Diffs, die bereits auf dem Overpass-API-Server empfangen und gespeichert wurden). Aber sie können die Abfragen erheblich vereinfachen und beschleunigen, insbesondere bei großen Flächen mit komplexen Geometrien, die gewöhnlich "Grenz-" oder "Multipolygon" -Relationen verwenden (wie etwa die Grenzen von Ländern oder ihren regionalen Unterteilungen oder die komplexen Grenzen von großen "Landnutzungen" oder " natürliche "Gebiete". Diese Bereiche können dann als selektivere Begrenzungsfilter verwendet werden (anstatt einfache Begrenzungsrahmen zu verwenden) oder können auch selbst als Abfragen verwendet werden (in diesem Fall geben sie alle Knoten in der von der Bereichsgeometrie eingeschlossenen Fläche zurück). Wenn Bereiche durch ihre interne ID in Overpassage referenziert werden (und dieser Bereich wurde eingeschlossen, werden alle in der Eingabemenge vorhandenen Bereiche ignoriert und nur OSM-Objekte in der Eingabesatzgruppe, die sich mit dem angegebenen Bereich schneiden, werden beibehalten.) (area: 2400000001) / * Objekte in einem Bereich filtern, dessen Oberfläche durch den Weg mit id = 1 in OSM * / (area: 3600000001) / * filtert Objekte in einem Bereich, dessen Oberfläche durch Wegglieder der Beziehung mit id = 1 in OSM * / Die IDs für vorberechnete Überführungsbereiche werden derzeit zugewiesen, indem der OSM-ID einfach große statische Konstanten hinzugefügt werden (vorausgesetzt, die zugehörigen OSM-Objekte schließen effektiv eine Fläche ein).
Ausgabeformat festlegen
Umfang der Ausgabe
Standard
gekürzt
Kurzform
komplett
Sortierreihenfolge
Limitierung der Ergebnismenge
Auswahl der Datenformates
Anfrage durch Identifikationsnummer
Editieren der gefundenen Daten
Diese Anleitung ist inzwischen unter der eigenen Seite für Sparse Editing zu finden.
Sprachhinweise
dafür wurde eine eigene Seite angelegt language reference.
FAQ
auch hier wurde eine eigene Seite angelegt Overpass_API/FAQ#Languages_and_syntax