Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Entfernungsbrechnung von OpenStreetMap-Koordinaten (https://www.delphipraxis.net/201842-entfernungsbrechnung-von-openstreetmap-koordinaten.html)

Hobbycoder 2. Sep 2019 17:21

Entfernungsbrechnung von OpenStreetMap-Koordinaten
 
Ich möchte gerne die Entfernung zwischen 2 Koordinaten berechnen. Der erste Wert kommt von eime GPS-System und der zweite von Koordinaten, die über OpenStreetMap ermittelt wurden.

Die Formel für die Berechnung habe ich von hier.

Meine Funktion sieht folgendermaßen aus:
Delphi-Quellcode:
function DistanceKM(lat1, lon1, lat2, lon2: Extended): Extended;
begin
  Result:=6378.388 *
    ArcCos(sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon2 - lon1));
end;
Das von der Funktion berechnete Ergebnis lautet: 735.91 km.
Lasse ich die beiden Koordinaten jedoch bei https://rechneronline.de/geo-koordinaten/#entfernung berechnen, kommt 15.896 km raus (war auch korrekt ist).

Kann mir jemand sagen, was an der Formel falsch ist?

Luckie 2. Sep 2019 17:37

AW: Entfernungsbrechnung von OpenStreetMap-Koordinaten
 
Hast du den Unterschied Grad/Rad berücksichtigt?

Mavarik 2. Sep 2019 17:41

AW: Entfernungsbrechnung von OpenStreetMap-Koordinaten
 
hmm...

Versuche es mal mit:

Delphi-Quellcode:
function GetDistanceBetween(lat1,Long1,lat2,Long2 : Double) : Double;
var
  F,G,L : Double;
  SF, SG, SL,
  CF, CG, CL : Double;
  W1, W2 : Double;
  S, C : Double;
  O,R,D : Double;
  H1, H2 : Double;
  ff : Double;
begin
  try
    ff := 1 / 298.257;
    F := (lat1 + lat2) / 2;
    G := (lat1 - lat2) / 2;
    L := (long1 - long2) / 2;

    SF := Sin(F*Pi/180);
    SG := Sin(G*Pi/180);
    SL := Sin(L*Pi/180);
    CF := Cos(F*Pi/180);
    CG := Cos(G*Pi/180);
    CL := Cos(L*Pi/180);

    W1 := sqr(SG * CL);
    W2 := sqr(CF * SL);
    S := W1 + W2;

    W1 := sqr(CG * CL);
    W2 := sqr(SF * SL);

    C := W1 + W2;

    if C = 0.0 then
      exit(0.0);

    O := ArcTan(Sqrt(S/C));

    if O = 0.0 then
      exit(0.0);

    R := Sqrt(S*C) / O;
    D := 2 * O * 6378.14;

    H1 := (3*R-1) / (2*C);
    H2 := (3*R+1) / (2*S);

    W1 := sqr(SF * CG) * H1 * ff + 1;
    W2 := sqr(CF * SG) * H2 * ff;

    result := D * (W1 - W2) * 1000;
  except
    Result := 0;
  end;
end;
Mavarik :coder:

Hobbycoder 2. Sep 2019 17:57

AW: Entfernungsbrechnung von OpenStreetMap-Koordinaten
 
Zitat:

Zitat von Luckie (Beitrag 1444401)
Hast du den Unterschied Grad/Rad berücksichtigt?

Natürlich nicht ;-) mit DegToRad komme ich auf 12,8 km....hm.

Zitat:

Zitat von Mavarik (Beitrag 1444402)
hmm...

Versuche es mal mit:

Delphi-Quellcode:
function GetDistanceBetween(lat1,Long1,lat2,Long2 : Double) : Double;
...
Mavarik :coder:

Liefert die Funktion Meter zurück? Dann würde es passen. Kommt 15904.91 bei raus, und deckt sich nahe zu mit den online berechneten Werten

Rollo62 3. Sep 2019 07:51

AW: Entfernungsbrechnung von OpenStreetMap-Koordinaten
 
Das Problem ist das die Erde KEINE Kugel ist, und es wohl deshalb zig verschiedene Versionen einer solchen Berechnung gibt.
Welche jetzt "amtlich" ist kann ich nicht sagen, aber vielleicht gibt es hier ja ein paar Geo-Spezialisten.

Hier nur mal ein paar Versionen
http://www.movable-type.co.uk/scripts/latlong.html
http://delphiforfun.org/Programs/Lib...stanceTest.htm

Mavarik 3. Sep 2019 09:40

AW: Entfernungsbrechnung von OpenStreetMap-Koordinaten
 
Zitat:

Zitat von Rollo62 (Beitrag 1444471)
Das Problem ist das die Erde KEINE Kugel ist, und es wohl deshalb zig verschiedene Versionen einer solchen Berechnung gibt.
Welche jetzt "amtlich" ist kann ich nicht sagen, aber vielleicht gibt es hier ja ein paar Geo-Spezialisten.

Amtlich ist ne gute Frage, ich denke meine Version ist recht gut und berücksichtig die 1 / 298.257 Abflachung durch die Erddrehung.

dummzeuch 3. Sep 2019 12:43

AW: Entfernungsbrechnung von OpenStreetMap-Koordinaten
 
Über diese Berechnungen kann man Doktorarbeiten schreiben (und das haben auch diverse Geographen getan). Die meisten Formeln sind über kurze Entfernungen ganz brauchbar, über längere gibt es mehr oder weniger große Abweichungen.

Ich habe das Glück, dass meine Berechnungen meist nur über ein paar Kilometer genau sein müssen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 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