You are not logged in.

Announcement

*** NOTICE: forum.openstreetmap.org is being retired. Please request a category for your community in the new ones as soon as possible using this process, which will allow you to propose your community moderators.
Please create new topics on the new site at community.openstreetmap.org. We expect the migration of data will take a few weeks, you can follow its progress here.***

#1 2013-09-09 09:52:26

2cent
Member
Registered: 2013-09-04
Posts: 6

Overpass API OR-Operator

Hallo zusammen,

ich würde in der Overpass-API gerne eine Abfrage mit OR-Operator machen, also etwa

[amenity=bus_station||highway=bus_stop||public_transport=*]

Leider führt diese Abfrage in der URL aber nicht zum gewünschten Ergebnis. Nötig ist die Abfrage, da nicht alle Haltestellen mit "public_transport" getaggt sind, sondern z.T. nur durch andere Tags erkennbar sind.

In der Dokumentation habe ich schon geschaut, aber nur den AND-Operator gefunden (durch einfaches aneinanderreihen "[amenity=...][public_transport=...]" ...).

Vielen Dank schonmal

Johannes

Last edited by 2cent (2013-09-09 10:21:28)

Offline

#2 2013-09-09 10:43:17

couchmapper
Member
Registered: 2013-02-17
Posts: 462

Re: Overpass API OR-Operator

Hallo!

ein "oder" gibt es so nicht, allerdings lässt sich das gleiche Ergebnis über ein union-Konstrukt erreichen: http://wiki.openstreetmap.org/wiki/Over … s_QL#union

Edit 19.1.2014: Inzwischen gibt es dafür die Wizard in overpass turbo, dort lassen sich auch "oder"-Ausdrücke angeben, die automatisch in ein "union" übersetzt werden.

Doku: http://wiki.openstreetmap.org/wiki/Over … rbo/Wizard

Last edited by couchmapper (2014-01-19 19:36:22)

Offline

#3 2013-09-09 14:00:52

EvanE
Member
Registered: 2009-11-30
Posts: 5,716

Re: Overpass API OR-Operator

couchmapper wrote:

ein "oder" gibt es so nicht, allerdings lässt sich das gleiche Ergebnis über ein union-Konstrukt erreichen: http://wiki.openstreetmap.org/wiki/Over … s_QL#union

Wo wir gerade beim Thema Overpass-API sind, gibt es die Möglichkeit per Overpass-API zu zählen? Hintergrund ist die Frage, wieviel Gebäude gibt es in einem Bereich und wieviele davon haben Adressen / Hausnummern?

Edbert (EvanE)

Offline

#4 2013-09-09 14:21:52

toc-rox
Member
From: Münster
Registered: 2011-07-20
Posts: 2,357
Website

Re: Overpass API OR-Operator

EvanE wrote:

... Wo wir gerade beim Thema Overpass-API sind, gibt es die Möglichkeit per Overpass-API zu zählen? Hintergrund ist die Frage, wieviel Gebäude gibt es in einem Bereich und wieviele davon haben Adressen / Hausnummern?

Zumindest dreistufig sollte das klappen: also zunächst die Ergebnisdaten laden und dann lokal darauf z.B. zwei "grep" (nach building bzw. housenumber) anwenden.

Gruß Klaus

Offline

#5 2013-09-09 14:41:54

Oli-Wan
Member
From: NRW
Registered: 2010-09-14
Posts: 2,814

Re: Overpass API OR-Operator

toc-rox wrote:

Zumindest dreistufig sollte das klappen: also zunächst die Ergebnisdaten laden und dann lokal darauf z.B. zwei "grep" (nach building bzw. housenumber) anwenden.

grep filtert allerdings zeilenweise, nicht OSM-Objekt-weise, ein einfaches ... | grep building | grep housenumber wird also nicht reichen. Schon besser: mit z.B. osmfilter nach buildings filtern, dann im Filtrat die Gebäude und Hausnummern zählen - im einfachsten Fall tatsächlich mit (f)grep -c.

Ansonsten läßt sich ein "schlauer" Zähler (d.h. einer, der sich nicht von XML-Zeilen irreführen läßt, konfigurierbar und nebenbei auch noch deutlich schneller ist) natürlich mit Osmium in wenigen Zeilen C++ implementieren.


