Integration der Kurvendarstellung in OSM

Für variable Kurven (Splines) bräuchte man mindestens zwei Punkte die Start und Ende definieren. Für jeden dieser Punkte bräuchte man noch zwei Hilfspunkte, die die Form des Splines beeinflussen.

Hier mal ein kleines Beispielbild mit 3 Punkten. Am Punkt 2 sieht man die beiden Hilfspunkte 2L und 2R.

Im Datenmodell kann man das bspw. wie folgt umsetzen:


<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.6'>
<node id='1' lat='...' lon='...' />
<node id='2' lat='...' lon='...' />
<node id='3' lat='...' lon='...' />
<curve id='1' >
<nd ref='1' L_lat='...' L_lon='...' R_lat='...' R_lon='...' /> //Startpunkt
<nd ref='2' L_lat='...' L_lon='...' R_lat='...' R_lon='...' /> //Zwischenpunkt
<nd ref='3' L_lat='...' L_lon='...' R_lat='...' R_lon='...' /> //Endpunkt
</curve>
</osm> 

Als Nachteil sehe ich hier erstmal, dass es mehr Speicher benötigt, als ein Kreisbogen (ist natürlich kein wirkliches Argument). Dafür ist man natürlich deutlich flexibler was die Form angeht. Außerdem ist man flexibler was die Punkteanzahl angeht, was nicht gerade unerheblich ist, wenn man an Straßen und dessen Einmündungen denkt.

Bei Änderungen (Verschieben) an einem Node wirken sich die Änderungen auch auf die Hilfspunkte (2L, 2R) aus, sodass es sinnvoll wäre, dessen Koordinaten relativ zu den Koordinaten des Bezugspunktes (2) zu speichern. Dann müssen bei einem Verschieben keine Änderungen an der curve vorgenommen werden, sondern es ist ausreichend, die Koordinaten des Nodes zu ändern.

Die User aus der Russischer Community weisen auf Problembereiche hin: “Cubic curve geometry on a geoid is not simple. Note, it is not only rendering, but also angle, length, area computation, hit tests, intersections…”

Was glaubt Ihr - machbar / nicht machbar?
Grüße,
Marek

Nunja…für Berechnungen muss man immer eine lineare Interpolation machen. Ich auch keine Ahnung, wie rechenaufwändig so eine Interpolation ist. Letztlich sind die Kurven nur für die “hübschen Bilder” und die variable Genauigkeit der Auswertung sinnvoll. Bei der Interpolation kann der Auswerter frei die Auflösung festlegen. Der simple Fall wäre eine lineare Verbindung der Nodes. Für den Rest muss man eine Interpolation machen. Wobei man das natürlich auch zentral machen könnte.

Stimmt schon, wenn man nicht in der Ebene rechnet, hat man mit Kurvenformeln eine ziemliche Herausforderung vor sich. Ich wäre jetzt davon ausgegangen, dass das schlicht vernachlässigt wird. Denn genau das tun die meisten Programme mit unseren derzeitigen Ways ja auch. Da werden einfach die Node-Koordinaten projiziert und dann eine gerade Linie auf dem Bildschirm gezeichnet. Unsere Ways sind normalerweise zu kurz, als dass der Effekt der Erdkrümmung in irgendeiner Weise auffällt.

Der Hinweis auf Schnittberechnungen etc. ist allerdings richtig. Wenn man die Einstiegshürden für Anwendungsentwickler nicht zu hoch legen will, müsste man praktisch zwangsläufig schon vorab linear interpolierte Daten bereitstellen. Dummerweise kann das durchaus zu Verfälschungen bei den genannten Tests führen (die Kurven schneiden sich, die Interpolationen nicht mehr).

Insgesamt macht das alles die Sache aber schon recht problematisch und ist von daher - wenn ich so drüber nachdenke - wahrscheinlich den Aufwand momentan wirklich nicht wert.

Machbar, aber sehr aufwendig. Ich würde mir wohl erstmal andere Baustellen suchen.

Leute was habt ihr alle mit euren Bezier-Kurven? Bei diesen Kurven geht die Gerade nicht durch die Stützpunkte und somit ist es mit dem aktuellen System inkompatibel!

EDIT: Da habe ich wohl Seite 2 übersehen. Entschuldigt bitte!

Zumindest meine Ausführungen beziehen sich auf Kreisbögen bzw. Splines.

Ich beziehe mich auf die Zeichnung oben:
Würde man an dem Punkt 1 zusätzlich Hilfspunkt 1R und an dem Punkt 3 Hilfspunkt 3L haben, wäre der Verlauf einer komplexen Kurve stetig.

