• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Lon und Lat in Karthesisches Koordinadensystem umwandeln

Servus zusammen,

da dies mein erstes Posting ist möchte ich mich kurz vorstellen:

Ich bin 45, Informatiker, lebe in Langenargen am Bodensee. Meine Passion ist das Regatta Segeln; bevorzugt hier am See.

Ich bin gerade dabei, eine Software zu schreiben, die mich bei der Regatta Taktik unterstützt. Als Informationsquelle nehme ich NMEA Daten, die mir ein GPS und meine Bordinstrumente ausspucken.

Mein Grundproblem ist es ein Lon und Lat Kartesisches Koordinatensystem zu wandeln.

Aus dem NMEA Datensatz vom GPS bekomme ich problemlos Lat und Lon raus und wandele diese erst mal in Bogenminuten um, damit man ordentlich damit weiter rechnen kann. Eine Bogen Minute Breite entspricht ja einer Seemeile. Sehr praktisch, weil wir an Bord 'eh in Meilen und Knoten denken. So weit, so gut, wir hätten die Y-Achse
Was aber mit der X-Achse? X = Länge mal Cosinus Breite? So irgendwie kommt das hin; aber eben nur irgendwie. Bei 45° und N x 90° + 45° sind immer einige Grad Abweichung da. Man merkt es daran, wenn man das GPS z.B. im Simulationsmodus genau 45° laufen lasse. Wenn man dann die Koordinaten des Punktes mit dem Punkt davor vergleicht dann müssten Delta X und Delta Y ja gleich sein. Sind sie aber nicht.
Mein ganzer Kram zeigt übrigens auf den geographischen Nordpol, nicht den magnetischen, womit dieses als Fehlerquelle ausscheidet.

Gibt es überhaupt eine einfache Möglichkeit Länge und Breite in Y und X umzurechnen, und die gleichen Kurswinkel zu bekommen?

Vielen Dank im Voraus!

C@rsten
 

rolf1327

Geowizard
Carsten aus LA schrieb:
Eine Bogen Minute Breite entspricht ja einer Seemeile.

Das ist ein sehr interessanter Zusammenhang, den ich bisher nicht kannte. Leider ist da auch die erste Schwierigkeit, denn entweder ist eine Seemeile nicht konstant (sondern abhängig von der Position auf dem Erdelipsoiden) oder der Zusammenhang ist bestenfalls eine Annäherung.

Und da sind wir auch schon beim Thema, die gesammten Abbildungen des dreidimensionalen Erdelipsoiden auf eine Fläche sind nur Annäherungen. Wenn Du also die Welt in kartesischen Koordinaten sehen willst, dann geht das immer nur in einem bestimmten Bereich.

Am verbreitetsten wäre für deinen Anwendungsfall wohl die Universale Transverse Mercator Abbildung (UTM). Beschreibungen zur Berechnung findet man im Netz. Als Ergebnis bekommst Du x und y koordinaten der zweidimensionalen Abbildung mit denen man dann mit einfacher Schulmathematik rechnen kann.

Gruß
Rolf
 
OP
C

Carsten aus LA

Geonewbie
Vielen Dank,

hab' mir den Mercator grad noch mal angesehen. Ich denke, das sollte funktionieren, wenn man X und Y jeweils mit Cos Breite multipliziert. Dann kommt man wieder auf die Seemeilen.

Viele Grüße

C@rsten
 
OP
C

Carsten aus LA

Geonewbie
Hi,

ich hab mal weiter Probiert:

X = Länge - 9 '-9 wegen Kartenursprung
Y = Math.Log(Math.Tan((Math.PI / 4) + Phi / 2)) 'Phi ist der Breitengrad

Wenn ich dann mit 10´KTS nach 45° fahre, dann bekomme ich:
DeltaX = -0,00389655324709537
DeltaY = -0,00112973610066547

Die sollten aber gleich groß sein, wenn man nach NE fährt.

:???:
 

Wallraff

Geocacher
Hallo,

ich sehe zwar nicht ganz, was Du simulierst und was Du programmierst, aber zwei Gedanken:
1. Mercator ist sicher geeignet (sagt der Seebär) und formelmäßig handhabbar
2. Wenn man hier in den Breiten 10sm NE segelt, legt man ca. 7' in der Breite, aber 11' in der Länge zurück ...

(Wär doch eigentlich was für KDB)

Grüße Wallraff
 

moenk

Administrator
Teammitglied
Zwei Ansätze gibt es:
1. Du machst eine Projektion in die Ebene. Geht nur für kurze Distanzen, weil die Erde keine Scheibe ist Aber man kann sie für kleine Bereiche plattklopfen. Macht GK und UTM so. Dann kann man rechnen wie in der Untersekunda damit.
2. Sphärische Trigonmetrie damit rechnet man zwar auf der Kugel, aber das geht ganz gut. Formel stehen überall z.B. auch bei Onkel W.
Deine Frage ist nun, ob es eine konforme Abbildung gibt. Und das sind wir wieder bei Punkt 1.
 
OP
C

Carsten aus LA

