Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Entfernungsberechnung (https://www.delphipraxis.net/36798-entfernungsberechnung.html)

Stefan Dieler 26. Dez 2004 09:52


Entfernungsberechnung
 
Hallo,

kennt jemand eine Möglichkeit um die Entfernung zwischen zwei Orten über Straßen zu ermitteln.
Gibt es da irgendwelche API's zu Programmen oder Schnittstellen im Internet???

Vielen Dank an alle!

Mamphil 26. Dez 2004 10:00

Re: Entfernungsberechnung
 
Hi!

Nein, ich kenne keine solche Möglichkeit. Dafür müsste auch jemand seine Datenbank mit allen Verkehrswegen zur Verfügung stellen... Ggf. kannst du das bei Map24 einkaufen (bei relativ hohem Jahresmindestumsatz).

Du kannst aber über eine GeoDB die geographischen Koordinaten ermitteln und dann die direkte Entfernung ermitteln... Wenn du möchtest, kann ich mal in meinem Quellenfundus gucken.

Mamphil

Stefan Dieler 26. Dez 2004 10:03

Re: Entfernungsberechnung
 
Hi Mamphil,

vielen Dank für deine Antwort.
Wenn du mir was aus deinem Quellenfundus schicken kannst,
wäre das sehr nett von dir!

pajofego 26. Dez 2004 10:54

Re: Entfernungsberechnung
 
Mich würde das auch interessieren! Könntet ihr das dann hier public machen? Danke

Gruss pajofego

Mamphil 26. Dez 2004 12:46

Re: Entfernungsberechnung
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.

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