[Talk-de] Strassenraeume zusammengefasst rendern, war Re: Gute Relations-Erklaerung

Heiko Jacobs jacobs at cousin.de
Mi Mai 7 10:40:30 UTC 2008


Zitat von Henry Loenwind <henry at loenwind.info>:

> Frederik Ramm wrote:
>>> "zeichne eine grüne Linie 2,2 Pixel breit in 1,3 Pixel Abstand
>>> rechts des Ways"?
>>
>> Das kommt drauf an, ob einem irgendein gescheites SVG einfaellt, das das
>> erzeugt. Osmarender errechnet grundsaetzlich nur die Mittellinie des

Zumindestens auf
http://svg.tutorial.aptico.de/start3.php?knr=11&kname=Painting&uknr=11.1&ukname=Eigenschaften%20von%20Fuellungen%20und%20Randlinien
fand ich keine Möglichkeit, die Linie automagisch zu versetzen.
Also muss man das wohl im Renderer organisieren:

> Auf so tiefer Ebene wird das schwierig. Das Problem ist vielleicht noch
> nicht mal so sehr die Linie, sondern die Kreuzungen. Und damit dann auch
> die Stellen an der der Way unterbrochen ist. Wenn man hier nur den
> einzelnen Way ansieht hat man Unterbrechungen und Überlappungen.
>
> Also muss man zuerst die Wege zusammensetzen, die die gleiche Linie
> haben sollen. An Kreuzungen mit mehr als 2 Wegen mit der gleichen Linie
> muss man sich überlegen wie das aussehen soll. Im Zweifelsfall wird die
> Linie dann in die Kreuzungsmitte gezogen (und verschwindet so unter der
> Straße).
>
> Auf freier Strecke muss man an jedem Node aus dem Winkel der beiden
> Linien zu den nächsten Nodes eine Richtung für einen Hilfspunkt
> berechnen, über den die Linie dann parallel zur eigentlich Strasse
> liegt. An Sackgassenenden berechnet man disen Punkt entweder senkrecht
> zu Straße, oder in 45° dazu und haut echten Node noch dazu
> (Pfeilspitze). An Kreuzungen s.o., wobei die "Pfeilspitzenmethode" hier
> auch recht gut aussehen würde.
>
> Die ganze Winkelberechnung könnte man in einen Prepocessor auslagern,
> dann ließe sich der einmal geschriebene Code für mehrere Renderer
> benutzen. 1-2 Stunden Arbeit, würde ich sagen, wenn ich auf meinem
> Straßennamenpreprocessor aufbaue.

Ich versuche mal laut zu denken, was mir gestern im Laufe des Tages
zum Problem mit Radwegen, Gleiskörpern, Anliegerfahrbahnen etc. kam:

Nehmen wir mal die Karlsruher Karlstraße:

http://www.openstreetmap.org/?lat=49.00763&lon=8.39497&zoom=16&layers=B0FT
Von der hat schon irgendwer Teile in eine Relation gepackt
(10744, highway=street, name=Karlstraße)

Ich versuche mich mal in ASCII-Art, um deren prinzipiellen Verlauf
darzustellen:

X=secondary-Fahrbahnen, R=resid., T=tram, S=Service, P=pedestr.,
C=cycleway, Y=primary
Links die Nummern der Bereiche zum Zitieren

00 RRRRRRRRRRRRRRRR Stephanienstraße
01         X
01         X
02 RRRRRRRRXRRRRRRR Akademiestraße
03       S X
03       S X
04       SSX
05         X
06 TPTPTPTPTPTPTPTP Kaiserstraße
07    T    XT
07     T   T
07      T TX
08       T X
08       T X
09 SSSSSSTSX        Stephanstraße
10       T X        Stephanplatz, Ludwigsplatz
11 PPPPPPTPXPPPPPPP Waldstraße
12     C T X
12     C T X
13 RRRRRRRRRRRRRRRR Amalienstraße
14     X T X
15     X T X   R    Herrenstraße
15 RR X  T  X R     Sophienstraße
16   X   T   X
17   X   T   X
18 YYYYYYYYYYYYYYYY Kriegsstraße
19    X  T  X
20 YYYYYYYYYYYYYYYY Kriegsstraße
21     X T X
21     X T X
....
22     X T X
22      XTX
23       X
23       T
23       X
23       T

Bisher gehören wohl alle passenden X zur Relation,
nicht aber die C oder S oder T.
Würde man die auch noch reinpacken, also alles, was zu einem gemeinsamen
Straßenraum gehört (Gleise, Hauptfahrbahnen, Anliegerfahrbahnen o.ä.,
Radwege, ggfs. Fußwege, ... Nicht aber bspw. das Gleisdreieck in 07)
könnte man gemeinsam Rendern nach folgendem Rezept:

Bestimme alle (ungefähren) Parallelitäten oder Abzweigungen in der Relation:
01:
"keine parallele Strecke zu X"
03:
"S: rechts parallel X Nr. ..."
"X: links parallel S Nr. ..."
oder da S vermutlich ein Way in 03 und 04 und X ein way in 03/04/05:
"S: parallel zu X Nr. ..., endet in dieser"
"X: Parallele S Nr. ... zweigt links ab an Knoten ..."

