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”