Ich betrachte das Ganze mal aus der Sicht eines Editors (bzw dessen Benutzer):

  • Wie fügt man in so eine Kurve einen zusätzlichen Punkt ein (z.B. für einen abzweigender Weg)? Gibt es dann zwei Kurven oder eine Kurve und eine Gerade?
  • Was passiert wenn ein Punkt der Kurve gelöscht wird? Haben wir dann ähnliche Probleme wie bei den Abbiegebeschränkungen, die auch aus genau 3 Elementen bestehen müssen?

Ich fürchte mich etwas vor der Komplexität und den möglichen Fehlerquellen.

Wie wäre es denn mit natürlichen kubischen Splines. Die würden durch alle vorhandenen Stützpunkte verlaufen, wodurch Kreuzungspunkte erhalten blieben und bräuchten keinerlei zusätzlichen Nodes. Es wäre lediglich zu markieren ob ein Way als Polygonzug oder als Spline gerendert werden soll. Der Renderer hätte dann allerdings das Problem für jede Kachel den gesamten Spline zu berechnen weil es sonst an den Kachelgrenzen zu Ungenauigkeiten kommen würde.

@mdk:

Ich hatte ja oben zwei Beispiele gepostet, wobei ich denke, dass die Splines sinnvoller sind. Eben weil es keine Probleme gibt mit der Anzahl der Punkte. Vom Editieren ist es ähnlich wie bei einem Weg jetzt auch. Für die Spline braucht man weniger Nodes (in vielen Fällen nur Start und Ende), dafür aber die angesprochenen Hilfspunkte zu jedem Node, die die Form der Spline beeinflussen.

In der Spline können beliebig viele Punkte sein, so wie in den Ways derzeit und an jeden dieser Punkte kann ein neuer Weg starten, wie bei den ways heute. Man könnte auch sagen, der Way ist eine lineare Spline.

@ieichens:

Der Renderer könnte sich vorher auch eine Interpolation erzeugen, bspw. einen normalen Way, mit einem Nodeabstand von 1m oder 10cm oder wie genau er es gerne hätte. Was nun sinnvoller ist kann ich nicht abschätzen.

Warum behandelt man nicht einfach alles als Ellipse? Jede gerade Linie hat zwei Punkte an denen je eine Linie weiter geht. Hier kann man den jeweiligen “Folgewinkel” ausrechnen und somit entscheiden, daß es eine Ellipse ist und diese so zeichnen, daß sie zur Folgeellipse perfekt passt. (Wenn ein Node mehr als zwei Linien hat, ist es keine Kreuzung und die geht mit 0° in die Berechnung ein.) (Streng genommen sind es natürlich keine vollen Ellipsen, sondern nur jeweils Teil davon)

Und schon hat man perfekt geformte Straßen. Ohne Zusatztags. Natürlich sind die nicht 100%ig richtig, aber 90%ig auf jeden Fall. Man hätte in Mapnik keine Ecken und Kannten mehr und würde automatisch mit viel weniger Nodes arbeiten.

Es müsste nur irgend jemand anfangen einen Test-Renderer zu schreiben, der zeigt wir gut sowas funktioniert. Wenn dann Mapnik und JOSM folgen, ist “es” geschafft.

Gefällt einem die Kurve nicht, fügt man einfach einen Node an der “Schlechtesten” stelle ein und verschiebt den richtig. Und schon ist die Kurve perfekt.

Klingt erstmal auch interessant. Könntest du das mal in eine Grafik packen, damit man sieht, was du meinst?

So habe ich mir das gedacht:

Kreuzungen und Links-Rechts-Änderungen sind oben noch nicht beschrieben, aber hier müsste etwas ähnliches möglich sein.

Wo ich jetzt spontan das Problem sehe ist, dass man keinen sinnvollen Übergang zu Geraden hinbekommt. Also wenn die erste blaue Linie und die letzte blaue Linie normale Ways wären und das mittlere Stück die Kurve. Wenn der Nutzer dann wieder mit vielen Nodes tricksen muss, hätte man nicht viel gewonnen.

Das wäre ja dann ein ähnliches Smoothing Verfahren welches beim Osmarender verwendet wurde.
Oft hat es gepasst allerdings manchmal zu komischen Effekten geführt.

Wenn ich wirklich eine echte lange gerade habe, sind hier am Ende zwei Nodes erforderlich, ja. Aber es ist besser als 20 Nodes in der Kurve.

Dann finde ich aber den Spline doch sympathischer, als bei ‘echten langen Geraden’ (und die haben wir ja nun doch nicht so selten, nicht) dann jeweils zwei Endpunkte machen zu müssen. Das ist dann zu unintuitiv, zumindest für meinen Geschmack.

Wobei, eine Gerade auch dann eine Gerade ist, wenn sie drei Punkte hat. Das wird sich zum Großteil von alleine erledigen. Da wo es das nicht macht, setzt man einfach einen neuen Node und schiebt den an die richtige Stelle und dann hat es sich erledigt.

Dennis, derzeit denke ich auch, dass man mit Splines besser fahren dürfte. Zum einen ist deren Verwendung intuitiver und zum anderen dürfte es dazu mehr Algorithmen geben.

Jetzt will ich doch auch mal noch ein paar Gedanken in diesen Thread einbringen. Der Thread mischt ja sehr stark zwischen Eingabe, Datenspeicherung und Ausgabe (Rendering), daher versuche ich da mal etwas zu differenzieren.

Persönlich finde ich (B-)Splines sehr schwer zu bedienen. Auch wenn sie bei Eingabe die gemalten Kontrollpunkte interpolieren finde ich es meist sehr unintuitiv und schwer den eigentlich gewünschten Kurvenverlauf zu erhalten. Habe ich hingegen Beziersplines (in typischen Anwendungen vom Grad 2 oder 3) so habe ich zwar keine Interpolation an den Kontrollpunkten sondern die “Konvexe-Hülle-Eigenschaft”, ich zumindest komme mit sowas wesentlich leichter zurecht.

Am einfachsten finde ich bei Eingabe aber immer noch den linearen Spline (der Polygonzug ;)). Den kann ich so genau machen wie ich will oder auch nicht und wenn ich es “kurviger” will dann kann man die Daten auch aufbereiten und eine Approximation der Daten mit einem entsprechenden Spline durchführen.

Bzgl. der Datenspeicherung sehe ich zwar prinzipiell eine Möglichkeit der Datenreduktion, aber diese vor allem bei einer automatisierten Approximation der Basisdaten. Ich befürchte, dass bei direkter Eingabe von Splinekontollpunkten die Benutzer für schöne Kurvenverläufe auch entsprechend viele Punkte setzen würden und sich die Datenbasis nicht wirklich verringert. Hier habe ich aber bzgl. manuellen Eingaben keine Erfahrung.

Bei der Ausgabe (und auch bei Eingabe) sollte aber ein sehr wichtiger Punkt beachtet werden: Ein Großteil der Splinetypen (z.B. die Beziersplines) kann man nicht “offsetten”. Genau das will ich aber an vielen Stellen in OSM erreichen: Z.B. will ich zwei Bahnlinien oder auch die zwei Spuren einer Autobahn parallel halten und genau das kann ich mit den meisten Splines nicht! Ähnliche Probleme treten dann auch auf, wenn ich z.B. eine Straßenbrücke habe (die Brückengeländer sollten ja Offsets der Straße sein) usw usf. Wenn ich mich recht erinnere sind das die Probleme die chris66 angesprochen hat (das Pythonskript für Osmarender um die Polygone durch Bezierkurven zu approximieren).

Ich habe mir selbst noch keine Meinung gebildet ob ich “Kurven” für OSM gut fände oder nicht. Aber wenn Kurven dann würde ich aus meiner beruflichen Erfahrung heraus klar Kreisbogensplines bevorzugen. Den Ansatz von aighes fand ich da sehr schön. Für Kreisbögen kann man dann auch Offsets bilden, man kann sie einfach glatt anschließen lassen, man kann sie leicht unterteilen, die Abstandsberechnung ist so einfach wie für ein Polygon,… Nur die Repräsentation in der Datenbasis würde ich vermutlich anders angehen und statt dem Kontrollpunkt lieber einen “Radius” angeben wo das Vorzeichen der “Krümmungsrichtung” entspricht. Man könnte dann auch festlegen, dass der Radius einen Mindeswert haben muss, so dass man eine “Abwärtskompatibilität” erhält indem man einfach nur eine Linie von Start- zu Endpunkt malt.

Edit: Was mir gerade noch einfällt/auffällt: Wenn ich ein Polygon mit n Linien habe brauche ich ja bekanntlich n+1 Koordinaten zum Speichern. Habe ich einen glatten Kreisbogenspline aus n Bogenstücken dann reichen mir n+1 Koordinaten mit nur einem zusätzlichen Doublewert. Und zwar kann ich das erste Bogenstück über Startpunkt, Endpunkt und Radius beschreiben. Für das nächste Bogenstück ist der vorherige Endpunkt der neue Startpunkt, die Tangente kenne ich wegen dem glatten Anschluss und durch den nächsten Punkt ist das Bogenstück bereits definiert. Durch ein zusätzliches Attribut an einen Way (den Radius des ersten Bogens) kann ich daher einen kompletten glatten Kreisbogenspline definieren :slight_smile: