Thema: Delphi Entfernungsberechnung

Einzelnen Beitrag anzeigen

Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#5

Re: Entfernungsberechnung

  Alt 26. Dez 2004, 13:46
Hi!

Ich benutze das Projekt OpenGeoDb - freie Geokoordinaten-Datenbank nach Orten und PLZs. Das ist kostenlos und enthält so wie ich das sehe alle Orte. Kleine "Kaffs" und Stadtteile sind (noch) nicht enthalten. Zum Beispiel gibt es für Berlin nur einen Eintrag.

Bei dem Datenbank-Dump handelt es sich um einen MySQL-Dump, der sollte aber ggf. auch für andere DBs verwendbar sein. Darin findest du dann die Felder "breite" und "laenge", also die geographischen Koordinaten.

Zuerst müssen die Daten vom Kugel-Koordinatensystem ins kathesische Koordinatensystem umgewandelt werden:
Delphi-Quellcode:
var
  geoBreite, geoLaenge, lambda, phi: Double;
  geoKoordX, geoKoordY, geoKoordZ: Longint;
const
  Erdradius = 6371000; // Mittlerer Erdradius in Metern nach PAETEC Formelsammlung S. 112
Delphi-Quellcode:
// Umwandlung der Kugel-Koordinaten ins kathesische Koordinatensystem:
// Umrechnung ins Bogenmaß
lambda := geoLaenge * PI / 180;
phi := geoBreite * PI / 180;

geoKoordX := Round(Erdradius * cos(phi) * cos(lambda));
geoKoordY := Round(Erdradius * cos(phi) * sin(lambda));
geoKoordZ := Round(Erdradius * sin(phi));
Jetzt habe ich die Koordinaten in einem rechtwinkligen Koordinatensystem in der Einheit "Meter" wenn ich davon ausgehe, dass die Erde eine perfekte Kugel mit r=Erdradius=6371000 m ist.

Um die Entfernung zweier Orte zu ermitteln, berechnest du erst einmal die direkte Entfernung (also Sichkontakt, durch die Erde hindurch):
Delphi-Quellcode:
// Nach dem Satz des Pythagoras (ungetestet)
Entfernung1 := round(sqrt(
           (geoKoordX1-geoKoordX2)*(geoKoordX1-geoKoordX2)
         + (geoKoordY1-geoKoordY2)*(geoKoordY1-geoKoordY2)
         + (geoKoordZ1-geoKoordZ2)*(geoKoordZ1-geoKoordZ2)
         ));
Als nächstes benötigen wir den Winkel Ort1-Erdmittelpunkt-Ort2 (also am Erdmittelpunkt):
Delphi-Quellcode:
// Wir recyclen lambda:
lambda := 2 * abs(arcsin(Entfernung1 / (2 * Erdradius)));
Jetzt gilt es, die Bogenlänge eines Bogens mit dem Radius "Erdradius" und dem Winkel "lamdba" zu ermitteln. Wir erinnern uns, dass der Umfang eines Kreises U=2*PI*r ist. Wir benötigen davon lambda/360°. Die Länge des Kreisausschnitts ist also l=U*lambda/360=2*PI*r*lambda/360=PI*r*lambda/180.
Allerinds liegt lamdba im Bogenmaß vor. Die Umrechnung von Bogenmaß ins Gradmaß sieht so aus: Gradmaß = Bogenmaß * 180 / PI.
Also:
l = PI*r*lambdaGrad/180 = PI*r*lambdaBogen*180/PI/180
Überraschung Wir können kürzen:
l = r * lambdaBogen

Also:
Delphi-Quellcode:
// Entfernung2 ist die Entfernung über den Bogen:
Entfernung2 := Erdradius * lambda
Ich hoffe, ich habe in die Teile zur Entfernungsermittlung keinen Fehler eingebaut, die habe ich nämlich gerade zusammengeschrieben...

Mamphil
The laws of physics are the canvas God laid down on which to paint his masterpiece. “Leonardo Vetra” in Dan Brown’s “Angels & Demons”
  Mit Zitat antworten Zitat