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

Richtung und Entfernung addieren (in WGS84)

GFEMajor

Geonewbie
Hallo Leute, ich bin neu hier. Ich hab euch über Google gefunden und hoffe mal, dass ihr mir bei meinem Problem weiter helfen könnt.

Ich habe Koordinaten im WGS84 System und möchte gern zu einer Koordinate eine Richtung (in Grad) und eine Entfernung (in Meter) addieren und dann eine neue Koordinate in WGS84 erhalten.

Als Beispiel:
Ich habe die Koordinate:
52.523405 , 13.411400 (Berlin)
Jetzt möchte ich die Richtung 208,78 und die Entfernung 150 000m addieren.
Dann sollte ich irgendwo in der Nähe von Leipzig rauskommen. Wie bekomme ich dafür die Koordinaten?

Ist das irgendwie möglich und wenn ja, wie lautet die Formel dafür?
(Ich hoffe die Frage ist verständlich)


LG Major
 

jmsanta

Geoguru
GFEMajor schrieb:
Ist das irgendwie möglich und wenn ja, wie lautet die Formel dafür
Ja, z.B. hiermit: http://www.hentsch.de/gc/excel.htm
und hier gib's weitere Infos...
http://www.cachewiki.de/wiki/Wegpunktprojektion
und hier:
http://www.geoclub.de/viewtopic.php?f=54&t=37169
und hier findest du sicher noch mehr passende Beiträge...
http://tinyurl.com/nuyrus
 

xtb

Geomaster
Such einfach nach Tools für Wegpunktprojektion ... gibts jede Menge im Netz.

Falls Du das Ergebnis gleich wissen willst:
51.335601 12.371192
 
OP
G

GFEMajor

Geonewbie
Danke für eure schnellen und hilfreichen Antworten.
Nur zur Klarstellung, ich brauche kein Programm was das macht, sondern ich schreibe gerade an einer Software, die diese Funktionalität benötigt, darum brauch ich auch die Formel selbst :).

Ich hab es jetzt mal mit der Berechnung versucht (aus diesem Beitrag übersetzt in Java Code):

Code:
double lat1 = 52.523405;
double lon1 = 13.411400;
		
double distance = 150000.0d / 6378130.0d;
double bearing = (208.78d * Math.PI) / 180.0d;
	
double lat2 = Math.asin(Math.sin(lat1) * Math.cos(distance) + Math.cos(lat1) * Math.sin(distance) * Math.cos(-bearing));
double lon2;
if(Math.cos(lat1) == 0){
	lon2 = lon1;
}else{
	lon2 = ((lon1 - Math.asin(Math.sin(-bearing) * Math.sin(distance) / Math.cos(lat1)) + Math.PI) % 2*Math.PI) - Math.PI;
}
		
log.debug("Lat: " + lat2 + " Lon: " + lon2);

Aber irgendwie ist das nicht ganz richtig. Als Augabe erhalte ich:

Code:
Lat: 0.9042023324610523 Lon: -1.3482395398614657

Ich vermute, dass das nur die Differenzkoordinaten sind und ich diese auf meine ursprünglichen Koordinaten draufaddieren muss.
Tut ich das, komme ich aber nicht in Leipzip raus, sondern oberhalb von Berlin.
Der Abstand scheint aber zu stimmen, dass heißt für mich sieht es so aus, als ob in der Formel irgendwo ein Vorzeichenfehler drin ist (Bin mir aber nicht sicher).

Weis einer Rat? (Bin leider ein Neuling auf dem ganzen Geo-Gebiet :) )
 
Mit Mopsos komme ich da hin.

Dein Ansatz rechnet auf der Kugel und würde sicher woanders hinkommen. Bei so weiten Strecken kommt es immer darauf an welches Verfahren man anwendet.
 

kiozen

Geomaster
GFEMajor schrieb:
Ich vermute, dass das nur die Differenzkoordinaten sind und ich diese auf meine ursprünglichen Koordinaten draufaddieren muss.

nein. Das sollten die finalen Koordinaten sein.

GFEMajor schrieb:
Tut ich das, komme ich aber nicht in Leipzip raus, sondern oberhalb von Berlin.
Der Abstand scheint aber zu stimmen, dass heißt für mich sieht es so aus, als ob in der Formel irgendwo ein Vorzeichenfehler drin ist (Bin mir aber nicht sicher).

Weis einer Rat? (Bin leider ein Neuling auf dem ganzen Geo-Gebiet :) )

Ich bin mir nicht sicher ob dein "% 2*Pi" wirklich das Selbe bewirkt wie fmod(). Setze mal die Klammern richtig. Im Moment macht das wahrscheinlich "modulo 2, mal pi"

Oliver
 
OP
G

GFEMajor

Geonewbie
Sooo, es ist geschafft :).

Ich hab den Fehler gefunden. Natürlich akzeptieren die mathematischen Funktionen von Java nur Eingabe im Bogenmaß und nicht in Grad.

Also schnell alle Koordinaten umgewandelt und schon komm ich da raus wo ich sein möchte. Die Rechnung ist zwar nicht perfekt, reicht aber für meine Zwecke vollkommen aus.

Hier nochmal der Vollständigkeit halber der komplette code der Funktion (mit den Beispielkoordinaten aus Berlin):

Code:
double lat1 = (52.523405d * Math.PI) / 180.0d;
double lon1 = (13.411400d * Math.PI) / 180.0d;
		
double distance = (150000.0d) / 6378388.0d;
double winkel = (208.78d * Math.PI) / 180.0d;
		
double lat2 = Math.asin(Math.sin(lat1) * Math.cos(distance) + Math.cos(lat1) * Math.sin(distance) * Math.cos(-winkel));
double lon2;
if(Math.cos(lat1) == 0){
	lon2 = lon1;
}else{
	lon2 = ((lon1 - Math.asin(Math.sin(-winkel) * Math.sin(distance) / Math.cos(lat1)) + Math.PI) % (2*Math.PI)) - Math.PI;
}
lat2 = (lat2 * 180.0d) / Math.PI;
lon2 = (lon2 * 180.0d) / Math.PI;
		
log.debug("Lat: " + lat2 + " Lon: " + lon2);

Damit komme ich dann hier raus (klick mich):

Code:
Lat: 51.337785015680474 Lon: 12.345242596616322

Liebe Grüße und besten Dank für eure Hilfe

Major
 
Oben