Suche die Mitte:
Suche die höchstrangigen Straßentypen pro Abschnitt:
Wenn geradzahlig, dann sei die Mitte zwischen den innersten zwei.
Wenn ungeradzahlig sei die Mitte die mittlerste höchstrangige Fahrbahn.
Wenn eine Tram vorhanden, nehme diese als Mitte.

Numeriere die Parallelen links und rechts durch.

Dieser Prozess könnte stellenweise nicht klappen.
In Abschnitt 05 ist X, über die ganze Straße betrachtet, eigentlich
zunächst nicht in der Mitte.
Der Gleiskörper könnte in Seitenlage liegen statt in der Mitte.
In 12 ist X nur einseitig, das Gegenstück hat einen anderen "Rang": C.
Man muss also Einfluss üben können, z.B.
role=middle um den korrekten Weg in der Mitte zu definieren.
role=parallel um bspw. etwas als nichtmittig zu definieren
(bspw. eigener Gleiskörper in Seitenlage)
role=track3 um einen way als 3. Parallele zur Mitte zu definieren
(wenn bspw. abschnittsweise eine Parallele wegfällt: Bsp.: ein
Radweg über ganzer Länge als Nr. 3, eine Hauptfahrbahn über ganzer
Länge als Nr. 1 plus eine Anliegerfahrbahn als Nr. 2, die aber
zwischen den Querstraßen Y und Z fehlt).
role=left/right dort wo bspw. abschnittsweise nur eine einzelne
Fahrbahn da ist und nichtmittig laufen soll.

Wenn alles sortiert ist rendern:
Wenn Mitte belegt (Gleiskörper bspw.): Mittlerer way ist Referenz
für ganzen Straßenraum.
Wenn Mitte leer (Straßenbegleitgrün in der Mitte) ist die zu berehcnende
geometrische Mitte der beiden mittleren ways die Referenz für den
ganzen Straßenraum.
Wenn Referenzen ermittelt ggfs. Abschnitts-Übergänge ausgleichen.

Dann:
keine Rad-/Fußwege li/re daneben: Standardrand der Fahrbahnen zeichnen.
Rad-/Fußweg daneben: Standardrand fällt weg, werden durch Fuß-/Radweg ersetzt.
(bzw. "Strichbreite" des Randes könnte auch definieren: Fußweg vorhanden
oder einseitg oder gar nicht. Irgendwann tauchte diese Frage mal auf...)

Dann Einzelwege von innen nach außen nach oben zitiertem Muster berechnen
mit den Zusatzregeln:

Abstand Wegmitte dieses ways zum nächsten weiter inneren way würde zu  
Überlappung führen: Way nach außen versetzen, sonst nicht.
Dadurch werden Fälle wie im Abschnitt 15-17 bei adäquatem Maßstab
lagetreu weiter weg von der Mitte gerendert bei kleineren Maßstäben
wird generalisiert und der Schwenk fällt quasi weg.

Bei der Abstandsfrage Standardrand ja/nein berücksichtigen.

Wenn Rand beidseitig gleich: wie bisher breiten Weg unterlegen.
Wenn nicht: einseitigen Hilfs-way berechnen und unterlegen.

Dann Ränder-ways und hilfs-ways als SVG raus, dann Fuß- und Radwege,
die ja ggfs. die Ränder ersetzen, dann Fahrbahnen.
Gleise vor Fahrbahn, weil sie könnten auch den Standardrand ersetzen...

Die Relation sollte noch ein
type="irgendwas das sagt Straßenraum gemeinsam rendern"
haben, damit der Renderer sie erkennt (und auch alle enthaltenen
Elemente später nicht noch mal rendert).
Sie kann, muss aber nicht, gleichzeitig eine "Straßenname-Relation" sein,
die alle Elemente mit gleichem Straßennamen zusammenfasst.
Es wurden ja schon Fälle genannt, wo das auseinander fallen kann.

Knifflig werden sicher Kreuzungen, insbesondere wenn eine andere
Straßenraum-Relation kreuzt... Weil dann sind ggfs. Radwegenden
etc. anders zu positionieren. Evtl. muss man den obigen Prozess
unterteilen: Zuerst Schritt A in allen Relationen, dann untereinander
ausgleichen, dann Schritt B, dann abgleichen, ...
Irgendwann die Ways außerhalb von Relationen ggfs. an der
Kreuzung teilen und die Endpunkte passend zum Ergebnis der
Relation "umpositionieren".
Analog könnte man auch untersuchen, welche anderen ways zwar nicht
direkt Kontakt zur Relation haben, aber im überzeichneten Bereich
liegen (das Sackgassenproblem, dass hier schon mal erwähnt wurde),
um deren Knoten unzupositionieren.

Das ganze könnte man ggfs. erweitern zu "gemeinsamen Talräumen",
damit in engen Tälern nicht Straße, Fluss und Bahn sich nicht überlappen.

Soweit mal mein laut gedachter Denkanstoß.
Mögen nun die Renderer-Experten prüfen, ob das überhaupt so umzusetzen
geht und wenn ja, in wie viel Jahren... ;-)

Gruß Mück






Mehr Informationen über die Mailingliste Talk-de