Overpass Turbo - 2 oder mehr Linien mit Offset für Abschnitt

Hi zusammen,

versuche mir gerade in Overpass etwas zu bauen, dass mir die Geschwindigkeiten pro Richtung (falls vorhanden) und conditions anzeigt. Eine Abfrage ist ja kein Problem, aber gibt es irgendwie wie in JOSM mehrere Abfragen dafür zu haben die dann einen bestimmten offset nach links oder rechts von der Linie haben je nach Fahrtrichtung und ob noch eine condition zusätzlich gesetzt ist?

Warum nimmst du nicht in josm den Mappaint Style “Maxspeed” ? Der macht das doch schon (Farblich die maxspeeds auch je richtung). Der kann nur keine conditionals.

Flo

Ich versuche den Overpass auszutesten und das wäre eine Beispiel-Fall-Lösung zum Speichern, falls ich mal kein JOSM zur Verfügung habe sondern nur einen Browser.

Das es mit JOSM und dem Filter geht hatte ich ja selbst geschrieben, ich würde es halt auch gerne im Overpass nachbauen :smiley:

Mit overpass turbo kann man nur eine einzige Query und auch nur einen einzigen Layer definieren. Offsets geht halbwegs (siehe Link unten). Wahrscheinlich reicht das für deine Anforderungen aber nicht aus? Vielleicht postet du einfach mal, was du bisher schon gebaut hast. Alternativ Bild/Skizze mit dem erwarteten Ergebnis wäre auch gut.

https://github.com/tyrasd/overpass-turbo/pull/117

hmm mist, stimmt Gedankenfehler von mir, dass man nur einmal mit dem Result arbeiten kann. Hatte irgendwie auf CSS like :before :after gehofft um zwei Sachen zu erzeugen. Wobei ich aber auch gerade an dem nächsten Problem hänge, dass ich nicht wie in JOSM auf die Linienrichtungen eingehen kann beim offset.

Das genannte Style Modul von Flohoff trifft meinen Versuch sehr gut den ich nachbauen wollte um das auszuprobieren.
https://josm.openstreetmap.de/wiki/Styles/Maxspeed

Erste Idee von mir war, man könnte ja alle Objekte 2x abfragen und einmal mit “convert” halt ein Tag “offset_side=left” und beim anderen mal “right” vergeben. Aber weil das ja nicht geht, Objekte mit Overpass zu duplizieren und konvertieren (und die Geometrie für Overpass-Turbo verarbeitbar zu erhalten), kam ich dann auf die ziemlich stumpfe Lösung einfach mit PHP einen Pre-Prozessor zu schreiben, was genau das tut:
https://overpass-turbo.eu/s/1aNG
Weil mein verwendeter Testserver kein eigenes Zertifikat für https hat (muss ich echt mal machen…), bitte zuvor einmal https://a404.de/dnd/osm/multioverpass/left_right_copy/interpreter direkt aufrufen und abnicken, dass man das abweichende Zertifikat akzeptiert. Dann sollte es in Overpass-Turbo funktionieren.

Eingebunden wird hier halt folgendes kleine PHP-Script:


<?php
$context = stream_context_create(array('http' =>
    array(
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded',
        'content' => http_build_query(array('data' => $_POST['data']))
    )
));
$overpassAnswer = file_get_contents('https://overpass-api.de/api/interpreter', false, $context);
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
if($overpassAnswer === FALSE) {
  // Overpass-Anfrage fehlerhaft:
  echo json_encode(array('error' => "overpass-request failed, request data: ".$_POST['data'])); 
} else {
  $overpassAnswerJSON = json_decode($overpassAnswer, true);
  $elements = array();
  foreach($overpassAnswerJSON['elements'] as $element) {
    $elementLeft = $element;
    $elementLeft['tags']['offset_side'] = 'left';
    
    $elementRight = $elementLeft;
    $elementRight['id'] += 100000000000;
    $elementRight['tags']['offset_side'] = 'right';

    $elements[] = $elementRight;
    $elements[] = $elementLeft;
  }
  $overpassAnswerJSON['elements'] = $elements;
  
  echo json_encode($overpassAnswerJSON);
}

Damit ein Objekt 2x existieren darf, wird bei dem “rechten” Weg die ID mit 100000000000 addiert.

Damit sollte es dir möglich sein, das Style in Overpass-Turbo umzusetzen. Wäre schön, wenn du vl. selbst einen PHP-Space hast, wo du das Script selbst hosten kannst. Ich übernehme keine Garantie für langfristige Lauffähigkeit.

Gruß,
asca

Also funktioniert mit dieser Abfrage schonmal ganz gut:
https://overpass-turbo.eu/s/1aNR

Sieht dann so aus:
Links die Straße ist “zweilinig”, sowie rechts die Straße ebenso.

Mir kam gerade noch in den Sinn, dass man ja im Preprozessor eigentlich auch nur dann eine Kopie erzeugen muss, wenn es maxspeed:for-/backward gibt. Da es recht selten ist, reduziert sich somit ja die Datenmenge um fast 50%, was den Browser schont :wink:
Ist dann halt nur nicht mehr so allgemeingültig nutzbar der Preprozessor.
https://overpass-turbo.eu/s/1aNY


<?php
$context = stream_context_create(array('http' =>
    array(
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded',
        'content' => http_build_query(array('data' => $_POST['data']))
    )
));
$overpassAnswer = file_get_contents('https://overpass-api.de/api/interpreter', false, $context);
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
if($overpassAnswer === FALSE) {
  // Overpass-Anfrage fehlerhaft:
  echo json_encode(array('error' => "overpass-request failed, request data: ".$_POST['data'])); 
} else {
  $overpassAnswerJSON = json_decode($overpassAnswer, true);
  $elements = array();
  foreach($overpassAnswerJSON['elements'] as $element) {
    $elementLeft = $element;
    $elementLeft['tags']['offset_side'] = 'left';
    if(array_key_exists('maxspeed:backward', $elementLeft['tags']) || array_key_exists('maxspeed:forward', $elementLeft['tags'])) {
      $elementRight = $elementLeft;
      $elementRight['id'] += 100000000000;
      $elementRight['tags']['offset_side'] = 'right';      
      $elements[] = $elementRight;
    }
    $elements[] = $elementLeft;
  }
  $overpassAnswerJSON['elements'] = $elements;
  
  echo json_encode($overpassAnswerJSON);
}

cool danke :slight_smile:

hab dich jetzt hoffentlich nicht um die Nacht gebracht :smiley: