Das geht beispielsweise mit Overpass-Turbo. Die Frage ist natürlich, wie komplex man das gestalten will. Solange man sich mit den Basis-Access-Tags begnügt und nicht eventuelle Conditional-Tags auswertet, hält sich der Aufwand in Grenzen. Hier Beispiele für entsprechende Abfragen (Link führt die Abfrage direkt aus, ansonsten Kartenausschnitt verschieben und erneut auf “Ausführen” klicken - Klick auf die markierten Ergebnisse in der Karte zeigt direkt die Tags des jeweiligen Weges an):
Fußgänger:
way[highway][foot]({{bbox}})->.a;
(
(way[highway][access][access!="yes"][access!="permissive"]({{bbox}}); - way.a;);
way.a[foot!="yes"][foot!="designated"][foot!="official"][foot!="permissive"];
);
out body;
>;
out skel qt;
Radfahrer:
way[highway][vehicle]({{bbox}})->.a;
way[highway][bicycle]({{bbox}})->.b;
(
(way[highway][access][access!="yes"][access!="permissive"]({{bbox}}); - (way.a; way.b;););
(way.a[vehicle!="yes"][vehicle!="permissive"]; - way.b;);
way.b[bicycle!="yes"][bicycle!="designated"][bicycle!="official"][bicycle!="permissive"];
);
out body;
>;
out skel qt;
PKW:
way[highway][vehicle]({{bbox}})->.a;
way[highway][motor_vehicle]({{bbox}})->.b;
way[highway][motorcar]({{bbox}})->.c;
(
(way[highway][access][access!="yes"][access!="permissive"]({{bbox}}); - (way.a; way.b; way.c;););
(way.a[vehicle!="yes"][vehicle!="permissive"]; - (way.b; way.c;););
(way.b[motor_vehicle!="yes"][motor_vehicle!="permissive"]; - way.c;);
way.c[motorcar!="yes"][motorcar!="permissive"];
);
out body;
>;
out skel qt;
Um es erst einmal nicht zu kompliziert zu machen, habe ich komplett ignoriert, dass bestimmte Wegarten implizit für bestimmte Nutzerklassen tabu sind (beispielsweise, dass ein Auto nicht auf highway=footway fahren bzw. ein Fußgänger nicht auf highway=motorway laufen kann). Ausnahme davon ist nur, wenn jemand trotzdem Access-Tags verteilt hat, die eine entsprechende Einschränkung explizit vornehmen.
Ferner wird so etwas wie frei für Lieferverkehr (access “delivery”) o. ä. wie gesperrt gehandhabt. Nur “yes”, “permissive” und bei Fußgänger/Radfahrern zusätzlich noch “designated” und “official” habe ich als “frei” gewertet.
Die Problematik ist nun noch, dass die Access-Tags hierarchisch organisiert sind und immer nur das speziellste für den jeweiligen Nutzer Gültigkeit hat. Am Beispiel für PKW sei nun die Idee erläutert damit umzugehen: Zunächst werden alle Highways, die vom Access-Elternelement ein spezielleres Access-Tag in Richtung Motorcar haben, in Mengen gespeichert, weil sie innerhalb der Abfrage mehrfach benötigt werden. Anschließend werden alle Highways, die ein allgemeines Access-Tag haben, welches keinen freien Zugang impliziert, in die darzustellende Wegemenge eingebracht, es sei denn, es gibt bei diesen Highways auch noch ein spezielleres Tag (vehicle, motor_vehicle oder motorcar - das waren die vorher angelegten Mengen .a, .b und .c). Denn wenn es ein spezielleres Tag gibt, ist das allgemeinere Tag zu ignorieren. Danach werden alle Highways mit einem vehicle-Tag (Menge .a), welches keinen freien Zugang impliziert, hinzugenommen, es sei denn, dass wiederum ein spezielleres Tag (motor_vehicle oder motorcar - Menge .b und .c) dort vorhanden ist. Anschließend kommen die Highways mit nicht freien Zugangstag für motor_vehicle (Menge .b) hinzu, von denen die mit einem speziellen motorcar-Tag (Menge .c) abgezogen werden. Zum Schluss kommen noch die Highways mit einem nicht freien motorcar-Tag (Menge .c) hinzu.
PS: Wer sich wundert, warum im Beispielgebiet so viele Wege für Fußgänger gesperrt sind - ein Klassiker-Fehler: “access=agricultural”.