| Autor |
Beitrag |
BIOS-Crasher
Hält's aus hier
Beiträge: 10
Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
|
Verfasst: Di 23.06.09 07:15
Hallo!
Ich habe mir ein kleines Programm geschrieben, welches mir die Entfernung zwischen 2 geographischen Koordinaten ausgibt. Ich benutze dazu die Grosskreisberechnung.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function Tform1.CalcDist(BreitA: Double; LaengA: Double; BreitB: Double; LaengB: Double): Double; var d: Double; begin d := arccos(sin(BreitA)*sin(BreitB)+cos(BreitA)*cos(BreitB)*cos(LaengB-LaengA))*6378; Result := d; end; |
Nun gibt mir mein Programm jedoch falsche Angaben. Ich habe als Koordinaten 2 gegenüberliegende Punkte (Antipoden) genommen. Eigentlich müsste die Entfernung dem halben Erdradius sprich ca 20.000 km entsprechen. Mein Programm gibt jedoch 16.705,3700 aus, also knapp 4.000 km zu wenig. Kann mir jemand dabei helfen?
Moderiert von Narses: Titel erweitert.
|
|
Lemmy
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: Di 23.06.09 08:13
hoi,
gib mal die Ausgangsdaten an, also die Koordinaten der beiden Punkte. Rechnest Du die Koordinaten auch um? 9° 12" <> 9,12°
Und hast Du daran gedacht, dass die Trig-Funktionen der Math auf RAD basieren, hier also auch nochmal umgerechnet werden muss?
Grüße
Lemmy
|
|
wunsiedler
      
Beiträge: 506
Erhaltene Danke: 4
Win7
|
Verfasst: Di 23.06.09 08:27
BIOS-Crasher hat folgendes geschrieben : | | Eigentlich müsste die Entfernung dem halben Erdradius sprich ca 20.000 km entsprechen. |
Wenn das so wäre, müssten wir auf einer verdammt großen Kugel sitzen
Ich nehme an, Du sprichst vom Umfang...
Erdradius= 6370 KM
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 23.06.09 08:41
Moin und  im Forum!
Zur Geo-Distanz hatten wir hier und hier mal was im AGS.  Vielleicht hilft das ja weiter.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
BIOS-Crasher 
Hält's aus hier
Beiträge: 10
Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
|
Verfasst: Di 23.06.09 17:14
Lemmy hat folgendes geschrieben : | gib mal die Ausgangsdaten an, also die Koordinaten der beiden Punkte. Rechnest Du die Koordinaten auch um? 9° 12" <> 9,12°
Und hast Du daran gedacht, dass die Trig-Funktionen der Math auf RAD basieren, hier also auch nochmal umgerechnet werden muss? |
Ich glaubbe es ist das mit dem umwandelnn und nicht umwandeln (bin ich schon in der schule nich gut  )
Meine Koordinatenn sind folgende:
• B1 = N50° 12’ 34.5 ’’ L1 = E08° 34’ 56.7’’
• B2 = S50° 12’ 34.5 ’’ L2 = W171° 25’ 3.3’’
und ich hab das ganze so eingegeben:
Delphi-Quelltext 1:
| Calcdist(50.1234,8.3456,-50.1234,-171.253) |
Hätte eventuell jemand den Codeschnipsel parat mit dem ich das ganze korrekt umrechne?
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 23.06.09 17:28
Eine Parserfunktion in Delphi hb ich jetzt nicht da, aber ich kann dir sagen, was du machen musst:
N50° 12’ 34.5"
Wird in Dezimalgrad zu: 50 + 12 / 60 + 34.5 / 3600 also rund 50,2096°
E08° 34’ 56.7" = 8,5824°