Geonewbie
Vielen Dank für Eure Hilfe!

Da mein Proramm nur für Kurzstrecken Regattan gedacht ist taugt plattklopfen meiner Ansicht nach ganz gut. Meistens kann man die Bojen mit bloßem Auge sehen. Und Ja, dann sollte es simpel sein. Das ist ja, was mich dabei so wurmt, dass ich irgendwie zu doof bin, den richtigen Algorithmus zu finden, Lon und Lat in X und Y umzurechnen, so dass Kursangaben in Grad auch noch stimmen.

Die Sache mit dem Mercator geht irgendwie voll in die Hosen, bei dem was ich da mache. Ich bin schon so weit, es folgendermaßen zu machen:

Y = Breitengrad.
X = Längengrad * cos Breitengrad * Korrekturfaktor.

Den Korrekturfakor ermittelt man, indem man pro Location mal 45° und 135° fährt und das Programm so lange iterieren lässt, bis das Delta aus Kursrichtung, welche im NMEA steht und der errechneten aus dem vorgehenden zum aktuellen Punkt 0 ist.

Sieht doof aus; isses auch.


Gruß

C@rsten
 

moenk

Administrator
Teammitglied
Natürlich steht jeder vor dem Problem! Wenn man Openlayers verwendet sagt man aber nur noch welche Projektion man gern haben möchte. Wenn Du programmierst kannst Du doch auch Proj4 zurückgreifen. Da gibste Daten rein, kriegst welche raus und Du sagst was es sein soll, nimste einfach UTM beispielsweise.
http://trac.osgeo.org/proj/
 

kiozen

Geomaster
Carsten aus LA schrieb:
Vor dem Problem muss doch jeder stehen, der einen wie auch immer gearteten Kartenplotter realisiert.

Jo, und wie moenk schon sagt, man nimmt eine Bibliothek, wenn man nicht genau weiß was man macht :p. Nee, mein 2. Name ist nicht Geodäsi und ich benutze auch Proj4. Aber deinen Kartenplotter habe ich schon geschrieben. "pj_transform(..)" ist dein Freund, um aus einem C/C++ Programm heraus Koordinaten von einer in die andere Projektion zu transformieren. Mit "proj" geht das auch von der Kommandozeile aus.

Entfernungen kannst Du entweder in UTM über den Pythagoras berechnen, oder etwas allgemeiner in WGS84 Koordinaten auf einem Ellipsoiden mit dem erwähnten Vincenty.

Damit hat man als Nicht - Geodät eigentlich das nötige Rüstzeug um fast alles zu machen.

Grüße

Oliver
 

Wallraff

Geocacher
Hallo,

na, ich führe mal ein webbasiertes Selbstgespräch ...

"Carsten will Kurs auf eine Tonnen nehmen und die passgenau erreichen.
Er sucht eine winkel- und längentreue Abbildung.
Dann kann man das meiste zusammenknüllen.

Mercator ist nicht längentreu.
Die mit cos verfeinerte Plattkarte bringt in der Größenordnung Bodensee etwa 1° Winkelfehler und 100 m Längenfehler.

Transversale Mercator oder UTM. Winkeltreu und bei den Sterecken auf etwa eine Bootslänge (10m ) genau. Entweder dieses Proj4 einbaun oder (mein Favorit...) selber mit
Wolfram am Schluss
probieren. 9° Gauß-Krüger-Bezugsmeridian und Bodensee passen recht gut."

Grüße Wallraff
 
OP
C

Carsten aus LA

Geonewbie
Hi,

wenn das Forum ein DANKE Taste hätte, würde ich sie jetzt drücken! :D

Ich komme aber erst morgen dazu, die ganze Geschichte zu testen. Immerhin weiß ich jetzt schon, dass ich nicht irgendas banales übersehen habe.

Beste Grüße vom Bodensee

C@rsten
PS: Das Boot ist noch im Wasser; nächsten Sonntag wird getestet.
 
OP
C

Carsten aus LA

Geonewbie
Soo,

so setze ich jetzt X und Y:

nach (Deetz und Adams 1934, Snyder 1987).
B = Math.Cos(Phi) * Math.Sin(Lambda - Lambda0)
X = 0.5 * Math.Log((1 + B) / (1 - B))
Y = (Math.Atan(((Math.Tan(Phi)) / Math.Cos(Lambda - Lambda0)))) - Phi0

Wobei ich Phi0 = 49 und Lambda0=9 ansetze und hier am See damit ganz prima hinkomme.

Die Winkel, die das mein GPS 76 in den NMEA Sätzen ausspuckt sind jetzt annähernd identisch zu dem, was ich so vom vorangegangenen Punkt zum aktuellen errechne.

Im Moment lade ich das Kartenzentrum noch aus einer Konfigurationsdatei. Das könnte man aber auch aus den ersten 10 NMEA Datensätzen machen. Weiß der Geier Mitteln und dann auf ein halbes Grad runden oder so. Im Moment ist das aber nicht so wichtig; Hauptsache ich kann den Rest mal weiter getestet werden

Viele Grüße vom See

C@rsten
 
Oben