Integration der Kurvendarstellung in OSM

Ihr wollt jetzt aber nicht wirklich, dass sich ein Anfänger in OSM mit Klothoiden rumschlagen muss?
Und diejenigen die Eisenbahnen kartieren sind dann auch noch mit Lemniskaten konfrontiert?

Sorry - aber da verlassen wir dann mit OSM eine “crowdgeseourcete” Karte und bewegen uns hin in Richtung Trassierungskarte für Profis.
Das wollte OSM doch nie werden, oder? (also: Keep it simple - und bleiben wir bei Linien)

Für “rundere” Übergänge gibt es zB in Mapnik die Codierung “round” - dort anzusetzen wäre für “schönere” Ergebnisse einfacher…

Hallo Thomas,
in dem Augenblick, wo uns sehr detaillierte Luftbilder von einer Gegend vorliegen, können Anfänger durchaus die Uferkante eines Teiches mit einer Kurve nachzeichnen. Dem User wird eben eine Option mehr zur Verfügung stehen. Wir haben jetzt schon in OSM einige Themen wo die Einstiegshürden relativ hoch sind. Und einige Leute lernen es mit der Zeit und einige nie.
Das Zeichnen von Kreisen, Ellipsen usw. wird von den Laien genauso schnell begriffen, wie das Zeichnen von Linien.

Ich glaube, ich muß einige Beispiele in die Wiki einbauen, denn um die Codierung die Du ansprichst, hgeht es hier nicht - es geht um bessere Darstellung vor allem in den höchsten Zoomstufen.

In den höchsten Zoomstufen von was?

Natürlich wäre eine vernünftige GUI unverzichtbar, aber das ist zumindest bei Kurvenformen, für die es gängige GUI-Metaphern gibt - etwa Bezier-Kurven mit ihren Anfassern - keine unlösbare Herausforderung. So ziemlich alle Zeichenwerkzeuge in gängigen Programmen von Inkscape bis Libre/OpenOffice haben Kurvenfunktionen. Es scheint also durchaus etwas zu sein, was man Endnutzern “zumuten” kann, wenn man es richtig macht.

Ich glaube nicht, dass wir kurzfristig Kurven in OSM sehen werden, aber ich sehe auch keinen Grund für eine Fundamentalopposition gegen diese Idee.

Das hat mit Kurven nichts zu tun, das ist nur eine andere Darstellung der trotzdem vorhandenen Ecken. Und macht auch eckige Ecken “rund”…

von der 2D Karte. In der 3D Darstellung wäre es auch hilfreich.

Grüße,
Marek

Sehe ich ähnlich. Neben einer GUI-Umsetzung braucht es aber dafür einen neuen Datentyp.

Nichtmal unbedingt sofort. Wenn wir eine Darstellung nehmen, in der die Kurve die eingetragenen Stützpunkte alle schneidet und nicht nur wie bei den Bezier-Kurven als Kontrollpunkte nutzt, dann würde es zumindest für den Anfang ein way mit zusätzlichem Tag wohl tun, ohne sämtliche nicht darauf vorbereiteten Auswertungen kaputt zu machen.

So…ich hab mal ein wenig den Gedanken freien Lauf gelassen.

Wenn man davon ausgeht, dass Kurve=Kreisbogen, ist es mit dem Datentyp curve recht simpel.


<?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='3' /> //Startpunkt
<nd ref='2' /> //Hilfspunkt
<nd ref='1' /> //Endpunkt
</curve>
</osm> 

Also egtl. ein wie ein Way nur mit genau 3 Nodes. Als kleine Demo hab ich es mal für einen Straßenabschnitt fix umgesetzt (trunk auf Mapnik-Primary, damit man es besser sieht):

Damit josm mit den Daten klar kommt, hab ich den Datentyp bei way belassen, zum Nachvollziehen aber curve=yes getaggt und den Hilfspunkt mit curve=middle getaggt. Beides ist mit dem Datentyp curve (siehe oben) nicht nötig.


<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.6' upload='true' generator='JOSM'>
  <node id='-58' action='modify' visible='true' lat='50.97624267299224' lon='11.284868318566938' />
  <node id='-56' action='modify' visible='true' lat='50.977472509120204' lon='11.28845722585104' />
  <node id='-54' action='modify' visible='true' lat='50.98111183334305' lon='11.291720590660256' />
  <node id='-52' action='modify' visible='true' lat='50.98141676376676' lon='11.291657070177354' />
  <node id='-50' action='modify' visible='true' lat='50.98317132450159' lon='11.292062013255869' />
  <node id='-48' action='modify' visible='true' lat='50.98435599040213' lon='11.292284334946036' />
  <node id='-46' action='modify' visible='true' lat='50.98523072430183' lon='11.292284334946036' />
  <node id='-44' action='modify' visible='true' lat='50.987679891534434' lon='11.291180666555572' />
  <node id='-42' action='modify' visible='true' lat='50.989524179113495' lon='11.289394152973882' />
  <node id='-40' action='modify' visible='true' lat='50.99463182341778' lon='11.291188606615933' />
  <node id='-38' action='modify' visible='true' lat='50.99615101423253' lon='11.294801334081122' />
  <node id='-36' action='modify' visible='true' lat='50.998042099052995' lon='11.29783956551705' />
  <node id='-34' action='modify' visible='true' lat='50.99984412350129' lon='11.30159003182825' />
  <node id='-32' action='modify' visible='true' lat='51.00016918712704' lon='11.30342034921964' />
  <node id='-30' action='modify' visible='true' lat='51.000416516620994' lon='11.304262519798504' />
  <node id='-28' action='modify' visible='true' lat='51.00187926695615' lon='11.309214482802213' />
  <node id='-26' action='modify' visible='true' lat='51.00249403231801' lon='11.31265053876397' />
  <node id='-24' action='modify' visible='true' lat='51.00130689188247' lon='11.30663182636037'>
    <tag k='curve' v='middle' />
  </node>
  <node id='-22' action='modify' visible='true' lat='51.00026433469981' lon='11.303872231459675'>
    <tag k='curve' v='middle' />
  </node>
  <node id='-20' action='modify' visible='true' lat='50.999219988940716' lon='11.29937815729419'>
    <tag k='curve' v='middle' />
  </node>
  <node id='-18' action='modify' visible='true' lat='50.99705127241943' lon='11.296710297012199'>
    <tag k='curve' v='middle' />
  </node>
  <node id='-16' action='modify' visible='true' lat='50.992198776887136' lon='11.288524094777891'>
    <tag k='curve' v='middle' />
  </node>
  <node id='-14' action='modify' visible='true' lat='50.98665101830255' lon='11.292033601458362'>
    <tag k='curve' v='middle' />
  </node>
  <node id='-12' action='modify' visible='true' lat='50.9836819453887' lon='11.292176522544896'>
    <tag k='curve' v='middle' />
  </node>
  <node id='-10' action='modify' visible='true' lat='50.98237229395303' lon='11.29166835868166'>
    <tag k='curve' v='middle' />
  </node>
  <node id='-8' action='modify' visible='true' lat='50.97900302087013' lon='11.29141427675004'>
    <tag k='curve' v='middle' />
  </node>
  <way id='-90' action='modify' visible='true'>
    <nd ref='-58' />
    <nd ref='-56' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-88' action='modify' visible='true'>
    <nd ref='-30' />
    <nd ref='-24' />
    <nd ref='-28' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-86' action='modify' visible='true'>
    <nd ref='-28' />
    <nd ref='-26' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-84' action='modify' visible='true'>
    <nd ref='-32' />
    <nd ref='-22' />
    <nd ref='-30' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-82' action='modify' visible='true'>
    <nd ref='-34' />
    <nd ref='-32' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-80' action='modify' visible='true'>
    <nd ref='-36' />
    <nd ref='-20' />
    <nd ref='-34' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-78' action='modify' visible='true'>
    <nd ref='-38' />
    <nd ref='-18' />
    <nd ref='-36' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-76' action='modify' visible='true'>
    <nd ref='-42' />
    <nd ref='-16' />
    <nd ref='-40' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-74' action='modify' visible='true'>
    <nd ref='-40' />
    <nd ref='-38' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-72' action='modify' visible='true'>
    <nd ref='-46' />
    <nd ref='-14' />
    <nd ref='-44' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-70' action='modify' visible='true'>
    <nd ref='-44' />
    <nd ref='-42' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-68' action='modify' visible='true'>
    <nd ref='-50' />
    <nd ref='-12' />
    <nd ref='-48' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-66' action='modify' visible='true'>
    <nd ref='-48' />
    <nd ref='-46' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-64' action='modify' visible='true'>
    <nd ref='-52' />
    <nd ref='-10' />
    <nd ref='-50' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-62' action='modify' visible='true'>
    <nd ref='-54' />
    <nd ref='-52' />
    <tag k='highway' v='primary' />
  </way>
  <way id='-60' action='modify' visible='true'>
    <nd ref='-56' />
    <nd ref='-8' />
    <nd ref='-54' />
    <tag k='curve' v='yes' />
    <tag k='highway' v='primary' />
  </way>
</osm>

Evtl. hat ja jemand auch an dem Thema Interesse und die Kenntnisse einen kleinen Renderer zu schreiben, der das umsetzen würde, oder hat bessere/andere Vorschläge zu dem Thema.

wow,
nicht schlecht!
Ist es möglich einige weiter Beispiele zu generieren? Höhere Zoomstufe, z.B für eine Uferkante oder z.B sowas: http://osm.org/go/zmpVkrSru-

Machte es Sinn diesen Thread unter allg. Entwicklunsthemen zu platzieren?

Viele Grüße,
Marek

Nuja…den Anstieg manuell zu berechnen ist bestimmt nicht einfach, zumindest nicht mit den Werkzeugen, die josm so zu bieten hat. Da bräuchte man schon Hilfsmittel ala Spline-Werkzeug, die Tordanik schon angesprochen hat. Dann wäre es sicherlich auch sinnvoll möglich mehr ins Detail zugehen. Zumal man ohne Visualisierung nicht sonderlich viel sieht.

Unter allgemeine Entwicklung passt es denke ich besser als hier in den deutschen Teil des Forums.

EDIT: Ohne visuelles Feedback ist es beim Erstellen auch eher Glück, die Kurve richtig zu treffen. Wenn der Editor aber dem Mapper immer die aktuelle Kurvenform auf das Luftbild/gps-Track zeichnet ist das natürlich relativ einfach zu mappen.

Ein Vorteil der Kurven wäre bspw. auch, dass der Auswerter den Detailgrad bestimmen kann. Wenn das Garminformat zum Beispiel nur 5m-Raster unterstützt hilft es dem Auswerter wenig, wenn der Mapper eine Linie mit 1m-Wegsegmentlänge mappt, eher im Gegenteil.

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.