|
|
BIOS-Crasher 
Hält's aus hier
Beiträge: 10
Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
|
Verfasst: Di 23.06.09 18:05
Hmm jetzt stehen wir bei 17204.662834632 km das sind noch immer ca 3000 km zu wenig ...
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 23.06.09 19:45
Moin!
BIOS-Crasher hat folgendes geschrieben : | | Hätte eventuell jemand den Codeschnipsel parat mit dem ich das ganze korrekt umrechne? |
In den beiden Links oben ist der Code dazu drin (gleich mehrere Verfahren)... keine Ahnung, warum du da nicht reinschaust...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 23.06.09 20:05
Ich weis nicht, wie du auf den Wert kommst - deine Formel dürfte richtig sein: | Zitat: | d(BreitA, LaengA, BreitB, LaengB):=acos(sin(BreitA)*sin(BreitB)+cos(BreitA)*cos(BreitB)*cos(LaengB-LaengA))*6378;
==> d(BreitA,LaengA,BreitB,LaengB):=acos(sin(BreitA)*sin(BreitB)+cos(BreitA)*cos(BreitB)*cos(LaengB-LaengA))*6378
degtorad(x):=x*%pi/180;
==> degtorad(x):=(x*%pi)/180
d(degtorad(50.2096),degtorad(8.5824),degtorad(-50.2096),degtorad(-171.4176));
==> 20037.0779445957 |
|
|
BIOS-Crasher 
Hält's aus hier
Beiträge: 10
Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
|
Verfasst: Di 23.06.09 21:56
Wie ich jetzt feststelle hab ich 2 fehler gemacht 1. Erhalte ich andere werte beim umrechnen(kann jemand bitte die umrechnung in dezimalgrad für dummies erklären...?) 2. Hab ich vergessen in radiant umzurechnen :-*
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 23.06.09 22:29
Okay, da 2. ja schon gelöst ist:
Du hast eine Angabe in X° Y' Z" oder ausgesprochen X Grad, Y Minuten und Z Sekunden. Da die Sekunde (es geht hier nicht um Zeit, heißt trotzdem so oder "Bogensekunde") die kleinste Zeiteinheit ist, muss man - wenn man noch genauer sein will - diese als Kommazahl schrieben. Ähnlich wie "4 Minuten und 3,5 Sekunden" (Millisekunden mal außen vor gelassen)
Analog zu den Zeiteinheiten ist ein Grad in 60 Minuten unterteilt und eine Minute in 60 Sekunden.
Bei Dezimalgrad verzichtet man nun auf Minuten und Sekunden und nimmt stattdessen die Angabe von Grad mit Dezimalstellen hinterm Komma.
Da ein Grad in 60 Minuten unterteilt ist, entspricht eine Minute 1/60 Grad. Wenn wir also eine Angabe haben wie 5° 59' entspricht das 5° + 59 / 60 = 5,98333333...°
Eine Minute wiederrum ist unterteilt in 60 Sekunden. also 5° 59' 58" entspricht 5 + (59 + 58/60) / 60 = 5 + 59/90 + 58/3600 = 5,9994444444...°
Zusammenfassend: X° Y' Z" [Grad,Minuten,Sekunden] = X + Y/60 + Z/3600 [Dezimalgrad]
Siehe auch: de.wikipedia.org/wiki/Bogensekunde 
|
|
BIOS-Crasher 
Hält's aus hier
Beiträge: 10
Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
|
Verfasst: Mi 24.06.09 20:33
Ich hab jetzt herausgefunden, dass in meiner umrechnung der fehler liegt, obwohl ich genau so umrechne wie beschrieben... Ich poste morgen den quelltext, momentan ist auf meinem arbeits-pc kein internet verfügbar
|
|
BIOS-Crasher 
Hält's aus hier
Beiträge: 10
Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
|
Verfasst: Do 25.06.09 17:10
So hier ist der vollständige quelltext:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| unit Main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Math, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; function CalcDist(BreitA: Double; LaengA: Double; BreitB: Double; LaengB: Double):Double; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm} function Tform1.CalcDist(BreitA: Double; LaengA: Double; BreitB: Double; LaengB: Double):Double; var d: Double; begin d := arccos(sin(BreitA)*sin(BreitB)+cos(BreitA)*cos(BreitB)*cos(LaengB-LaengA))*6378; Result := d; end;
procedure TForm1.Button1Click(Sender: TObject); var dBreita,dBreitb,dLaengA,dLaengB: Double; begin dBreita := 50+ 12/60+34.5/3600; dbreitb := 8+ 34/60 + 56.7/3600; dlaenga := -50+ 12/60 + 34.5/3600; dlaengb := -171+ 25/60 + 3.3/3600; Label1.Caption:= FloatToStr(Calcdist(degtorad(dBreitA),degtorad(dLaengA),degtorad(dBreitB),degtorad(LaengB))); end;
end. |
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Do 25.06.09 17:40
Du rechnest falsch um und vertauschst dbreitb und dlaenga
Konket: Das Minuszeichen muss vor alles, nicht nur vor die Gradzahl
Probiers mal so: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| unit Main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Math, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; function CalcDist(BreitA: Double; LaengA: Double; BreitB: Double; LaengB: Double):Double; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm} function Tform1.CalcDist(BreitA: Double; LaengA: Double; BreitB: Double; LaengB: Double):Double; var d: Double; begin d := arccos(sin(BreitA)*sin(BreitB)+cos(BreitA)*cos(BreitB)*cos(LaengB-LaengA))*6378; Result := d; end;
function DMS_to_DD(deg, min, sec: Double) : Double; begin Result := sign(deg) * (abs(deg) + min / 60 + sec / 3600)); end;
procedure TForm1.Button1Click(Sender: TObject); var dBreita,dBreitb,dLaengA,dLaengB: Double; begin dBreita := DMS_to_DD(50, 12, 34.5); dlaenga := DMS_to_DD(8, 34, 56.7); dbreitb := DMS_to_DD(-50, 12, 34.5); dlaengb := DMS_to_DD(-171, 25, 3.3); Label1.Caption:= FloatToStr(Calcdist(degtorad(dBreitA),degtorad(dLaengA),degtorad(dBreitB),degtorad(LaengB))); end;
end. |
|
|
Muck
      
