User:Debuglevel
Overpass API
https://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_API_by_Example https://wiki.openstreetmap.org/wiki/Overpass_API/Advanced_examples
Sprache
Settings
//[settingName:settingValue]; [timeout:25]; // defaults to 180 [maxsize:1073741824]; // defaults to 536870912
[out:xml]; [out:json]; // CSV with value of tag "name" [out:csv("name";true)]; [out:csv(name;true)];
// also output special field "id" [out:csv(name, ::id ; true)]; [bbox:south,west,north,east] // A bbox framing the German city of Bonn [bbox:50.6,7.0,50.8,7.3]
Mengen
node[name="Foo"];
ist das gleiche wie
node[name="Foo"] -> ._;
und speichert die Ergebnisse implizit in eine Menge "_" ab; der nächste Aufruf liest implizit wieder auf dieser Menge. Kann man aber auch explizit bzw. mit anderem Namen beschreiben.
node[amenity]((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}}))->.amenities; node.amenities[amenity=bench]; out geom;
Block statements
Union
Mengen zusammenfügen
( node[name="Foo"]; way[name="Foo"]; ) -> .foos;
Difference
Menge subtrahieren
( node[name="Foo"]; - node[amenity=bench]; ) -> .nonBenchFoos; // Foos die nicht in der definierten bounding box sind ( node[name="Foo"]; - node(50.0,7.0,51.0,8.0); );
Intersection
Die Schnittmenge aus zwei Mengen (hier leuchtende Bänke)
node.dies.das;
node[lamp_type]((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}})) -> .lamps; node[amenity=bench]((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}})) -> .benches; ( node.lamps.benches; // THIS ); out geom;
For each
way[name="Markusplatz"]((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}}))->.theWays; // result set is taken as input set for foreach foreach.theWays { ( ._; // set of the item (i.e. way) >; // set of the nodes ); // union of both sets out; // print the output set } // do this for each item in the original input set; which may result in duplicates.
loop variable can be named explicitely
way[name="Markusplatz"]((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}}))->.theWays; // result set is taken as input set for foreach foreach.theWays->.theWay { ( .theWay; // set of the item (i.e. way) >; // set of the nodes ); // union of both sets out; // print the output set } // do this for each item in the original input set; which may result in duplicates.
For
ist das eigentlich ein group by?
for.<Name of Input Set>->.<Name of Output Set> (<Evaluator>) { <List of Substatements> }
[out:csv(num,length,operator)]; area[name="Ruhrgebiet"]; way[railway][operator](area); for (t["operator"]) { make stat operator=_.val,num=count(ways),length=sum(length()); out; }
complete
complete(<maxIterations>).<Name of Input Set>->.<Name of Output Set> { <List of Substatements> }
rekursiv angrenzede waterways der Pegnitz sammeln; bricht nach 20 Schritten ab
way(48400330); // Teil der Pegnitz complete(20){ node(w); way(bn)[waterway]; } //out geom; out skel geom;
is_in
alle areas anzeigen, in denen sich die Vegbereitung befindet:
node[name=Vegbereitung]((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}})); is_in;
around
alle n/w/r 100m rund um den Gabelmann:
node[name=Gabelmann]; nwr(around:100.0); out;
pivot
Areas sind abgeleitete Dinge in OSM; mit relation(pivot) bzw way(pivot) (je nachdem aus was es entstand) werden die relation/way sets zurückgegeben.
area(3600062525); //way(pivot); relation(pivot); out geom;
Beispiele
PLZ Gebiete anzeigen
rel["boundary"="postal_code"]((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}})); out geom;
alle ways
way((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}})); out geom;
alle *weg'e in Bamberg
area(3600062525); way(area)[name~"Weg",i]; out geom;
alle Flussartigen
way((bbox={{{minlon}}},{{{minlat}}},{{{maxlon}}},{{{maxlat}}}))[waterway]; out geom;
die Regnitz anzeigen
way[waterway][name=Regnitz]; out geom;
die Donau anzeigen
Die internationale Donau anzeigen, auch wenn der "name" wechselt, aber hoffentlich dann noch "name:de" gesetzt ist.
( way[waterway]["name"=Donau]; way[waterway]["name:de"=Donau]; ); //out; out geom;
alle Straßen einer benannten area (XML)
alle Straßen in "Hallstadt", die den Key "highway" und "name" gesetzt haben.
area[name="Hallstadt"]; way(area)[highway][name]; out;
alle Straßen einer benannten area (JSON)
[out:json]; area[name="Hallstadt"]; way(area)[highway][name]; out;
alle Straßen einer benannten area (CSV)
nur Feld "name", ohne Spaltentitel
[out:csv("name";false)]; area[name="Hallstadt"]; way(area)[highway][name]; out;
zusätzlich das Feld "maxspeed" ausgeben
[out:csv("name","maxspeed";true)]; area[name="Hallstadt"]; way(area)[highway][name]; out;
das selbe Ergebnis, mit Klammerung (verknüpft alle Mengen die darin stehen):
[out:csv("name","maxspeed";true)]; area[name="Hallstadt"]; ( way(area)[highway][name]; ) out;
Straßen für die aktuell angezeigte Box in Overpass Turbo als Daten ausgeben und in der Map anzeigen:
[out:json][timeout:25]; // gather results ( way({{bbox}})[highway][name]; ); // print results out body; >; out skel qt; nwr = node + way + relation ( node... way... relation )
ist das gleiche wie
( nwr... )
Count in CSV ausgeben
[out:csv(::type,::id,"name",::count; true; "|")]; area[name="Bonn"]->.a; ( node(area.a)[railway=station]; way(area.a)[railway=station]; rel(area.a)[railway=station]; ); out; out count;