Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Abstandsberechnung zwischen 2 Städten (https://www.delphipraxis.net/137987-abstandsberechnung-zwischen-2-staedten.html)

mr____zero 1. Aug 2009 16:01


Abstandsberechnung zwischen 2 Städten
 
hallo erstmal an alle :)

ich habe hier ein kleines aber feines mathematisches als auch geographisches problem

ich habe von 2 städten die längen und breiten grade gegeben

berlin:
länge: 13.413
breite: 52.523

düsseldorf
länge: 6.783
breite: 51.233

nun möchte ich von diesen beiden städten den abstand berechnen
und hier fängt mein problem an
bei einer rellativ kurzen entfernung ist es ja noch möglich die entfernung mit hilfe des guten alten pythagoras zu errechnen wird die entfernung aber größer macht einem da die erdkrümmung einen strich durch die rechnung

daher meine frage weiß irgendwer wie ich das ausrechnen könnte am besten auch an diesem beispiel

mfg
zero

jfheins 1. Aug 2009 16:05

Re: Abstandsberechnung zwischen 2 Städten
 
http://de.wikipedia.org/wiki/Orthodr...Berlin_-_Tokio ;)

Das war im letzten Adventgewinnspiel im DF - die Sourcen zu meiner Lösung hab' ich leider nicht mehr ...

jaenicke 1. Aug 2009 16:07

Re: Abstandsberechnung zwischen 2 Städten
 
Schau dir einfach einmal die Lösungen zum Adventsgewinnspiel drüben im DF an. ;-)
http://www.delphi-forum.de/viewtopic.php?p=540769
Da ging es u.a. auch darum.

mr____zero 1. Aug 2009 16:16

Re: Abstandsberechnung zwischen 2 Städten
 
wow das ging ja schnell habe das ganze ausprobiert funzt 1a
ihr seit die besten

mr____zero 1. Aug 2009 20:22

Re: Abstandsberechnung zwischen 2 Städten
 
zum einen sorry für doppelpost aber es stellt sich erneut ein kleines problem^^
mag sein das ich schon ne bissle blind bin aber ich finde den fehler net

hab das ganze mal in ein mini prog gepackt aber das liefert mir bei einer strecke von düsseldorf nach berlin eine die distanz 140km
was nicht sein kann

hier mal so
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var lange1,lange2,breit1,breit2,strecke :extended;
begin
    lange1 := Strtofloat(edit1.Text);
    lange2 := Strtofloat(edit3.Text);
    breit1 := Strtofloat(edit2.Text);
    breit2 := Strtofloat(edit4.Text);


    strecke := arccos((sin(breit1)*sin(breit2))+(cos(breit1)*cos(breit2)*cos(lange2-lange1)))/360*40000 ;

    edit5.Text := floattostr(strecke);
end;
ed:mit dem taschenrechner funzt das 1a :(

sx2008 1. Aug 2009 20:27

Re: Abstandsberechnung zwischen 2 Städten
 
Bogenmaß versus Grad.
Die VCL/RTL rechnet im Bogenmass. Es gibt Konvertierungsfunktionen; muss nur etwas suchen (unit Math).

mr____zero 1. Aug 2009 20:31

Re: Abstandsberechnung zwischen 2 Städten
 
Zitat:

Zitat von sx2008
Bogenmaß versus Grad.
Die VCL/RTL rechnet im Bogenmass. Es gibt Konvertierungsfunktionen; muss nur etwas suchen (unit Math).

ed: ok hast recht hätte ich eig selber drauf kommen müssen
ust ja richtig peinlich :wall:

schöni 1. Aug 2009 20:52

Re: Abstandsberechnung zwischen 2 Städten
 
Hallo,

das ist ja aber dann sicher erst mal Luftlinie. Wenn ich aber wegen gefahrener Kilometer zum Beispiel wissen will, welche Strecke ich über unser Strßennetz zurücklegen muss, dürfte die Strecke ja länger werden, als Luftlinie. Ich kann dann zwar einen Routenplaner bemühen, doch der muss mir die Distanz auch berechnen. Wie macht der das?

Gibt es da Näherungsformeln, die die Kurven in der Streckenführung berücksichtigen oder Erfahrungswerte, um wieviele Meter oder Kilometer sich die Strecke durch die reale Streckenführung verlängert?

Bin interessehalber mal wieder hier und habe den Thread gefunden. Mein Job erfordert auch PKW Fahrten. Um die vom Arbeitgeber erstattet zu kriegen, muss ich die Kilometer vorher wissen.
Ich bemühe dann, wie schon gesagt, einen Routenplaner. Aber der muss ja die Strecke auch berechnen. Deshalb interesssiert mich die Frage, wenn denn schon in diesem Thread uber die Berechnung des Abstandes zweier Städte diskutiert wird.

Sogar Flugzeuge fliegen wohl nicht immer exakt Luftlinie, da sie bei großen Strecken unterwegs mehrere Flughäfen ansteuern, die wohl kaum auf der Luftlinie liegen

jaenicke 1. Aug 2009 21:24

Re: Abstandsberechnung zwischen 2 Städten
 
Routenplaner berücksichtigen ja die exakte Streckenführung. Deshalb ist da natürlich der Wert nicht Luftlinie sondern entspricht der zurückgelegten Strecke.

Allgemein kann man das ja nicht berechnen ohne die tatsächlichen Daten zur Streckenführung zu haben, wie es bei Routenplanern der Fall ist.

sx2008 1. Aug 2009 21:25

Re: Abstandsberechnung zwischen 2 Städten
 
Ein Routenplaner ist ein recht komplexes Stück Software.
Falls dich das interessiert, kannst du ja mal OpenStreetMap anschauen.

schöni 1. Aug 2009 22:13

Re: Abstandsberechnung zwischen 2 Städten
 
Zitat:

Zitat von jaenicke
Routenplaner berücksichtigen ja die exakte Streckenführung. Deshalb ist da natürlich der Wert nicht Luftlinie sondern entspricht der zurückgelegten Strecke.

Allgemein kann man das ja nicht berechnen ohne die tatsächlichen Daten zur Streckenführung zu haben, wie es bei Routenplanern der Fall ist.

Schade. Ist also doch aufwendiger.


Zitat:

Zitat von sx2008
Ein Routenplaner ist ein recht komplexes Stück Software.
Falls dich das interessiert, kannst du ja mal OpenStreetMap anschauen.

Danke für den Link! Werd ich mir gleich mal ansehen.

BoolString 1. Aug 2009 23:40

Re: Abstandsberechnung zwischen 2 Städten
 
Für Koordinaten gibt es grundsätzlich 2 Verfahren. Das erste geht von einer idealen Kugelgestalt der Erde aus. Dies ist sicherlich innerhalb Deutschlands und für deine Belange ausreichend genau. Hierbei geht man meist von einem mittleren Planetenradius von 6371 km aus (die Angaben variieren je nach verwendeter Referenz).

Delphi-Quellcode:
Function CalcSimpleGeoDistance (Lat1, Lon1, Lat2, Lon2, aRadius : Double) : Double;
// Calculates the distance between two positions, based on given
// Latitude and Longitude values on an ideal sqhere with a given
// radius; Dr. Jan Schulz, 2007
Var aPart1 : Double;
    aPart2 : Double;
    aPart3 : Double;
Begin
  Lat1 := Lat1 * Pi / 180;
  Lon1 := Lon1 * Pi / 180;
  Lat2 := Lat2 * Pi / 180;
  Lon2 := Lon2 * Pi / 180;

  aPart1 := Cos (Lat1) * Cos (Lon1) * Cos (Lat2) * Cos (Lon2);
  aPart2 := Cos (Lat1) * Sin (Lon1) * Cos (Lat2) * Sin (Lon2);
  aPart3 := Sin (Lat1) * Sin (Lat2);

  Result := ArcCos (aPart1 + aPart2 + aPart3) * aRadius;
end;
Leider ist die Erde aber ein >68-eckiger Klumpen. Für genauere Betrachtungen sollte man deshalb berücksichtigen, daß die Erde durch ihre Rotation zu den Polen hin abgeflacht ist. Besonders wenn man über mehrere 1000 km Distanz mit Koordinaten ausrechnen will. Hier gibt es den Algorithmus von Andoyer, der ihn - um 1949 herum - in einem französischen Ephemeridenkalender veröffentlicht hat. Hab es nicht nachgemessen, aber die Abweichung soll für die Distanz Paris-New York im Bereich der quadrierten Abplattung liegen (<50 m). Natürlich nur in Bezug auf ein Referenzellipsoid. Tatsächlich Weglängen durch Abweichungen im Geoid sind nicht berücksichtigt (Abplattung, Referenzellipsoid und Geoid siehe Wikipedia)...

Delphi-Quellcode:
Function CalcAndoyersGeoDistance (Lat1, Lon1, Lat2, Lon2, RadiusEQ, RadiusPol : Double) : Double;
// Calculates a more precise distance between two positions, based on given
// Latitude and Longitude values for a planet with respect to the flattening
// calculated from the polar and equatorial distance; Dr. Jan Schulz, 2007
Var Flattening : Double;
    AndoyerF  : Double;
    AndoyerG  : Double;
    AndoyerL  : Double;
    AndoyerC  : Double;
    AndoyerS  : Double;
    AndoyerO  : Double;
    AndoyerR  : Double;
    H1         : Double;
    H2         : Double;
Begin
  Lat1 := Lat1 * Pi / 180;
  Lon1 := Lon1 * Pi / 180;
  Lat2 := Lat2 * Pi / 180;
  Lon2 := Lon2 * Pi / 180;

  Flattening := CalcGeometricFlattening (RadiusEQ, RadiusPol);

  AndoyerF := (Lat1 + Lat2) / 2;
  AndoyerG := (Lat1 - Lat2) / 2;
  AndoyerL := (Lon1 - Lon2) / 2;

  AndoyerC := Sqr (Cos (AndoyerG)) * Sqr (Cos (AndoyerL)) +
              Sqr (Sin (AndoyerF)) * Sqr (Sin (AndoyerL));

  AndoyerS := Sqr (Sin (AndoyerG)) * Sqr (Cos (AndoyerL)) +
              Sqr (Cos (AndoyerF)) * Sqr (Sin (AndoyerL));

  AndoyerO := ArcTan ((Sqrt (AndoyerS / AndoyerC)));

  AndoyerR := Sqrt (AndoyerS * AndoyerC) / AndoyerO;

  H1 := (3 * AndoyerR - 1) / (2 * AndoyerC);
  H2 := (3 * AndoyerR + 1) / (2 * AndoyerS);

  Result := 2 * AndoyerO * RadiusEQ * ( 1 +
            Flattening * H1 * Sqr (Sin (AndoyerF)) * Sqr (Cos (AndoyerG)) -
            Flattening * H2 * Sqr (Cos (AndoyerF)) * Sqr (Sin (AndoyerG)));
end;


Function CalcGeometricFlattening (RadiusEQ, RadiusPol : Double) : Double;
// Calculates the geometric flattening of a planet as relative difference
// between the equatorial and polar radius; Dr. Jan Schulz, 2007
Begin
  If RadiusEQ > 0 THen Result := (RadiusEQ - RadiusPol) / RadiusEQ
                  Else Result := 0;
end;
Bei dieser Methode nimmt man für den Äquatorialradius normalerweise 6378.137 km und für den Polradius 6356.752 km. Je nachdem welches Ellipsoid hierbei zu Grunde gelegt wird, weichen die einzelnen Werte voneinander ab.

Liebe Grüße aus ><)))°> Town

Jan


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz