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:
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; } }
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; }
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!