Straßenabschnitte mit einer bestimmten Ausrichtung

Hallo,

das ist mein erster Beitrag hier im Forum, daher erstmal ein freundliches hallo an alle.

Ich bin in Sachen OSM und Overpass ein Neuling. Seit einiger Zeit lese ich mich in das Thema ein und habe bereits meine ersten, kleinen und vorsichtigen Kartenergänzungen hinter mir. Der Grund für diesen Thread ist folgende Frage: ist es möglich, Straßenabschnitte mit einer bestimmten geografischen Ausrichtung, also z.B. Ost-West oder West-Ost (die Richtung spielt keine Rolle) mit einer gewissen Toleranz und Mindestlänge zu finden?

Beispiel:
https://overpass-turbo.eu/s/163M

Wenn ich nur die Ost-West/West-Ost Straßenstücke mit mindestens 300 m Länge und Richtungstoleranz von 5° haben möchte, sollte (falls ich nichts übersehen habe) nur ein kurzes Stück der L 859 Nienser Straße zwischen Langwarden und Burhave bleiben. Geht das? Wenn ja, wie?

EDIT:

Für eine selbstgestrickte (selbstprogrammierte, externe = nicht overpass-basierte) Lösung habe ich bereits eine Idee, aber natürlich würde ich gerne das Rad nicht neu erfinden wollen. Wenn es also mit Overpass geht, würde ich es bevorzugen.

Was für ein fulminanter Einstieg ins Forum - der erste Beitrag wird zum Rohrkrepierer. :slight_smile: Ehrlicherweise habe ich das auch befürchtet. Ist also nicht so schlimm. Zur Sache.

Ich habe weiter tief in Google gegraben, um mir die Arbeit zu ersparen und leider war ich nicht fündig. Also habe ich mir provisorisch etwas selbst gebastelt. Das Ergebnis davon, bezogen auf das Beispiel von oben, sieht so aus:
https://overpass-turbo.eu/s/16bR

Für die Datenabfrage habe ich das benutzt:

[out:json];

way[highway~"motorway|trunk|primary|secondary"]({{bbox}});

out body;
>;
out skel qt;

In dieser erster Iteration ist leider nicht alles erreicht, was ich mir gewünscht habe. Ich hole nämlich alle Wege und laufe für jeden Weg vom Node zu Node und berechne für das kleine Stück eines Weges die Richtung. Wenn sie in dem gewünschten Bereich liegt, speichere ich beide Nodes. Damit ist schon der Nachteil klar - ich habe kein zusammenhängendes Teil des Weges, sondern nur lose Nodes. Damit kann ich das Filterkriterium mit der Länge nicht benutzen. Viele dieser Wegteile bestehen nur aus zwei Nodes, weil sie ein Stück in einer Kurve oder in einem Kreisel sind (in dem Beispiel hier kommt das nicht vor).

Aber ich habe schon eine Idee, wie ich das lösen kann.

Weiß jemand, ob es möglich ist, aus den Node IDs einen Weg in der Karte zu zeichnen? Also mit anderen Worten: ich möchte keine Kreise sehen, sondern Linien.

Hiermit bekommst Du alle Wege, die mindestens einen der Knoten enthält:

node(id:263915484,263915485,263915486,263915489,263915522,263915524,263915526,263915529,395292988,2282363754,3269359052,4535749114,4535749133,5923303747,6858521325)-> .nodes;

way(bn.nodes);
out geom; 

Aber leider sind ein paar dabei, die Du nicht willst.

Danke, aber wie Du es schon gesagt hast - genau das möchte ich nicht. Das Ziel ist, nur die Abschnitte zu sehen, die die Filterkriterien erfüllen.

In der Overpass-Doku habe ich das Statement make gefunden. Könnte man nicht damit on-the-fly neue ways bauen und sie dann anzeigen? In den Beispielen wurde make leider für andere Zwecke verwendet. Abgucken war nicht drin.

Ich denke das hängt viel mehr damit zusammen, dass die ersten 3 Beiträge eines Forennutzers manuell freigeschaltet werden müssen. Für den Ersteller und Moderatoren sind sie bereits sofort sichtlich (ich meine leider ohne einen Hinweis), aber niemand sonst sieht sie (und auch das Thema), wodurch natürlich dann erstmal niemand antworten kann.
Ich war da anfangs auch verwundert von und ist störend, weil die Beiträge dann 1-2 Tage später freigeschaltet sind, aber quasi nicht mehr als “neu” für andere Nutzer erscheinen bzw. in längeren Themen dann irgendwo mittendrin stehen und gar nicht mehr beachtet werden.

