DE:Overpass API/Language Guide

From OpenStreetMap Wiki
Jump to: navigation, search
Verfügbare Sprachen — Overpass API/Language Guide
· Afrikaans · Alemannisch · aragonés · asturianu · azərbaycanca · Bahasa Indonesia · Bahasa Melayu · Bân-lâm-gú · Basa Jawa · Baso Minangkabau · bosanski · brezhoneg · català · čeština · dansk · Deutsch · eesti · English · español · Esperanto · estremeñu · euskara · français · Frysk · Gaeilge · Gàidhlig · galego · Hausa · hrvatski · Igbo · interlingua · Interlingue · isiXhosa · isiZulu · íslenska · italiano · Kiswahili · Kreyòl ayisyen · kréyòl gwadloupéyen · Kurdî · latviešu · Lëtzebuergesch · lietuvių · magyar · Malagasy · Malti · Nederlands · Nedersaksies · norsk bokmål · norsk nynorsk · occitan · Oromoo · oʻzbekcha/ўзбекча · Plattdüütsch · polski · português · português do Brasil · română · shqip · slovenčina · slovenščina · Soomaaliga · suomi · svenska · Tiếng Việt · Türkçe · Vahcuengh · vèneto · Wolof · Yorùbá · Zazaki · српски / srpski · беларуская · български · қазақша · македонски · монгол · русский · тоҷикӣ · українська · Ελληνικά · Հայերեն · ქართული · नेपाली · मराठी · हिन्दी · অসমীয়া · বাংলা · ਪੰਜਾਬੀ · ગુજરાતી · ଓଡ଼ିଆ · தமிழ் · తెలుగు · ಕನ್ನಡ · മലയാളം · සිංහල · ไทย · မြန်မာဘာသာ · ລາວ · ភាសាខ្មែរ · ⵜⴰⵎⴰⵣⵉⵖⵜ · አማርኛ · 한국어 · 日本語 · 中文(简体)‎ · 吴语 · 粵語 · 中文(繁體)‎ · ייִדיש · עברית · اردو · العربية · پښتو · سنڌي · فارسی · ދިވެހިބަސް
Overpass turbo · Overpass API · Referenz der Sprache · Beispielabfragen · Leitfaden der Sprache · fortgeschrittene Beispiele · Sparse Editing · FAQ · MapCSS · mehr : Overpass turbo Deutsch · Overpass API Deutsch

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 stattdessen http://overpass-api.de/query_form.html verwenden

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 ";" Weitere:

  • 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
selber mit overpass-turbo ausführen
<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>
selber mit overpass-turbo ausführen
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
selber mit overpass-turbo ausführen
<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>
selber mit overpass-turbo ausführen
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
selber mit overpass-turbo ausführen
<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>
selber mit overpass-turbo ausführen
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
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
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
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
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
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  way
    ["name"="Gielgenstraße"]
    (50.7,7.1,50.8,7.25);
  >;
);
out;


Relationen

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

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