OpenStreetMap

a_peter's diary

Recent diary entries

Overpass-API nutzen um Daten innerhalb einer Relation zu finden.

Posted by a_peter on 20 December 2013 in German (Deutsch)

Da sich die Dokumentation der Overpass-API um dieses Thema herumdrückt, werde ich das mal hier beschreiben.

Ausgangspunkt ist overpass turbo, um Overpass-Abfragen starten zu können.

Als Beispiel nehmen wir mal meine Heimatstadt Berlin. Zuerst müssen wir herausfinden, welche Relation die Stadt Berlin beschreibt. Ab zu openstreetmap.org und "Berlin" in das Suchfeld eingetragen. Bei mir ist es der zweite Treffer "Landesgrenze Berlin, Deutschland, Europäische Union". Mit der Maus über den Link fahren und wir sehen Relation 62422 beschreibt die Berliner Stadtgrenze.

Jezt wollen wir eine Abfrage in overpass machen, die diese Relation als Außengrenze nutzt. Dazu verwenden wir folgende Notation:

node(area:3600062422);

Wo die 3.600.000.000 herkommen, die man zur ID der Relation addieren muss habe ich noch nicht herausgefunden. Vielleich kann mir das jemand noch mitteilen. Auf jeden Fall funktioiniert das mit jeder beliebigen Relation. Zu deren ID 3.600.000.000 addieren und mit Doppelpunkt hinter "area" schreiben. Damit kann man außer "node" natürlich auch "way" und "rel" angeben, um Wege oder Relationen innerhalb einer Relation abzufragen.

Jetzt wollen wir mal sehen, ob es Knoten gibt, die in "addr:city" irgendetwas anderes haben als "Berlin". Ein erster Versuch mit

node(area:3600062422)["addr:city"!~"Berlin"]; out meta;

schlägt fehl. Denn es werden zuviele Knoten gefunden ["addr:city"!~"Berlin"] findet nämlich auch alle Knoten, die gar kein "addr:city" haben. Da müssen wir etwas "komplizierter" denken.

Suchen wir zuerst mal alle Knoten, die überhaupt das Attribut "addr:city" haben. Durch die Einschränkung innerhalb der Relation sind das schon mal nicht ganz soviele:

node(area:3600062422)["addr:city"]; out meta;

Sehr schön. Jetzt fällt uns ein, dass die overpass-api die Möglichkeit bietet, Differenzen zwischen Mengen zu bilden. Nutzen wir das doch dazu, von der Menge aller Knoten, die das Attribut "addr:city" haben all diejenigen abzuziehen, die das Attribut "addr:city=Berlin" haben. Dann bleiben alle übrig, die das Attribut "addr:city" überhaupt haben, bei denen der Wert aber ungleich "Berlin" ist.

Die Syntax für Differenzmengen ist:

(node(...)[...] - node(...)[...];);

Bezogen auf unser Proble ergibt sich:

( node(area:3600062422)["addr:city"] - node(3600062422)["addr:city"="Berlin"]; ); out meta;

Und siehe da: Das Ergebnis sind momentan 45 Knoten mit Werten wie "addr:city=Berlin-Französich-Buchholz", das man schön aufsplitten kann in "addr:city=Berlin" und "addr:suburb=Französisch-Buchholz".

Man muss das Ganze natürlich nicht dazu nutzen, die gleichen Attribute abzufragen. Mann kann auch alle Knoten/Wege/Relationen suchen, die das Attribut "addr:city" haben, denen aber das Attribut "addr:postcode" fehlt:

( node(area:3600062422)["addr:city"] - node(3600062422)["addr:postcode"]; ); out meta;

Oder man sucht alle Restaurants, die keine italienische Küche anbieten

( node(area:3600062422)["amenity"="restaurant"] - node(3600062422)["cuisine"="italian"]; ); out meta;

Ah, ja, 2974 Restaurants, die entweder keine Küchenbezeichnung haben oder deren Küchenbezeichnung nicht "italian" ist. Mehrere Ausschlüsse lassen sich dadurch erreichen, dass man entweder Reguläre Ausdrücke verwendet:

( node(area:3600062422)["amenity"="restaurant"] - node(3600062422)["cuisine"~"(italian|greek)"]; ); out meta;

oder indem man mehrere Mengen abzieht:

( node(area:3600062422)["amenity"="restaurant"] - node(3600062422)["cuisine"="italian"] - node(3600062422)["cuisine"="greek"] ); out meta;

Eine Kombination dieser Methoden ist natürlich auch möglich.

Aus overpass turbo heraus kann man dann mit Klick auf "Export" die Daten direkt in JOSM öffnen lassen und dort korrigieren.

Viel Spaß beim Mappen.

(p.s.: Über die Feiertage werde ich diesen Betrag mal ins Englische übersetzen.)

Older Entries | Newer Entries