Der folgende Code berechnet die Entfernung zweier Längen- und Breitengrade (Dezimalgrad). Folgendes muß an die Funktion übergeben werden: lat1, lon1: Breitengrad und Längengrad des ersten Punktes (in Dezimalgrad) lat2, lon2: Breitengrad und Längengrad des zweiten Punktes (in Dezimalgrad) unit: Das gewünschte Längenmaß. Dabei entspricht "M" Meilen, "K" Kilometer und "N" Seemeilen. php function distance( $lat1, $lon1, $lat2, $lon2, $unit) { $theta = $lon1 - $lon2; $dist = sin( deg2rad( $lat1)) * sin( deg2rad( $lat2)) + cos( deg2rad( $lat1)) * cos( deg2rad( $lat2)) * cos( deg2rad( $theta)); $dist = acos( $dist); $dist = rad2deg( $dist); $miles = $dist * 60 * 1. 1515; $unit = strtoupper( $unit); if ($unit == 'K') { return ( $miles * 1. 609344);} else if ( $unit == 'N') { return ( $miles * 0. 8684);} else { return $miles;}} echo distance(52. 5200, 13. 4050, 48. 1351, 11. 5820, 'M'). ' Meilen'. "\n"; echo distance(52. 5820, 'K'). ' Kilometer'. 5820, 'N'). ' Seemeilen'. "\n";? > Die drei Beispielzeilen berechnen die Entfernung zwischen Berlin und München.
Eine davon heißt "Haversine Formel" und definiert sich wie folgt: R = Erdradius (ca. unterschiedliche Quellen nennen zwischen 6336 und 6399 km) dlon = B_lon - A_lon dlat = B_lat - A_lat distance = R * (2 * arcsin(min(1, sqrt((sin(dlat/2))^2 + cos(A_lat) * cos(B_lat) * (sin(dlon/2))^2)))) In diesem Artikel soll es nicht um die mathematische Erklärung der Entfernungs-Berechnung gehen. Wer sich tiefergehend darüber informieren möchte, sollte einen Blick auf den Beitrag im OpenGeoDB Wiki werfen. Im Folgenden sollen viel mehr einige Praxisanwendungen beschrieben werden. Berechnung über die Google Maps API Für die einfache Darstellung von Entfernungsangaben ist die Client-seitige Berechnung über den Browser die erste Wahl. Google Maps bietet für diesen Zweck die Funktion "computeDistanceBetween". Im folgenden Beispiel wird die Entfernung zweier Punkte in Metern berechnet: const latLng1 = new (50. 7271351, 7. 0725076); const latLng2 = new (50. 9392606, 6. 9584879); const distance = (latLng1, latLng2); Um diese Funktion nutzen zu können sollte sichergestellt sein, dass die "Geometry"-Bibliothek geladen werden.
function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') { $theta = $longitude1 - $longitude2; $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); $distance = acos($distance); $distance = rad2deg($distance); $distance = $distance * 60 * 1. 1515; switch($unit) { case 'miles': break; case 'kilometers': $distance = $distance * 1. 609344;} return (round($distance, 2));} Die Variablen sind: $Latitude1 – eine Variable für den Breitengrad Ihres ersten Standorts. $Längengrad1 – eine Variable für den Längengrad Ihres ersten Standorts $Latitude2 – eine Variable für den Breitengrad Ihres zweiten Standorts. $Längengrad2 – eine Variable für den Längengrad Ihres zweiten Standorts. $einheit – das Standardwesen Meilen. Dies kann aktualisiert oder als übergeben werden Kilometer. Python: Berechnen Sie die Entfernung zwischen 2 Breiten- und Längengraden Wie auch immer, hier ist die Python-Formel zur Berechnung der Entfernung zwischen zwei Punkten (zusammen mit der Umrechnung von Meilen gegen Kilometer), die auf zwei Dezimalstellen gerundet ist.
Dies erfolgt über den entsprechenden Parameter "libraries=geometry" bei der "Google Map"-Initialisierung wie in dem folgenden Beispiel zusehen: Berechnung über PHP Ist es notwendig die Entfernungs-Berechnung serverseitig durchzuführen? In diesem Fall würden wir als PHP Entwickler als Nächstes daran denken, die "Haversine Formel" oder eine Alternative in PHP zu implementieren. Glücklicherweise gibt es dafür bereits mehrere Pakete wie z. B. phayes/geoPHP, die sich diesem Problem schon angenommen haben. Soll zu einer kleinen Auswahl (bis ca. 100 Einträge) eine Distanz berechnet werden, ist dieser Lösungsansatz absolut legitim. Geht es jedoch eher um das Filtern eines großen Datensatzes z. B. bei der Radius-Suche in einem Store-Finder mit 100. 000 oder mehr Einträgen ist diese Methode nicht zu empfehlen. Die Daten müssten zunächst in der Gesamtheit aus der Datenbank geladen und anschließend mit einer Filterfunktion iteriert werden. Die würde eine enorm lange Ladezeit zur Folge haben.
Das Ergebnis: 313. 41407650596 Meilen 504. 39106354041 Kilometer 272. 16878403777 Seemeilen
500 Anfragen. OpenStreetMap besitzt auch eine API, aber auch diese bietet keine unlimitierten Anfragen. Wenn du häufige Abfragen erwartest, würde ich dir den Download der Daten (zum Beispiel via Osmosis) empfehlen und/oder solche Informationen in einer lokalen Datenbank zwischenzuspeichern. Alternativ kannst du auch die Luftlinienentfernung berechnen. Das ist sogar viel einfacher, weil man sich nicht (unbedingt) auf einen externen Dienst verlassen muss. Die Entfernung aus zwei GPS-Koordinaten lässt sich ganz einfach in ein paar Schritten errechnen und das funktioniert auch mit PHP problemlos. GeoNames bietet für viele Länder eine Klartextliste von Orten für viele Länder an. Für Deutschland gibt es beispielsweise fast 16. 500 Koordinaten - das ist bereits mehr als die zirka 12. 000 Städte, die es im ganzen Land gibt. #7 Danke für eure Antworten! Die Luftentfernung reicht, ich brauche unlimitierten Zugang. #8 Wie mehmals gesagt nimm dir einen von den vorgeschlagenen Anbietern und Cache die Suchergebnisse auf einer dB so hast du schnell alles bei dir lokal und bist beinahe befreit von externen Anbietern Zuletzt bearbeitet: 13. Februar 2013