Frage

fand ich eine Funktion in einer PHP-Seite, die die Anzahl der Meilen zwischen 2 Punkten berechnet, aber es ist fehlerhaft. Es sollte mit Google Maps arbeiten, aber der Unterschied in Abständen im Bereich von 1,3 bis 1,65-Fache in Google Maps (das ist genauer).

Hier ist die Funktion:

$M =  69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));

Ich finde es ein bisschen kompliziert zu sein, und ich weiß nicht, dass viel über Geometrie zu wissen wheter oder nicht, das ist richtig.

Kann jemand mit ein bisschen mehr Know-how einen Blick auf diese und sehen, was mit ihm los?

War es hilfreich?

Lösung

Vielleicht vergleichen Sie die ‚Entfernung in der Luftlinie‘ (direkte Linie zwischen zwei Punkten) mit dem Auto erreichbar?

Auch diesen Beitrag Abstand zwischen zwei Punkten für die Berechnung in PHP.

Andere Tipps

Sie suchen nach dem Haversine Formel Abstand zwischen zwei Punkten zu berechnen, die Sie haben Längen- und Breitengrad für.

Eine einfache Implementierung in Javascript können hier werden , die mit PHP einfach konvertieren soll.

Es gibt mindestens drei Paare verschiedene Methoden zur Entfernung der Berechnung auf der Oberfläche der Erde, die in der Genauigkeit und die erforderlichen Rechen variieren.

  1. Sphärische Kosinussatz [nicht sehr genau, sehr einfach zu berechnen]
  2. Haversine Formel [genaue außer bei kleineren Abständen, immer noch relativ einfach berechnen]
  3. Vincenty Formel [sehr genau und kann mehrere verwenden verschiedene Ellipsoid-Modelle der Erdoberfläche, komplizierter zu berechnen]

Das Beispiel, das Sie zur Verfügung gestellt wird die Kosinussatz Berechnung sein, während Google Maps genauer ist, da es die Vincenty Formel verwendet. (Ich finde, dass die Vincenty Verbindung die Formel in einem besseren Detail erklärt, als es Wikipedia-Seite)

Edit: Ich sah einen Kommentar oben, dass der Fehler durch die Abweichung in der Oberfläche der Erde eingeführt trivial ist und den Fehler nicht komponieren können Sie sehen. Ich fürchte, das einzig wahre über sehr große Entfernungen ist. Bei Entfernungen von ein paar hundert km oder weniger, können die Fehler entschieden nicht-trivial sein.

Hier ist eine einfachere Version, aber nicht genau für sehr weit entfernte Orte:

    const ONE_DEGREE = 111120;

public function distance( $point ) {
    $coef = cos( $this->getLatitude() / 180 * M_PI );
    $x = $this->getLatitude() - $point->getLatitude();
    $y = ( $this->getLongitude() - $point->getLongitude() ) * $coef;
    $result = sqrt( $x * $x + $y * $y ) * self::ONE_DEGREE;
    return $result;
}

$ Punkt und diese $ sind Instanzen von Location-Klasse mit getLatitude () und getLongitude () Methoden.

Ich weiß nichts über Geometrie entweder, aber Google vorgeschlagen dieser Seite .maybe Sie es nützlich finden werden

Es sieht aus wie die Formel korrekt ist - siehe zum Beispiel Wikipedia über „Großkreisentfernung „. Der Faktor von 69,09 vor ist, glaube ich, die Anzahl der Meilen in einem Grad entlang einem großen Kreises gemessen (z Meilen in 1 Längengrad am Äquator), so dass Ihre Antwort in Meilen sein wird.

jonstjohn die Idee, dass Sie falsch scheint geradlinige Entfernung mit dem Auto erreichbar, wie die wahrscheinlichste Erklärung für mich sein könnten verglichen werden.

EDIT : oder es könnte der Rundungsfehler Wikipedia erwähnt sein, wenn Sie mit kleinen Trennungen arbeiten. Aber ich würde zuerst meine Finger auf die direkte / Fahrentfernungsdifferenz zeigen.

Es sieht aus wie die Berechnung Sie Referenzierung sind verwendet System eine sphärische koordinieren. Die Formel ist fast richtig. Teil dessen, was könnte Ihre Berechnung off werfen der Radius Sie verwenden. Die 69,09 ist der Radius der Kugel (Erde in diesem Fall). Wie Sie vielleicht wissen, ist die Erde nicht wirklich eine Kugel, eher ein Ellipsoid. Ich würde vorschlagen, dass die Formulierung unter versuchen:

3963 * acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2)));

Für genauere Ergebnisse, Sie wollen Vincenty oder Haversine Berechnungen verwenden.

EDIT: Um zu klären, ich versuche nicht, zu implizieren, dass der Großteil der Fehler Sie Berichterstattung durch eine sphärische Koordinatenberechnung zu verwenden. Dieser Fehler ist viel kleiner als das, was Sie sehen. Die Formel I Einstellung zugeführt wurde, bestimmt, eine bessere Version der Formel zu sein, da die 69,09 ein Wert des Radius der zu einem gewissen Grad System eingestellt Erde war, was weniger ist, als einfach unter Verwendung intuitiver Bogenmaß. Darüber hinaus ist es erwähnenswert, dass sehr kleine Abstände zur Berechnung unter Verwendung der Formel oben sehr genau ist (bis auf etwa 1 m Abstände), solange das System die Berechnung zu tun mit genügend Dezimalstellen arbeitet. gibt Ihnen diese Genauigkeit einen Schwimmer in modernen Computern verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top