No animals were harmed in the writing of this posting.

Offline

#6 2013-09-09 16:17:09

viw
Member
Registered: 2010-05-15
Posts: 2,623

Re: Overpass API OR-Operator

Oli-Wan wrote:
toc-rox wrote:

Zumindest dreistufig sollte das klappen: also zunächst die Ergebnisdaten laden und dann lokal darauf z.B. zwei "grep" (nach building bzw. housenumber) anwenden.

grep filtert allerdings zeilenweise, nicht OSM-Objekt-weise, ein einfaches ... | grep building | grep housenumber wird also nicht reichen. Schon besser: mit z.B. osmfilter nach buildings filtern, dann im Filtrat die Gebäude und Hausnummern zählen - im einfachsten Fall tatsächlich mit (f)grep -c.

Dieser Ansatz ist zum scheitern verurteilte, wenn die Adressen nicht am Umriss erfasst sidn.

Offline

#7 2013-09-09 16:31:13

stephan75
Member
Registered: 2008-05-28
Posts: 2,918

Re: Overpass API OR-Operator

Wenn man OSM-Objekte zählen möchte, kommt man vielleicht mit http://wiki.openstreetmap.org/wiki/Osmconvert weiter.

Da kann man eine OSM-Datei als CSV-Datei ausgeben lassen. Hilft das?

Offline

#8 2013-09-09 16:36:14

EvanE
Member
Registered: 2009-11-30
Posts: 5,716

Re: Overpass API OR-Operator

viw wrote:
Oli-Wan wrote:
toc-rox wrote:

Zumindest dreistufig sollte das klappen: also zunächst die Ergebnisdaten laden und dann lokal darauf z.B. zwei "grep" (nach building bzw. housenumber) anwenden.

grep filtert allerdings zeilenweise, nicht OSM-Objekt-weise, ein einfaches ... | grep building | grep housenumber wird also nicht reichen. Schon besser: mit z.B. osmfilter nach buildings filtern, dann im Filtrat die Gebäude und Hausnummern zählen - im einfachsten Fall tatsächlich mit (f)grep -c.

Dieser Ansatz ist zum scheitern verurteilte, wenn die Adressen nicht am Umriss erfasst sind.

Warum? In der XML-Fassung sucht du nach (addr:)housenumber und kümmerst dich nicht darum, ob die Adresse am Gebäude-Weg, an einem Eingangsknoten oder als freistehender Knoten erfasst ist.

Erst wenn man diese Dinge unterscheiden will, muss man mehr Aufwand reinstecken. Ebenso wenn man bestimmte Dinge (z.B. Garagen, Gartenhäuser, ...) bei der Gebäude-Zählung nicht berücksichtigen will.
In dem Fall greift man wohl eher zu etwas wie sed, awk, Perl oder Phyton bis hin zu einer GIS-fähigen Datenbank.

Edbert (EvanE)

Offline

#9 2013-09-09 17:10:07

toc-rox
Member
From: Münster
Registered: 2011-07-20
Posts: 2,357
Website

Re: Overpass API OR-Operator

Ich biete mal dies (mit OR / Union um den Threadbezug wieder herzustellen):

perl opaQuery.pl "(way ['building'] (51.8, 7.4, 52.1, 7.8); rel ['building'] (51.8, 7.4, 52.1, 7.8)); out meta;"

grep -c "\"building\"" opaQuery.Response.xml
29283

grep -c "addr:housenumber" opaQuery.Response.xml
6967

Besser wäre jedoch diese Map-Query:

perl opaQuery.pl "[timeout:720]; (node (51.8, 7.4, 52.1, 7.8); <;); out meta;"

grep -c "\"building\"" opaQuery.Response.xml
29860

grep -c "addr:housenumber" opaQuery.Response.xml
11962

Gruß Klaus

Last edited by toc-rox (2013-09-09 17:22:54)

Offline

#10 2013-09-09 17:16:50

geodreieck4711
Member
Registered: 2011-07-18
Posts: 119

Re: Overpass API OR-Operator

couchmapper wrote:

Hallo!