Beiträge: 98
Erhaltene Danke: 8
Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
|
Verfasst: Do 25.06.09 20:26
Hallo zusammen,
mein Web Server TrackDollar.com berechnet die Enternung wie folgt:
Quelltext 1: 2: 3: 4: 5:
| Function Entfernung(sb,sl,zb,zl:Double):Double; begin Result:=arccos(sin(degtorad(sb))*sin(degtorad(zb))+ cos(degtorad(sb))*cos(degtorad(zb))*cos(degtorad(sl-zl)))*6378; end; |
Funktioniert rennt bis jetzt tadellos.
Aufruf Start Altitude,Longitude und Ziel Altitude,Longitude
also von meinem Haus in San Antonio, Texas nach Berlin waeren dann:
Quelltext 1:
| Entfernung(-98.499224,29.664668,13.4,52.5) |
cu
Markus
|
|
BIOS-Crasher 
Hält's aus hier
Beiträge: 10
Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
|
Verfasst: Fr 26.06.09 15:35
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Fr 26.06.09 18:04
Hi,
da ich das sowieso schon immer mal machen wollte hab ich das ganze eben auch mal nachgebastelt und mir im zuge dessen nen parser geschrieben um die Zeitangaben wie N50° 22'34.566" in Latitude und Longitude umzuwandeln..
Was ich mich jetzt frage, gibt es ne gescheite Möglichkeit das ganze aus Latitude wieder zurückzurechnen...?
Das ist ja dann eine Formel mit 3 unbekannten, wobei 2 davon nur zwischen 0 und 60 liegen können.. das übersteigt dann mein Mathematisches wissen doch ein wenig... weiß da jemand was?
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 26.06.09 18:25
Trunc(x) sind die ganzen Grad, Trunc(x * 60) mod 60 die Bogenminuten, der Rest mal 3600 (oder FloatMod(x * 3600, 60)) die Bogensekunden  ...
_________________ >λ=
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Fr 26.06.09 18:27
Hat sich erledigt.. hab's hinbekommen, war doch leichter als ich erst dachte..
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| float x = .. float d = floorf(x); x = (x - d) * 60.0f; float m = floorf(x); float s = (x - m) * 60.0f;
|
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|