x

Radrouten darstellen


  1. Radrouten darstellen · borish-osm (Gast) · 22.03.2014 22:07 · [flux]

    Hallo,

    ich will Radrouten http://wiki.openstreetmap.org/wiki/Tag:route%3Dbicycle darstellen. Dazu habe ich mit

    select␣way␣from␣planet_osm_line␣where␣route='bicycle'
    

    Radrouten extrahiert. Damit werden aber nur wenige Radrouten dargestellt, insbesondere fehlt der Elberadweg (Radfernweg D 10). MTB-Strecken werden gar nicht dargestellt, wenn ich route='mtb' verwende. Muß ich anders vorgehen?

    Grüße,
    Boris


    • Re: Radrouten darstellen · Netzwolf (Gast) · 22.03.2014 23:11 · [flux]

      Nahmd,

      borish-osm wrote:

      ich will Radrouten http://wiki.openstreetmap.org/wiki/Tag:route%3Dbicycle darstellen. Dazu habe ich mit

      select␣way␣from␣planet_osm_line␣where␣route='bicycle'
      

      Radrouten extrahiert. Damit werden aber nur wenige Radrouten dargestellt, insbesondere fehlt der Elberadweg (Radfernweg D 10). MTB-Strecken werden gar nicht dargestellt, wenn ich route='mtb' verwende. Muß ich anderes vorgehen?

      Routen werden durch Relationen ausgedrückt, die die zur Route gehörenden Wegabschnitte sammeln. Dem Way selbst kann man (meistens) nicht ansehen, dass er zu einer Route gehört.

      Der Elberadweg besteht sogar aus mehreren Relationen, als Beispiel der Abschnitt J: Magdeburg - Dessau-Roßlau.

      Gruß Wolf


    • Re: Radrouten darstellen · borish-osm (Gast) · 23.03.2014 10:00 · [flux]

      Es gibt hier viele Relationen. planet_osm_line ist eine Relation, route soll gemäß http://wiki.openstreetmap.org/wiki/DE:Relation:route eine Relation sein, wobei mir unklar ist, welche Elemente diese enthält. Wie heißt die Relation, deren Elemente die Radrouten sind, und mit welcher SQL-Abfrage erhalte ich diese?


    • Re: Radrouten darstellen · EvanE (Gast) · 23.03.2014 10:32 · [flux]

      borish-osm wrote:

      Es gibt hier viele Relationen. planet_osm_line ist eine Relation, route soll gemäß http://wiki.openstreetmap.org/wiki/DE:Relation:route eine Relation sein, wobei mir unklar ist, welche Elemente diese enthält. Wie heißt die Relation, deren Elemente die Radrouten sind, und mit welcher SQL-Abfrage erhalte ich diese?

      Ich kenne mich mit Postgis-Datenbanken nicht aus, insbesondere welche Informationen von Routen beim Import erhalten bleiben und in welche Postgis-Datenbank-Elemente das gespeichert wird. Dennoch denke ich, dass du als ersten Ansatz in deiner Select-Anweisung
      "select way from planet_osm_line" durch
      "select relation from planet_osm_line"
      ersetzen solltest. Ob du das dann noch weiter verfeinern musst, um die Wege der Relation zu ermitteln, kann ich dir nicht sagen, da es vom Import abhängt, wie Routen-Relationen in der Postgis-Datenbanken gespeichert werden.

      Es kann Probleme geben, wenn Routen ihrerseits Routen-Relationen als Element enthalten. Im von Netzwolf in Post #2 verlinkten Beispiel wären das die zwei Alternativ-Routen. Da musst du selber Versuche zu ausführen.

      Wenn es dir vor allem um die Darstellung der Routen geht, werden dich insbesondere die in den Routen-Relationen enthaltenen Weg interessieren, und weniger die Sub-Relationen.

      Es gibt keine Relation, die alle Radwege-Relationen enthält (ist auch unnötig). Andererseits gibt es Fernrad-Routen, die aus Gründen der Handbarkeit in mehrere Abschnitte unterteilt sind. Dazu gibt es dann eine Relation mit type=supperroute, die die einzelnen Abschnittsrelationen als Mitglieder enthält und nur diese enthalten sollte, also keine Wege oder Punkte. Wie solche Superrouten beim Import behandelt werden (wenn überhaupt) entzieht sich meiner Kenntnis.

      HTH + viel Erfolg
      Edbert (EvanE)


    • Re: Radrouten darstellen · borish-osm (Gast) · 23.03.2014 11:37 · [flux]

      Ich bekomme

      ERROR: column "relation" does not exist

      . In http://wiki.openstreetmap.org/wiki/Osm2pgsql/schema steht:

      Notice that relations are not imported directly. Ways which are members of relations are imported in a special manner

      und

      planet_osm_line

      This table contains all non-closed ways which were imported. Additional rows are created for ways which are members of type=route relations:
      - For each relation of type=route, its ways are concatenated into "chunks" of consecutive ways
      - One row is created for each of these chunks

      Dies lässt vermuten, daß in der Datenbank keine Routen-Relationen enthalten sind, sondern nur die Wege, aus denen sie bestehen. Leider wird das Wesen dieser "chunks" nicht genauer erklärt. Wenn dies Wege sind, wäre die Abfrage "select way" korrekt.


    • Re: Radrouten darstellen · couchmapper (Gast) · 23.03.2014 11:58 · [flux]

      Wenn's nicht unbedingt osm2pgsql sein muss: von lonvia gibt's eine fertige Lösung auf osmosis-Basis.

      Beispiel:
      http://mtb.waymarkedtrails.org
      http://cycling.waymarkedtrails.org

      Quellen:
      https://github.com/lonvia/waymarked-trails-site
      https://github.com/lonvia/osgende


    • Re: Radrouten darstellen · EvanE (Gast) · 23.03.2014 12:18 · [flux]

      borish-osm wrote:

      planet_osm_line
      This table contains all non-closed ways which were imported. Additional rows are created for ways which are members of type=route relations:
      - For each relation of type=route, its ways are concatenated into "chunks" of consecutive ways
      - One row is created for each of these chunks

      Dies lässt vermuten, daß in der Datenbank keine Routen-Relationen enthalten sind, sondern nur die Wege, aus denen sie bestehen. Leider wird das Wesen dieser "chunks" nicht genauer erklärt. Wenn dies Wege sind, wäre die Abfrage "select way" korrekt.

      Ich sagte ja bereits, dass ich mich mit Postgis-Datenbanken und dem Import nicht wirklich auskenne (bis auf das, was ich so im Forum lese). Das "select way" scheint also richtig zu sein.

      Ich vermute, dass es Probleme beim Import einiger Relationen gibt. Schau mal im Import-Log, ob es da Hinweise auf verworfene Routen-Relationen gibt. Wie ich schon erwähnte, könnten Sub-Relationen, wie sie beim Beispiel von Netzwolf enthalten sind, ein Problem für den Import darstellen.

      Edbert (EvanE)


    • Re: Radrouten darstellen · wambacher (Gast) · 23.03.2014 12:19 · [flux]

      borish-osm wrote:

      Dies lässt vermuten, daß in der Datenbank keine Routen-Relationen enthalten sind, sondern nur die Wege, aus denen sie bestehen. Leider wird das Wesen dieser "chunks" nicht genauer erklärt. Wenn dies Wege sind, wäre die Abfrage "select way" korrekt.

      die zusammengefaßten ways der routen stehen in planet_osm_line und haben die negative id der relation.

      also für rel 4711 -> select * from planet_osm_line where osm_id=-4711;
      Es kommen mehrere Datensätze zurück, wenn die Route verzweigt ist.

      Gruss
      walter


    • Re: Radrouten darstellen · borish-osm (Gast) · 23.03.2014 15:13 · [flux]

      Nachdem ich die Sachsen-Karte neu importiert habe, werden mit meiner SQL-Anfrage aus #1 die Radrouten dargestellt. Vorher hatte ich drei Karten mit

      osmosis␣--read-pbf␣$1␣--read-pbf␣$2␣--merge␣--write-pbf␣$3␣omitmetadata=true
      

      gemerged, weil ganz Europa möglicherweise nicht auf meine 240 GB SSD passt.

      MTB-Strecken werden aber immernoch nicht dargestellt. Außerdem will ich die Nachbarländer auch auf meiner Karte haben. Wenn osmosis meine Daten verunstaltet, was soll ich dann tun?


    • Re: Radrouten darstellen · borish-osm (Gast) · 23.03.2014 21:31 · [flux]

      Ein weiteres Problem: Auch mit

      select␣distinct␣way␣from␣planet_osm_line␣where␣route='bicycle'
      

      werden Wege mehrfach gezeichnet. Mit obiger Anweisung sollte jeder Weg doch nur einmal in der Auswahl enthalten sein?


    • Re: Radrouten darstellen · EvanE (Gast) · 23.03.2014 22:11 · [flux]

      borish-osm wrote:

      Ein weiteres Problem: Auch mit

      select␣distinct␣way␣from␣planet_osm_line␣where␣route='bicycle'
      

      werden Wege mehrfach gezeichnet. Mit obiger Anweisung sollte jeder Weg doch nur einmal in der Auswahl enthalten sein?

      Nein warum sollte das so sein. Wie du in Post #5 zitierst hast gilt

      planet_osm_line
      ...
      - For each relation of type=route, its ways are concatenated into "chunks" of consecutive ways
      - One row is created for each of these chunks

      Das consecutive (fortlaufend) ist hier das Wesentliche. Ein Wegstück kann ja zu mehreren Relationen gehören. Und diese Relationen verzweigen sich unterschiedlich. Dadurch haben die Relationen unterschiedliche fortlaufende Abschnitte (jeweils als ein Weg in der Datenbank), was dazu führt, das jeder Abschnitt nur einmal gezeichnet wird, gemeinsame Wegstücke mehrerer Relationen jedoch ggfs. mehrmals.

      Edbert (EvanE)


    • Re: Radrouten darstellen · borish-osm (Gast) · 24.03.2014 09:32 · [flux]

      Wie kann ich dann die einzelnen Wegstücke erhalten, die in den "chunks of consecutive ways" enthalten sind?


    • Re: Radrouten darstellen · maxbe (Gast) · 27.03.2014 12:08 · [flux]

      borish-osm wrote:

      Wie kann ich dann die einzelnen Wegstücke erhalten, die in den "chunks of consecutive ways" enthalten sind?

      z.B. so:

      Man sucht sich eine schöne Route raus:

      osm=>␣select␣osm_id,name,route␣from␣osm_line␣where␣route='mtb'␣and␣osm_id<0␣limit␣100;
      

      und findet den Weg -957559 (also die Relation 957559) "Ötztal Mountainbike Trail":

      osm=>␣select␣osm_id,route,st_length(way)␣from␣osm_line␣where␣osm_id='-957559';
      osm_id␣␣|␣route␣|␣␣␣␣st_length
      ---------+-------+------------------
      -957559␣|␣mtb␣␣␣|␣22279.0959345491
      -957559␣|␣mtb␣␣␣|␣15613.6718845438
      -957559␣|␣mtb␣␣␣|␣44601.1178826087
      -957559␣|␣mtb␣␣␣|␣4421.68715452259
      -957559␣|␣mtb␣␣␣|␣␣24465.633479481
      (5␣rows)
      

      Dieser Weg ist in fünf Teile aufgeteilt, die unsortiert aus der Datenbank rausfallen. Falls man die in eine sinnvolle Reihenfolge bringen wollte, müsste man da noch Arbeit und Intelligenz reinstecken, wie man das sortiert. Falls es nur um die Darstellung geht könnte man das in eine KML-Datei umwandeln (z.B. mit diesem PHP-Progrämmchen) und auf der Karte darstellen.

      An den fett gemalten Stellen erkennt man auch die Stückelung der Route. Manchmal gibt es Verzweigungen, ein anderes Mal fehlt ein Stück in der Route.

      Grüße, Max


    • Re: Radrouten darstellen · maxbe (Gast) · 27.03.2014 19:17 · [flux]

      borish-osm wrote:

      Wie kann ich dann die einzelnen Wegstücke erhalten, die in den "chunks of consecutive ways" enthalten sind?

      Und weil ich vielleicht die Frage ganz falsch verstanden habe und du wirklich die einzelnen Wege haben willst:

      Die weitgehend uninterpretierten Daten stehen in der Tabelle "osm_rels", bei dir vermutlich "planet_osm_rels". MTB-Routen findet man mit

      osm=>␣select␣id␣from␣␣osm_rels␣␣where␣'{type,route}'<@tags␣and␣'{route,mtb}'<@tags␣limit␣100;
      

      und eine einzelne Realtion sieht dort so aus:

      select␣tags,members␣from␣osm_rels␣where␣id=957559;
      tags
      -----------------------------------------------------------------------------
      {type,route,route,mtb,ref,R11,network,mtb,name,"Ötztal␣Mountainbike␣Trail"}
      
      members
      -----------------------------------------------------------------------------
      {w230860184,"",w61650062,"",w64757514,"",w67651370,"",w67651367,""␣...
      

      tags ist ein Array der Form key,value,key,value...
      members ist ein Array der Form OSM_ID,role,OSM_ID... wobei der OSM_ID ein "w" vorangestellt ist, wenn es sich um eimnen Weg handelt, "n" steht für Node und "r" für Relation. Die role sind bei diesem Radweg leer. Da könnte aber auch "forward", "backward", "alternative" oder "information" (bei einem Node mit tourism=information) drinstehen


    • Re: Radrouten darstellen · borish-osm (Gast) · 28.03.2014 20:12 · [flux]

      Mein Problem ist, daß Wegstücke übereinander dargestellt werden, die von mehreren Radrouten genutzt werden: In

      sollten alle Radwege blau gestrichelt sein, an einigen Stellen überlappt die Strichelung und erzeugt eine durchgehende Linie. Deswegen möchte ich für alle Radrouten im Kartenausschnitt die paarweise verschiedenen Wegstücke extrahieren und darstellen, damit sich keine Wegstücke mehr überlappen.


    • Re: Radrouten darstellen · wambacher (Gast) · 28.03.2014 20:16 · [flux]

      borish-osm wrote:

      Mein Problem ist, daß Wegstücke übereinander dargestellt werden, die von mehreren Radrouten genutzt werden: In
      http://oi62.tinypic.com/s2w96a.jpg
      sollten alle Radwege blau gestrichelt sein, an einigen Stellen überlappt die Strichelung und erzeugt eine durchgehende Linie. Deswegen möchte ich für alle Radrouten im Kartenausschnitt die paarweise verschiedenen Wegstücke extrahieren und darstellen, damit sich keine Wegstücke mehr überlappen.

      versuch es mal mit select distinct way from ...

      gruss
      walter


    • Re: Radrouten darstellen · maxbe (Gast) · 28.03.2014 20:36 · [flux]

      borish-osm wrote:

      Mein Problem ist, daß Wegstücke übereinander dargestellt werden, die von mehreren Radrouten genutzt werden: In ...
      sollten alle Radwege blau gestrichelt sein, an einigen Stellen überlappt die Strichelung und erzeugt eine durchgehende Linie. Deswegen möchte ich für alle Radrouten im Kartenausschnitt die paarweise verschiedenen Wegstücke extrahieren und darstellen, damit sich keine Wegstücke mehr überlappen.

      Da sehe ich nur den langen steinigen Weg: Aus der osm_rels alle Radwege raussuchen, die Members ansehen und die dann markieren.

      Mache ich bei mir mit Wanderwegen auch einmal täglich des Nachts: Eine Spalte in der Tabelle osm_line namens "hiking_way", die auf true/false gesetzt wird, wenn der Weg in einer Wanderrelation auftaucht. Diese Spalte dient dann dem Router (der bevorzugt Mitglieder von Wanderrelationen) und dem Overlay mit Wanderwegmarkierungen (das allerdings noch lange nicht so aussieht wie es mir gefällt).
      Das Programm dafür sieht so aus, aber ich sollte erwähnen, dass ich nicht wirklich gut programmieren kann und Datenbanken hasse, also bitte nicht lachen! 😉

      wambacher wrote:

      versuch es mal mit select distinct way from ...

      Das wird nur manchmal funktionieren. osm2pgsql setzt die einzelnen Wege einer Relation zu möglichst grossen Stücken zusammen. Falls ein Weg in zwei Relationen vorkommt, die sich nur teilweise überschneiden (eben z.B. nur in diesem einen Weg), sind die Stücke der Relationen voneinander verschieden und der Weg taucht zweimal auf.

      Grüße, Max


    • Re: Radrouten darstellen · wambacher (Gast) · 28.03.2014 21:12 · [flux]

      maxbe wrote:

      Das wird nur manchmal funktionieren. osm2pgsql setzt die einzelnen Wege einer Relation zu möglichst grossen Stücken zusammen. Falls ein Weg in zwei Relationen vorkommt, die sich nur teilweise überschneiden (eben z.B. nur in diesem einen Weg), sind die Stücke der Relationen voneinander verschieden und der Weg taucht zweimal auf.

      jau, war ein Schnellschuß - und wurde ein Rohrkrepierer 🙁

      Gruss
      walter


    • Re: Radrouten darstellen · borish-osm (Gast) · 28.03.2014 22:00 · [flux]

      maxbe wrote:

      Da sehe ich nur den langen steinigen Weg: Aus der osm_rels alle Radwege raussuchen, die Members ansehen und die dann markieren

      Ich fürchte, daß das in CartoCSS nicht geht, weil das keine Programmiersprache ist.

      Wenn das Ergebnis von "select ways in planet_osm_line where route=bicycle" eine Menge von Linestrings aus allen Knoten ist, dann gibt es wohl keine Möglichkeit, diese Wege in ihre Teilstücke zu zerlegen. Wie sieht es aus nur mit "select ways in planet_osm_line"? Liefert das die Teilstücke? Dann müsste ich als Filter noch hinzufügen, daß der Weg in einer route=bicycle - Relation enthalten sein soll.

      Ohne eine Möglichkeit, direkt auf die Teilstücke zuzugreifen, wird das Problem wohl nicht lösbar sein. Vielleicht muß ich das Style-File für osm2pgsql ändern?


    • Re: Radrouten darstellen · maxbe (Gast) · 28.03.2014 22:49 · [flux]

      borish-osm wrote:

      Ich fürchte, daß das in CartoCSS nicht geht, weil das keine Programmiersprache ist.

      Ja, das müsstest du zwischen Import und Rendern mit einer echten Programmiersprache machen...

      borish-osm wrote:

      Wenn das Ergebnis von "select ways in planet_osm_line where route=bicycle" eine Menge von Linestrings aus allen Knoten ist, dann gibt es wohl keine Möglichkeit, diese Wege in ihre Teilstücke zu zerlegen. Wie sieht es aus nur mit "select ways in planet_osm_line"? Liefert das die Teilstücke?

      Das würde dir alle ways liefern: Flüsse, Wege, Zäune, Bahnlinien, Strassen. In planet_osm_line steckt alles, was weder Punkt noch Fläche ist. Es würde dir auch sowohl die Feldwege (die wir in OSM "way" nennen) als auch die Radrouten liefern (die wir in OSM "relation" nennen).

      borish-osm wrote:

      Dann müsste ich als Filter noch hinzufügen, daß der Weg in einer route=bicycle - Relation enthalten sein soll.

      Dieses sperrige Stück SQL liefert alle Wege, die Mitglied einer Relation sind, indem es nachsieht, ob es zu einem Weg mit "highway is not null" eine "Id aus osm_rels" gibt, die "type=route" hat und "route=mtb" oder "route=bicycle" und den Ausdruck "wOSM_ID" in ihren members:

      select␣way␣from␣osm_line␣as␣L␣where␣highway␣is␣not␣null␣and␣exists(select␣id␣from␣osm_rels␣where␣'{type,route}'<@tags␣and␣('{route,mtb}'<@tags␣or␣'{route,bicycle}'<@tags)␣and␣'w'||L.osm_id=ANY(members));
      

      Aber: Damit lassen wir vermutlich alles, was sinnvoll zu rendern ist weit hinter uns und begeben uns in in die Abteilung "bizarre Dinge, die sich mit sql anstellen lassen". Die Tabelle osm_rels wird für jeden einzelnen Weg komplett durchsucht... millionenfach also... Aber vielleicht hat du Glück oder einen schnellen Rechner oder Zeit...

      borish-osm wrote:

      Ohne eine Möglichkeit, direkt auf die Teilstücke zuzugreifen, wird das Problem wohl nicht lösbar sein. Vielleicht muß ich das Style-File für osm2pgsql ändern?

      Keine Ahnung...

      Grüße, Max

      PS: Wie wärs denn mit einer massiven Markierung? Die kann man auch mehrfach übereinander legen und hat keine Probleme mit Stricheln. Das ganze in einen halbtransparenten Layer, dann sieht man aich noch den Straßentyp durchscheinen...


    • Re: Radrouten darstellen · borish-osm (Gast) · 29.03.2014 22:30 · [flux]

      maxbe wrote:

      PS: Wie wärs denn mit einer massiven Markierung? Die kann man auch mehrfach übereinander legen und hat keine Probleme mit Stricheln. Das ganze in einen halbtransparenten Layer, dann sieht man aich noch den Straßentyp durchscheinen...

      Ja, ich mache es so. Scheint die einfachste Lösung zu sein.