Overpass: Mehrfach-Merkmale für IN und OUT

Hallo,
für den aktuellen Schwerpunkt möchte ich eine Overpass-Abfrage, die Restaurants etc. findet aber solche ohne website=* / url=* (FEHLT NOCH in meinem Ansatz! Wie funktioniert das notwendige ODER?) ausschließt. Der Code erzeugt keinen Fehler, liefert aber nicht:

// QueryIN: Restaurant, Cafe, ...  etc.
(
nwr["amenity"="restaurant"];
nwr["amenity"="cafe"];
nwr["amenity"="bar"];
nwr["amenity"="pub"];
  )
->.QueryIN;

// QueryOUT: keine webseite
(
nwr[!"website"];
)
->.QueryOUT;

// Ergebnis = QueryIN - QueryOut;
(.QueryIN; - .QueryOUT;);

// print results
out body;
>;
out skel qt;

Als Beispiel für Aachen:

``` area[name="Aachen"]->.a; nwr(area.a)["amenity"~"restaurant|cafe|bar|pub"][!"website|url"]; (._;>;); out; ```

Sollte das Gewünschte (amenity bei denen website oder url fehlt) liefern.

EDIT: Funktioniert nicht, siehe weitere Diskussion.


[!"website|url"]

Das klappt so nicht. Das “!” erwartet einen Schlüssel, aber keinen regulären Ausdruck.

website und url sind doch Schlüssel, oder?

Ich sehe aber gerade, dass bei meiner Abfrage auch z.B. public_bookcase gefunden wird (wg. “pub”). Die Abfrage müsste man also noch etwas verfeinern.

“|” funktioniert so aber nur bei regulären Ausdrücken und “!” versteht diese regulären Ausdrücke jedoch nicht. Das [!“website|url”] würde also nach einem einzigen Schlüssel “website|url” suchen, den es so natürlich nicht gibt. Das “|” funktioniert hier also nicht als logische Bedingung “oder”.

Wir machen heute mal was anderes:

[bbox:{{bbox}}];
nwr["amenity"~"^(restaurant|cafe|bar|pub)$"](if:is_tag("website") + is_tag("url") == 0);
out geom;

Und warum erhalte ich dann als Ergebnis Nodes usw. bei denen website oder url (oder beides) fehlt (stichprobenartig kontrolliert)? Lt. deiner Aussage dürfte das nicht funktionieren, weil es ein “website|url” nicht gibt. Ich bin irritiert…

[!“website|url”] bewirkt, dass aus der Ergebnismenge alle Objekte rausgeworfen werden, die ein (hypothetisches) “website|url” Tag haben. Da es ein solches Tag aber nicht gibt, hat dieser Filter keinen Effekt.

Letztlich führt dieser Ausdruck also weder dazu, dass Objekte mit “website”, noch Objekte mit “url” herausgefiltert werden. Es ist eigentlich völlig egal, ob ein Objekt eines dieser beiden Tags (oder auch beide) hat oder nicht.

Bitte auch nochmal in der Doku nachschauen: https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#Not_exists

Intern wird aus node[!name]; ein node[“name”!~“.*”]; und somit sollte auch hoffentlich klar sein, dass der Key “Name” kein regulärer Ausdruck sein darf.

Ah, OK, jetzt hab ichs verstanden. Ich habe das “[!“website|url”]” mal weggelassen und das Ergebnis ist dasselbe. Danke für deine Geduld ;).

Danke @mmd,

Wenn ich es richtig sehe, funktioniert die Suche für die angegebenen “amenity” korrekt. Aber aus dieser Auswahl sollen doch die NWR entfallen, die nicht einmal eine Internet-Angabe haben, also weder “website”=* noch “url”=.
Und ich hatte vergessen, die auszuschließen, die ein Merkmal “website:menu”=
haben.

Ich verstehe das Wort “entfallen” hier nicht. Du hattest doch ganz am Anfang geschrieben, “für den aktuellen Schwerpunkt möchte ich eine Overpass-Abfrage, die Restaurants etc. findet aber solche ohne website=* / url=*”.

Das ist genau das, was die Abfrage macht: es werden alle amenity in der Bbox zurückgeliefert, die weder ein website noch url Tag haben.
Ergänzungen mit weiteren Tags bitte analog selbst vornehmen.

Zur Erklärung noch: is_tag(“website”) ist entweder 1, wenn das Objekt ein “website” Tag hat, oder eben “0” wenn ein solches Tag nicht vorhanden ist. Gleiches gilt auch für das “url” Tag. Wenn ich diese Werte dann aufaddiere, kann ich genau festlegen, welche Objekte im Ergebnis drin sind.

Als Beispiel, ein " <= 1" statt “== 0” würde also nur Objekte zurückliefern, die nicht “website” und “url” gleichzeitig haben.

Aber könnte man nicht auch explizit schreiben: node[~“website|url”!~“.*”] ? Dann müsste es doch gehen?

Ich verwende bei mir z.B. rel[~‘type’~‘route’] allerdings links ohne ‘|’

Die Kombination aus regulärem Ausdruck für den Key und Negation wird leider (noch) nicht unterstützt. Siehe https://github.com/drolbr/Overpass-API/issues/589

Ich bitte vielmals um Entschuldigung, in meiner ersten Anfrage fehlte ein Komma; mein Fehler; tut mir leid. So wäre es richtig gewesen:

…möchte ich eine Overpass-Abfrage, die Restaurants etc. findet,
aber solche ohne website=* / url=* … ausschließt.

Auch zum Verstehen finde ich meinen ursprünglichen Ansatz mit IN und OUT recht gut, mal in Prosa:
IN: alle NWR mit “amenity” = restaurant ODER cafe ODER bar ODER pub
OUT1: alle NWR (OHNE “website” = * UND OHNE “url” = )
OUT2: Alle NWR mit “website:menu”=

RESULT = IN - OUT1 - OUT2

OUT1 soll die ausschließen, die gar keine Internet-Präsentation haben; die haben auch keine Speisekarte im Internet.
OUT2 soll die ausschließen, die bereits ein Merkmal “website:menu”=* haben.

Danke, Michael

Ah, die Tücken der doppelten Verneinung, vielleicht hätte ich einen Blick in den aktuellen Schwerpunkt werfen sollen :smiley:

Also dann eher so etwas:


[bbox:{{bbox}}];
nwr["amenity"~"^(restaurant|cafe|bar|pub)$"][~"^(website|url)$"~"."][!"website:menu"];
out geom;

Edit: url und website geändert auf regulären Ausdruck…

Funktioniert, vielen Dank! Nach Wiki habe ich noch fast_food ergänzt:

[bbox:{{bbox}}];
nwr["amenity"~"^(restaurant|cafe|bar|pub|fast_food)$"](if:is_tag("website") + is_tag("url") > 0)[!"website:menu"];
out geom;

Vielleicht noch im ersten Teil

nwr["shop"="street_vendor"]

ergänzen?

Weil in OSM keine Internetadresse eingetragen ist haben die Restaurants auch keine Speisekarte im Internet ? :roll_eyes:

Ja, “hier”(in meiner Nähe schon) weil ich “website”=* eingetragen habe. Grundsätzlich ist es m.E. weniger sinnvoll, eine Speisekarte ins Internet zu stellen aber Adresse und Telefonnummer und ein Bild der Lokation nicht darzustellen …

vielleicht wurde auch eine vorhandene Website nur noch nicht in OSM erfasst. Nach Deinem Vorgehen werden diese weiterhin nicht erfasst bleiben.

Es gibt externe Reservierungsdienste, die haben ggf. Speisekarten, auch wenn das Restaurant selbst keine Webseite hat.

Ich dachte, die Overpass-Abfrage sollte nicht nur für Dich in Deinem Gebiet sein sondern allen Teilnehmern der Wochenaufgabe zur Verfügung gestellt werden. Liege ich da falsch ?