Overpass Abfrage: Multipolygone mit anderen Rollen als inner / router

Ich möchte innerhalb einer bbox alle Multipolygon-Relation finden, die Member haben, deren Rollen entweder leer, oder etwas anderes als inner oder outer sind.
Hat dazu schonmal jemand eine Overpass-turbo-Abfrage erstellt? Ich habs selbst versucht, bin aber gescheitert :confused:

Relationen mit Member, die alle die Rolle “leer” haben, würde so funktionieren:


rel({{bbox}})->.relations;

foreach .relations -> .relation (

  (
    node(r.relation);
    way(r.relation);
    rel(r.relation);
  )->.elem_all;

  (
    node(r.relation:"");
    way(r.relation:"");
    rel(r.relation:"");
  )->.elem_blank;
  
  rel.relation( if:elem_all.count(nodes)     == elem_blank.count(nodes) &&
                   elem_all.count(ways)      == elem_blank.count(ways)  &&
                   elem_all.count(relations) == elem_blank.count(relations));

  out;
);

Ansonsten ist mir die Bedingung mit dem inner/outer so wie sie formuliert ist nicht ganz klar, aber vom Prinzip her läuft das analog.

Für leere Rollen konnte ich dies hier nutzen:


[out:xml][timeout:95];
relation["type"="multipolygon"]({{bbox}}) -> .mps;
way(r.mps:"");
rel(bw:"");
(._;>;);
out meta qt;

Gültige Rollen in Multipolygonen sind nur “inner” und “outer”. Ich möchte also alles andere finden, d.h. leere Rollen oder anderes wie bspw. “oputer” (Tippfehler).

Ah, ok, das war wichtig. Lösung kommt gleich.


rel({{bbox}})[type=multipolygon]->.relations;

foreach .relations -> .relation (

  (
    node(r.relation);
    way(r.relation);
    rel(r.relation);
  )->.elem_all;

  (
    node(r.relation:"inner");
    way(r.relation:"inner");
    rel(r.relation:"inner");
  )->.elem_inner;
  
  (
    node(r.relation:"outer");
    way(r.relation:"outer");
    rel(r.relation:"outer");
  )->.elem_outer;
  
  
  rel.relation( if:elem_all.count(nodes)     > elem_inner.count(nodes) + 
                                               elem_outer.count(nodes) ||
                   elem_all.count(ways)      > elem_inner.count(ways)  +
                                               elem_outer.count(ways)  ||
                   elem_all.count(relations) > elem_inner.count(relations) +
                                               elem_outer.count(relations));

  out;
);

Die query findet bei mir leider nichts. :frowning:
Bsp. zum testen:

Speziell für Relation 5405247 sieht das hier so aus:

Wichtig: in overpass turbo auf den “Daten” Tabreiter wechseln!!

… oder aus dem “out;” ein " out center;" machen…

Ah, jetzt funktionierts. Ich hatte übersehen, dass da ein Scollbalken in post #4 ist und nur die halbe query kopiert… :smiley:

Danke.