ein "oder" gibt es so nicht, allerdings lässt sich das gleiche Ergebnis über ein union-Konstrukt erreichen: http://wiki.openstreetmap.org/wiki/Over … s_QL#union

in der turbo overpass vieleicht so:

//[amenity=bus_station||highway=bus_stop||public_transport=*]

(node({{bbox}})["amenity"="bus_station"]);
(._;node({{bbox}})["highway"="bus_stop"]);
(._;node({{bbox}})["public_transport"]);
out meta;

Offline

#11 2013-09-09 19:35:56

couchmapper
Member
Registered: 2013-02-17
Posts: 462

Re: Overpass API OR-Operator

Hmmm, ich hätte vielleicht eher sowas erwartet:

(node({{bbox}})["amenity"="bus_station"];
node({{bbox}})["highway"="bus_stop"];
node({{bbox}})["public_transport"];
);
out meta;

Den Unterschied zwischen beiden Varianten erkennt man ganz gut, wenn man beide Queries hiermit nach pretty url konvertiert. Das Beispiel oben erzeugt 1 Union bestehend aus 3 Statements, das von geodreieck4711 aus dem vorhergehenden Post 3 Unions, jeweils mit Zusammführen der bisherigen Ergebnismenge mit dem aktuellen Statement. Was besser ist weiß ich auch nicht.

Offline

#12 2013-10-10 10:50:20

hurdygurdyman
Member
Registered: 2009-12-10
Posts: 2,850

Re: Overpass API OR-Operator

Einsteigerfrage hmm
Ich will mir alle turn:lanes*=* einer Gegend anschauen, um zu sehen, wo welche erfasst sind oder noch nicht.
Das:

{{key=turn:lanes}}
{{key=turn:lanes:forward}}
{{key=turn:lanes:backward}}
<osm-script output="json">
  <union>
    <query type="node">
      <has-kv k="{{key}}" v="{{value}}"/>
      <bbox-query {{bbox}}/>
    </query>
    <query type="way">
      <has-kv k="{{key}}" v="{{value}}"/>
      <bbox-query {{bbox}}/>
    </query>
    <query type="relation">
      <has-kv k="{{key}}" v="{{value}}"/>
      <bbox-query {{bbox}}/>
    </query>
  </union>
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="skeleton"/>
</osm-script>

zeigt mir nur ein Ergebnis für key=turn:lanes. Wie bekomme ich die Mehrfachabfrage hin?


Gruß Michael (hurdygurdyman)
Ich mappe für Menschen, die Karten verwenden, welche aus OSM-Daten gerendert wurden tongue http://de.wikipedia.org/wiki/KISS-Prinzip cool

Offline

#13 2013-10-10 10:56:49

rayquaza
Member
From: DE-BW
Registered: 2012-11-18
Posts: 2,007

Re: Overpass API OR-Operator

Kurzform nur für Ways und mit "1" und "2" als Key, den Rest kriegst du vmtl selbst hin:

<osm-script output="json">
  <union>
    <query type="way">
      <has-kv k="1"/>
      <bbox-query {{bbox}}/>
    </query>
    <query type="way">
      <has-kv k="2"/>
      <bbox-query {{bbox}}/>
    </query>
  </union>
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="skeleton"/>
</osm-script>

Offline

#14 2013-10-10 11:00:07

hurdygurdyman
Member
Registered: 2009-12-10
Posts: 2,850

Re: Overpass API OR-Operator

rayquaza wrote:

Kurzform nur für Ways und mit "1" und "2" als Key, den Rest kriegst du vmtl selbst hin:
...

Funzt. cool Danke. smile


Gruß Michael (hurdygurdyman)
Ich mappe für Menschen, die Karten verwenden, welche aus OSM-Daten gerendert wurden tongue http://de.wikipedia.org/wiki/KISS-Prinzip cool

Offline

#15 2013-10-10 11:36:34

SunCobalt
Member
From: Eislingen
Registered: 2010-01-09
Posts: 3,810

Re: Overpass API OR-Operator

hurdygurdyman wrote:

Einsteigerfrage hmm
Ich will mir alle turn:lanes*=* einer Gegend anschauen, um zu sehen, wo welche erfasst sind oder noch nicht.

wenn Dir ein paar Tage alte Daten reichen
http://roads.osm4people.org/?zoom=9&lat … rs=B0FFTFF

destination:lanes gehen noch nicht. Hatte ein Tippfehler beim filtern hmm


Thomas

Offline

#16 2013-10-10 11:53:54

hurdygurdyman
Member
Registered: 2009-12-10
Posts: 2,850

Re: Overpass API OR-Operator

SunCobalt wrote:

...
wenn Dir ein paar Tage alte Daten reichen
http://roads.osm4people.org/?zoom=9&lat … rs=B0FFTFF

destination:lanes gehen noch nicht. Hatte ein Tippfehler beim filtern hmm

Danke für das Angebot. Den QA kenne ich.
Wollte aber mal mit Over(s)pass aktuell probieren, damit ich sehe, was bei mir (oder da, wo ich mich rumtreibe) erledigt ist. Das Teil bietet ja sehr variable Möglichkeiten, weshalb ich mich da einschaffen will.


Gruß Michael (hurdygurdyman)
Ich mappe für Menschen, die Karten verwenden, welche aus OSM-Daten gerendert wurden tongue http://de.wikipedia.org/wiki/KISS-Prinzip cool

Offline

#17 2013-10-11 08:41:52

drolbr
Member
Registered: 2013-05-12
Posts: 59

Re: Overpass API OR-Operator

EvanE wrote:

Wo wir gerade beim Thema Overpass-API sind, gibt es die Möglichkeit per Overpass-API zu zählen? Hintergrund ist die Frage, wieviel Gebäude gibt es in einem Bereich und wieviele davon haben Adressen / Hausnummern?

Siehe http://overpass-turbo.eu/s/1ew
dann keine Reparatur, rechts auf "Daten" schalten. Ich garantiere, dass im Hauptblock genau eine Id pro Zeile geschrieben wird.

Zeilen 6 bis 46 sind Nodes. Also gibt es 41 Punkte in Bonn, die die Tags "building" und "addr:housenumber" besitzen.

Zeilen 47 bis 23057 sind Ways. Also gibt es 23011 Wege in Bonn, die die Tags "building" und "addr:housenumber" besitzen.

Jetzt können wir noch "building"="no" rauswerfen: http://overpass-turbo.eu/s/1ex
Dies ändert allerdings die Zahlen nicht.

Offline

#18 2013-10-11 12:23:51

EvanE
Member
Registered: 2009-11-30
Posts: 5,716

Re: Overpass API OR-Operator

drolbr wrote:
EvanE wrote:

Wo wir gerade beim Thema Overpass-API sind, gibt es die Möglichkeit per Overpass-API zu zählen? Hintergrund ist die Frage, wieviel Gebäude gibt es in einem Bereich und wieviele davon haben Adressen / Hausnummern?

Siehe http://overpass-turbo.eu/s/1ew
dann keine Reparatur, rechts auf "Daten" schalten. Ich garantiere, dass im Hauptblock genau eine Id pro Zeile geschrieben wird.

Zeilen 6 bis 46 sind Nodes. Also gibt es 41 Punkte in Bonn, die die Tags "building" und "addr:housenumber" besitzen.

Zeilen 47 bis 23057 sind Ways. Also gibt es 23011 Wege in Bonn, die die Tags "building" und "addr:housenumber" besitzen. ...

Hey Danke.
Knoten mit building=* gibt es nur noch relative wenige, seit building=entrance durch entrance=main/yes ersetzt wurde. Eventuell kämen noch ein paar Relationen (MP für Gebäude) dazu, eine Erweiterung, die recht offensichtlich ist.

"out ids;" ist wohl das Stichwort, das die Auflistung zum einfachen Zählen ergibt. Vielen Dank, fürs austüfteln und ausprobieren.

Edbert (EvanE)

Offline

#19 2013-10-11 18:05:58

couchmapper
Member
Registered: 2013-02-17
Posts: 462

Re: Overpass API OR-Operator

Hola,

Turbo zeigt das sogar unten rechts auf der Karte an:

geladen – Nodes: 40, Ways: 23013, Relations: 0
angezeigt – POIs: 0, Linien: 0, Polygone: 0

Last edited by couchmapper (2013-10-11 18:06:49)

Offline

Board footer

Powered by FluxBB