Heim > Backend-Entwicklung > PHP-Tutorial > Wie berechnet man den Abstand zwischen zwei Koordinaten in PHP genau?

Wie berechnet man den Abstand zwischen zwei Koordinaten in PHP genau?

Susan Sarandon
Freigeben: 2024-12-03 18:47:14
Original
541 Leute haben es durchsucht

How to Accurately Calculate the Distance Between Two Coordinates in PHP?

Berechnung des Abstands zwischen Koordinaten in PHP

Eine genaue Messung des Abstands zwischen Koordinaten ist für verschiedene Anwendungen unerlässlich. Eine effiziente Methode zur Berechnung ist die Haversine-Formel, die die sphärische Trigonometrie nutzt, um den kürzesten Abstand entlang der Oberfläche einer Kugel (in diesem Fall der Erde) zu bestimmen.

Implementierung der Haversine-Formel in PHP

Während die bereitgestellte PHP-Implementierung versucht, die Haversine-Formel zu verwenden, enthält sie bestimmte Fehler:

  • Das Delta für den Längengrad sollte wie folgt berechnet werden: $delta_lon = $this->lon_b - $this->lon_a; (das Minuszeichen wird umgekehrt).
  • Der sphärische Abstand sollte wie folgt berechnet werden: $distance = 2 * $earth_radius * asin(sqrt($a)); (Verwendung von sin anstelle von acos).

Eine verbesserte Implementierung der Haversine-Formel

Hier ist eine korrigierte PHP-Implementierung:

class CoordDistance
{
    public $lat_a;
    public $lon_a;
    public $lat_b;
    public $lon_b;

    public $measure_unit = 'kilometers';
    public $measure_state = false;
    public $measure;
    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;
    }
}
Nach dem Login kopieren

Alternative Methode: Vincenty-Formel

Die Haversine-Formel dagegen Im Allgemeinen zuverlässig, kann es bei extremen Entfernungen oder bei antipodalen Punkten (die einander direkt gegenüber auf der Kugel liegen) Schwächen aufweisen. Für diese Szenarien bietet die Vincenty-Formel eine genauere Lösung:

/**
 * Calculates the great-circle distance between two points, using the Vincenty formula.
 *
 * @param float $latitudeFrom Latitude of start point in [deg decimal]
 * @param float $longitudeFrom Longitude of start point in [deg decimal]
 * @param float $latitudeTo Latitude of target point in [deg decimal]
 * @param float $longitudeTo Longitude of target point in [deg decimal]
 * @param float $earthRadius Mean earth radius in [m]
 * @return float Distance between points in [m] (same as earthRadius)
 */
public static function vincentyGreatCircleDistance(
    $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000
) {
    // Convert from degrees to radians
    $latFrom = deg2rad($latitudeFrom);
    $lonFrom = deg2rad($longitudeFrom);
    $latTo = deg2rad($latitudeTo);
    $lonTo = deg2rad($longitudeTo);

    $lonDelta = $lonTo - $lonFrom;
    $a = pow(cos($latTo) * sin($lonDelta), 2) +
        pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
    $b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);

    $angle = atan2(sqrt($a), $b);
    return $angle * $earthRadius;
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie berechnet man den Abstand zwischen zwei Koordinaten in PHP genau?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage