PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Berechnung Distanz zwischen LAT / LON Koordinaten



BlaueLed
05.08.2014, 05:55
Hallo zusammen,

mit nachfolgendem Code berechne ich die Distanz zwischen 2 Koordinaten. Das funktioniert auch gut, sobald die Distanz unter 1000m liegt. Wenn die Distanz über 1000m liegt bekomme ich kein vernünftiges Ergebnis wie z.B. 1.299939393e3.



$regfile = "m8def.dat"
$crystal = 16000000
$baud = 9600
$swstack = 64
$hwstack = 64
$framesize = 32

$sim

Declare Sub Calc_all
Declare Sub Calc_radiants
Declare Sub Calc_angles
Declare Sub Calc_distance

Dim Lon_a As Double 'longitude base (deg)
Dim Lat_a As Double 'latitude base (deg)
Dim Lon_b As Double 'longitude air (deg)
Dim Lat_b As Double 'latitude air (deg)
Dim Lon_a_rad As Double 'longitude base (radiant)
Dim Lat_a_rad As Double 'latitude base (radiant)
Dim Lon_b_rad As Double 'longitude air (radiant)
Dim Lat_b_rad As Double 'latitude air (radiant)
Dim Angle_azi As Double 'Angle azimuth
Dim Angle_ele As Double 'Angle elevation
Dim Distance As Double 'tmp distance
Dim Distance_m_2d As Double 'Distance 2D in meters
Dim Distance_m_3d As Double 'Distance 3D in meters
Dim Altitude As Double 'Altitude over ground
Const Earthradiuskm = 6378.137 'Const for earth radius

Dim Tmp_double(4) As Double 'tmp variable


'### Main Loop ####
Main:

Lat_a = 49.394882
Lon_a = 8.389916
Lat_b = 49.394938
Lon_b = 8.401187
Altitude = 200
Call Calc_all
Print "Distanz: " ; Distance_m_2d ; "m" ; " in 3D: " ; Distance_m_3d ; " Grad Azi: " ; Angle_azi ; " Grad Ele: " ; Angle_ele


Goto Main

'#### Subs ###
Sub Calc_radiants 'convert degree to radiant
Lon_a_rad = Deg2rad(lon_a)
Lat_a_rad = Deg2rad(lat_a)
Lon_b_rad = Deg2rad(lon_b)
Lat_b_rad = Deg2rad(lat_b)
End Sub

Sub Calc_distance 'calculate distances 2D and 3D
'calc distance 2D
Tmp_double(4) = Sin(lat_a_rad)
Tmp_double(3) = Sin(lat_b_rad)
Tmp_double(1) = Tmp_double(4) * Tmp_double(3)
Tmp_double(4) = Cos(lat_a_rad)
Tmp_double(3) = Cos(lat_b_rad)
Tmp_double(2) = Lon_b_rad - Lon_a_rad
Tmp_double(2) = Cos(tmp_double(2))
Tmp_double(4) = Tmp_double(4) * Tmp_double(3)
Tmp_double(4) = Tmp_double(4) * Tmp_double(2)
Tmp_double(1) = Tmp_double(1) + Tmp_double(4)
Distance = Acos(tmp_double(1))
Tmp_double(1) = Distance * Earthradiuskm
Distance_m_2d = Tmp_double(1) * 1000
'calc distance 3D
Tmp_double(4) = Distance_m_2d * Distance_m_2d
Tmp_double(3) = Altitude * Altitude
Tmp_double(1) = Tmp_double(3) + Tmp_double(4)
Distance_m_3d = Sqr(tmp_double(1))
End Sub

Sub Calc_angles 'calculate angles
'Azimuth angle
Tmp_double(1) = Sin(lat_b_rad)
Tmp_double(2) = Sin(lat_a_rad)
Tmp_double(3) = Cos(distance)
Tmp_double(2) = Tmp_double(2) * Tmp_double(3)
Tmp_double(1) = Tmp_double(1) - Tmp_double(2)
Tmp_double(2) = Cos(lat_a_rad)
Tmp_double(3) = Sin(distance)
Tmp_double(2) = Tmp_double(2) * Tmp_double(3)
Tmp_double(1) = Tmp_double(1) / Tmp_double(2)
Tmp_double(1) = Acos(tmp_double(1))
Angle_azi = Rad2deg(tmp_double(1))
If Lon_a > Lon_b Then
Angle_azi = 360.0 - Angle_azi
End If
'Elevation angle
Tmp_double(1) = Altitude / Distance_m_2d
Tmp_double(1) = Atn(tmp_double(1))
Angle_ele = Rad2deg(tmp_double(1))
End Sub

Sub Calc_all 'Do all calculations, set lat and lon's before..
Call Calc_radiants
Call Calc_distance
Call Calc_angles
End Sub

End


Die Frage ist jetzt warum ? Liegt das an einer Variablendeklaration ?

Gruß Kay

Klebwax
05.08.2014, 11:21
Was ist an
1.299939393e3 unvernünftig?

BTW, macht es bei so kurzen Entfernungen überhaupt Sinn, so kompliziert zu rechnen? Sind da die allfälligen Fehler in den Koordinaten nicht viel größer als der Umstand, daß die Erde eine Kugel mit einem Umfang von ca. 40 000 000 m ist?

MfG Klebwax

BlaueLed
05.08.2014, 20:07
Was ist an unvernünftig?

BTW, macht es bei so kurzen Entfernungen überhaupt Sinn, so kompliziert zu rechnen? Sind da die allfälligen Fehler in den Koordinaten nicht viel größer als der Umstand, daß die Erde eine Kugel mit einem Umfang von ca. 40 000 000 m ist?

MfG Klebwax

Hallo Klebwax,

vernünftig wäre für mich ein Ergebnis wie z.B. 1299m. Natürlich kann ich auch mit dem 1.29993939e3 rechnen, aber ich hätte es halt gerne anders dargestellt.

Wie würdest Du es denn rechnen ?

Gruß Kay

Valen
05.08.2014, 20:38
Etwas stimmt sicher nicht. Google Earth hat die Distanz zwischen diesen Koordinaten als ungefähr 850 berechnet. Ich kenne mich mit Bascom nicht aus. Vielleicht ist den Double Genauigkeit doch nicht so genau. Sende den Resultaten der Zwischenberechnung zum pc, und vergleiche das mit deine eigene Berechnungen mit zbs Windows Calculator.

BlaueLed
05.08.2014, 20:51
Etwas stimmt sicher nicht. Google Earth hat die Distanz zwischen diesen Koordinaten als ungefähr 850 berechnet. Ich kenne mich mit Bascom nicht aus. Vielleicht ist den Double Genauigkeit doch nicht so genau. Sende den Resultaten der Zwischenberechnung zum pc, und vergleiche das mit deine eigene Berechnungen mit zbs Windows Calculator.

Hallo Valen,

doch es stimmt :-) Bascom wirft mir 816m aus. Das habe ich auch so ~ in Google Maps gemessen. Die 1.299939393e3m waren nur ein Beispiel für Strecken über 1000m.

Gruß Kay

Valen
05.08.2014, 21:04
Ok, dann habe ich dein Bericht falsch verstanden. Ich habe das gelesen als ob du 1.3km bekommen hat wenn es unter 1km sein soll.

BlaueLed
05.08.2014, 21:12
Hallo zusammen,

ich habe eine Lösung gefunden. Ich konvertiere die Double Variable zu einer Single Variable. Jetzt bekomme ich z.B. 1200m angezeigt.

Gruß Kay

Klebwax
05.08.2014, 22:51
vernünftig wäre für mich ein Ergebnis wie z.B. 1299m. Natürlich kann ich auch mit dem 1.29993939e3 rechnen, aber ich hätte es halt gerne anders dargestellt.

Also ist das Ergebniss schon vernünftig. Double ist nun mal ne wissenschaftliche Einheit, da ist diese Darstellung üblich.

Man kann natürlich seinen Rechner auch damit beschäftigen, alles in Double auzurechnen, um dann die Häfte der Stellen nach /dev/null zu senden und nur Single auszugeben.

Ich gehe mal davon aus, daß die Koordinaten vom GPS stammen, also bestenfalls auf +- 5m genau sind. Eigentlich sollte deine Entfernung als 1,3km angezeigt werden, besser ist das Ergebniss nicht wirklich.

Ich bin jetzt zu faul, eine Formel für die Entfernung von zwei Punkten für Abstände von einem Bogengrad oder kleiner aufzustellen, aber ein paar Hinweise will ich geben.

Der Abstand der Breitenkreise auf der Erdkugel ist konstant. Eine Bogenminute entspricht einer Strecke von einer Seemeile bzw. 1852 Meter. Der Abstand der Längenkreise hängt von der Breite ab. An den Polen ist er Null, am Äquator ist die Bogenminute ebenfalls eine Seemeile. Für einen gegebenen Breitenkreis kann man den Wert eines Längengrades (oder einer Minute) errechnen (oder irgendwo im Internet finden). So kann man aus den Winkeln kartesische Koordinaten durch einfaches Multiplizieren berechnen. Dann noch etwas Phytagoras und der Abstand ist bestimmt. Das ganze dann noch als Integer, schneller und wirklich genauer wirds nicht.

MfG Klebwax

BlaueLed
06.08.2014, 06:38
Also ist das Ergebniss schon vernünftig. Double ist nun mal ne wissenschaftliche Einheit, da ist diese Darstellung üblich.

Man kann natürlich seinen Rechner auch damit beschäftigen, alles in Double auzurechnen, um dann die Häfte der Stellen nach /dev/null zu senden und nur Single auszugeben.

Ich gehe mal davon aus, daß die Koordinaten vom GPS stammen, also bestenfalls auf +- 5m genau sind. Eigentlich sollte deine Entfernung als 1,3km angezeigt werden, besser ist das Ergebniss nicht wirklich.

Ich bin jetzt zu faul, eine Formel für die Entfernung von zwei Punkten für Abstände von einem Bogengrad oder kleiner aufzustellen, aber ein paar Hinweise will ich geben.

Der Abstand der Breitenkreise auf der Erdkugel ist konstant. Eine Bogenminute entspricht einer Strecke von einer Seemeile bzw. 1852 Meter. Der Abstand der Längenkreise hängt von der Breite ab. An den Polen ist er Null, am Äquator ist die Bogenminute ebenfalls eine Seemeile. Für einen gegebenen Breitenkreis kann man den Wert eines Längengrades (oder einer Minute) errechnen (oder irgendwo im Internet finden). So kann man aus den Winkeln kartesische Koordinaten durch einfaches Multiplizieren berechnen. Dann noch etwas Phytagoras und der Abstand ist bestimmt. Das ganze dann noch als Integer, schneller und wirklich genauer wirds nicht.

MfG Klebwax

Moin,

ich gebe Dir da in allen Punkten recht.

Gruß Kay