Der erste schritt wäre ja via Overpass-API die Nodes eines Weges zu identifizieren, welche Anfangs und Endpunkt eines solchen Abschnittes sind.
Das hast du jetzt manuell gemacht? Oder wie kamst du zu dem Ergebnis? Denn deine Datenabfrage gibt das ja nicht her, dass hier geschaut wird, welche Abschnitte “fast waagerecht” sind.

Also schon den Teil erachte ich als ziemlich schwierig via Overpass-API selbst zu lösen. Vereinfacht müsste man je Abschnitt mit den lon/lat der 2 Punkte den “Anstieg” berechnen und dann vergleichen ob noch im Tolleranzbereich. Bereits das Berechnen wird schwierig (wenn überhaupt) zu realisieren und dann irgendwie den Wert halt noch vergleichen und davon dann abhängig das Punktepaar an 2. übergeben:

Richtig ist, man müsste halt quasi neue temporäre/virtuelle Ways erzeugen. Denn Overpass-Turbo kann dir nur ganze Objekte anzeigen, also Nodes als Punkte oder einen Way, aber dann halt mit all seinen Punkten/Abschnitten (was du ja nicht willst).
Also müsstest neue Objekte/Ways erzeugen, aus den oben genannten/ermittelten Punktepaaren. Theoretisch wäre jetzt hier ein

make way ::id="0", ::geom = ...

dein Weg - aber:
Es gibt hierbei keinen Weg, dass du die Geokoordinaten in dem neu generiertem Weg so reinbekommst, dass diese für die Kartendarstellung von Overpass-Turbo verwendet werden.
siehe dazu: https://github.com/drolbr/Overpass-API/issues/525
(geht das zwar um ein Node, aber im Prinzip die gleiche Sache)
Hintergrund ist wohl, dass es absichtlich nicht gewollt ist, dass man somit on-the-fly neue gültige OSM-Objekte erzeugt, weil man dann befürchtet, dass es überhand nimmt, dass automatisiert Sachen in OSM geändert werden (halt jemand bastelt sich mal fix eine Overpass-Turbo-Abfrage, erzeugt damit neue Objekte, weil er meint das wäre schon richtig so und füttert damit OSM).


Da also somit ziemlich sicher die von dir gewünschte Darstellung in Overpass-Turbo nicht klappen wird und du eh eine externe Lösung finden muss, würde ich mir dann auch nicht den Kopf zerbrechen, wie du die Punktepaare via Overpass-Turbo ermittelst. Denke das ließe sich Extern dann auch einfacher/besser lösen.

Gruß,
asca

PS: Wie sieht deine angedachte externe Lösung denn aus?

Nein, das habe ich natürlich nicht manuell gemacht. Das Gebiet wo ich das anwenden möchte, ist ein paar tkm^2 groß. Wie schon gesagt, nachdem ich bei meiner Recherche nicht fündig war, habe ich mir dafür ein kleines Programm geschrieben. Ich lese die JSON-Ausgabe aus Overpass ein und extrahiere alle ways. Zusätzlich extrahiere ich alle nodes und transformiere die lat/lon-Koordinaten nach UTM, denn für die Berechnung von Richtungswinkeln und Streckenlängen brauche ich was Kartesisches. Für die Koordinatenumrechnungen benutze ich https://proj.org/. Dann laufe ich über alle ways und in jedem way über die node-Liste und berechne für alle Paare den Winkel. Die Paare, die in dem Soll-Winkelbereich liegen, merke ich, bereinige am Ende um Dupplikate und benutze dann bei der Overpass-Abfrage, wie oben gezeigt. Das Ganze sind ein paar Zeilen Lisp-Code, am Ende sind das ein paar Funktionsaufrufe. Das ist zwar sehr speziell auf meinen Fall bezogen, aber wenn das Interesse besteht, kann ich den Code dafür natürlich offenlegen. Ist ja kein Geheimnis. Nur fürchte ich, dass leider nicht viele was mit Lisp anfangen können.

Genau an dieses make way habe ich eben gedacht - sehr schade, dass das nicht geht. Den Grund für nicht gewünschte automatisierte Änderungen kann ich sehr gut verstehen, aber könnte man nicht zwischen Datenändern und Anzeigen trennen können?