Hallo, ich muss den Abstand zwischen zwei Punkten mit Lat und Long berechnen.
Ich möchte jeden Aufruf einer externen API vermeiden.
Ich habe versucht, die Haversine-Formel in PHP zu implementieren:
Hier ist der Code:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
Wenn ich es mit bestimmten Punkten teste, die öffentliche Entfernungen haben, erhalte ich kein verlässliches Ergebnis.
Ich verstehe nicht, ob es einen Fehler in der Originalformel oder in meiner Implementierung gibt
php
coordinates
geocoding
haversine
maxdangelo
quelle
quelle
Antworten:
Vor kurzem habe ich ein Beispiel für die Haversine-Formel geschrieben und auf meiner Website veröffentlicht:
➽ Beachten Sie, dass Sie den Abstand in derselben Einheit zurückerhalten, in der Sie den Parameter eingegeben haben
$earthRadius
. Der Standardwert ist 6371000 Meter, daher wird das Ergebnis auch in [m] angezeigt. Um das Ergebnis in Meilen zu erhalten, könnten Sie z. B. 3959 Meilen überschreiten,$earthRadius
und das Ergebnis wäre in [mi]. Meiner Meinung nach ist es eine gute Angewohnheit, bei den SI-Einheiten zu bleiben, wenn es keinen besonderen Grund gibt, etwas anderes zu tun.Bearbeiten:
Wie TreyA richtig hervorhob, weist die Haversine-Formel aufgrund von Rundungsfehlern Schwächen mit antipodalen Punkten auf (obwohl sie für kleine Entfernungen stabil ist ). Um sie zu umgehen , können Sie stattdessen die Vincenty-Formel verwenden.
quelle
Ich habe diesen Code gefunden, der mir zuverlässige Ergebnisse liefert.
Ergebnisse :
quelle
Es ist nur eine Ergänzung zu den Antworten von @martinstoeckli und @Janith Chinthana . Für diejenigen, die neugierig sind, welcher Algorithmus am schnellsten ist, habe ich den Leistungstest geschrieben . Das beste Leistungsergebnis zeigt die optimierte Funktion von codexworld.com :
Hier sind die Testergebnisse:
quelle
1.1515 * 1.609344 = 1.853
. Danke, behoben auf 1.853.Hier der einfache und perfekte Code zur Berechnung der Entfernung zwischen zwei Breiten- und Längengraden. Der folgende Code wurde von hier gefunden - http://www.codexworld.com/distance-between-two-addresses-google-maps-api-php/
quelle
Für diejenigen, die kürzer und schneller mögen (ohne deg2rad ()).
quelle
Versuchen Sie dies ergibt fantastische Ergebnisse
quelle
Eine ziemlich alte Frage, aber für diejenigen, die an einem PHP-Code interessiert sind, der die gleichen Ergebnisse wie Google Maps liefert, ist Folgendes der Fall:
Ich habe mit verschiedenen Koordinaten getestet und es funktioniert perfekt.
Ich denke, es sollte schneller sein als einige Alternativen. Aber das habe ich nicht getestet.
Hinweis: Google Maps verwendet 6378137 als Erdradius. Die Verwendung mit anderen Algorithmen könnte also auch funktionieren.
quelle
Für genaue Werte machen Sie es so:
Hmm ich denke das sollte es tun ...
Bearbeiten:
Für Formulare und mindestens JS-Implementierungen versuchen Sie: http://www.movable-type.co.uk/scripts/latlong.html
Wagen Sie es ... Ich habe vergessen, alle Werte in den Kreisfunktionen zu deg2rad ...
quelle
Hallo hier Code zum Abrufen von Entfernung und Zeit mit zwei verschiedenen Lat und Long
Sie können das Beispiel unter Link überprüfen, um die Zeit zwischen zwei verschiedenen Orten mithilfe von Längen- und Breitengrad in PHP abzurufen
quelle
Probieren Sie diese Funktion aus, um die Entfernung zwischen den Längen- und Breitengraden zu berechnen
Verwenden Sie dann die Funktion als
Ich hoffe es hilft
quelle
Der Multiplikator wird an jeder Koordinate aufgrund der hier beschriebenen Großkreisentfernungstheorie geändert:
http://en.wikipedia.org/wiki/Great-circle_distance
und Sie können den nächsten Wert mit dieser hier beschriebenen Formel berechnen:
http://en.wikipedia.org/wiki/Great-circle_distance#Worked_example
Der Schlüssel konvertiert jeden Grad - Minute - Sekunde - Wert in alle Gradwerte:
quelle
Eine der einfachsten Möglichkeiten ist:
Es werden bis zu 2 Dezimalstellen gerundet.
quelle