OverpassTurbo: Teilstring im Value eines Keys finden

Hallo,

ich möchte einen Teilstring in Werten des Key phone finden:

[out:json][timeout:25];
{{geocodeArea:Germany}}->.searchArea;
// gather results
(
nwr [~".*"~"116117",i](area.searchArea);
);
// print results
out meta;

Die Fehlermeldung:

Ajax-Fehler
Während des Ausführens der Overpass Query ist ein Fehler aufgetreten!
Request rejected. (e.g. server not found, request blocked by browser addon, request redirected, internal server errors, etc.)
Error-Code: error (0)

Systemfehler oder Fehler in meiner Abfrage? Und: Ist die Abfrage überhaupt richhtig, um z.B. die Werte

  • 116117
  • 0116117
  • +49 116117

zu finden?

Warum nicht einfach

[out:json][timeout:25];
// fetch area “Deutschland” to search in
{{geocodeArea:Deutschland}}->.searchArea;
// gather results
nwr["phone"~"116117"](area.searchArea);
// print results
out geom;

Es gäbe da ja noch fax, contact:phone und contact:fax

Sicher gibt es das, aber die Frage im Ausgangspost war:

was bedeutet, dass die Werte in fax, contact:phone, contact:fax, mobile … irrelevant sind.

Edit:
Beim ärztlichen Bereitschaftsdienst wird gerne auch contact:phone verwendet und auch gerne ein Leerzeichen zwischen 116 und 117.

Will man diese ebenfalls finden, so ergänzt man ein [ ]? für das optionale Leerzeichen und die Suche in weiteren Keys durch Verwendung von Klammern:

[out:json][timeout:25];
// fetch area “Deutschland” to search in
{{geocodeArea:Deutschland}}->.searchArea;
// Findet 116117 und 116 117 in den Keys phone und contact:phone
(
  nwr["phone"~"116[ ]?117"](area.searchArea);
  nwr["contact:phone"~"116[ ]?117"](area.searchArea);
);
  // print results
out geom;

Damit durchsuchst Du allle keys in DE nach dem Muster. Wahrscheinlich überlastet das den Server und es kommt zur gezeigten Fehlermeldung.

Ich bin erstaunt, dass diese Syntax überhaupt durchgeht. Aber tatsächlich scheint es erlaubt zu sein, und wenn man das Matching der Keynamen einschränkt, liefert Overpass auch Ergebnisse:

[out:json][timeout:25];
{{geocodeArea:Germany}}->.searchArea;
// gather results
(
nwr [~"^(contact:.*|phone)$"~"116 *117",i](area.searchArea);
);
// print results
out meta;
2 Likes

Danke @eserte, funktioniert! Wenn ich das richtig sehe findet Deine Code

[contact:]phone == *116[ ]117 # Text in [ist fakultativ]
Aber was bedeuten die Zeichen $"~" *; anders gefragt: Eine Erklärung der Sytax / Sonderzeichen wäre fein …

Reguläre Ausdrücke oder englisch regular expressions (kurz regex) beschreiben Muster. Die Bedeutung einiger Zeichen ist dabei praktisch immer gleich, andere funktionieren je nach Auswerte-Programm unterschiedlich.
Im Netz findet man zig Tutorials, z.B. Regex Tutorial - How to write Regular Expressions? - GeeksforGeeks

Das Dollarzeichen gehört hier noch zum regulären Ausdruck. Die einzelnen besonderen Zeichen erklärt:

  • ^: Anfang der Zeichenkette
  • (: Beginn der Gruppe (in diesem Fall mit mehreren Alternativen)
  • .*: 0 oder mehr beliebige Zeichen
  • |: nächste Alternative in der Gruppe folgt
  • ): Ende der Gruppe
  • $: Ende der Zeichenkette

Mit ^ und $ verhindert man hier, dass auch Zeichenketten wie blaphone oder phonebla erkannt werden.