User:Debuglevel

From OpenStreetMap Wiki
Jump to navigation Jump to search

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;