我有3種方法看起來幾乎是相同的,但結果是不同的...我在哪裏出錯在Haversine計算在PHP?
class GeoCalculations {
const EARTH_RADIUS = 6371000;
public function degToRad($deg)
{
return $deg * pi()/180;
}
public function haversineDistance($lat_long_1, $lat_long_2) {
$lat_1 = $this->degToRad($lat_long_1->lat);
$lng_1 = $this->degToRad($lat_long_1->lng);
$lat_2 = $this->degToRad($lat_long_2->lat);
$lng_2 = $this->degToRad($lat_long_2->lng);
$d_lat = $lat_2 - $lat_1;
$d_lng = $lng_2 - $lng_2;
echo "-----------------\n";
var_dump($lat_1);
var_dump($lng_1);
var_dump($lat_2);
var_dump($lng_2);
var_dump($d_lat);
var_dump($d_lng);
echo "-----------------\n";
$cord_length = pow(sin($d_lat/2), 2) + cos($lat_1) * cos($lat_2) * pow(sin($d_lng/2), 2);
$central_angle = 2 * atan2(sqrt($cord_length), sqrt(1 - $cord_length));
return self::EARTH_RADIUS * $central_angle;
}
public function haversineDistance2($lat_long_1, $lat_long_2)
{
$lat_1 = deg2rad($lat_long_1->lat);
$lng_1 = deg2rad($lat_long_1->lng);
$lat_2 = deg2rad($lat_long_2->lat);
$lng_2 = deg2rad($lat_long_2->lng);
$d_lat = $lat_2 - $lat_1;
$d_lng = $lng_2 - $lng_2;
echo "-----------------\n";
var_dump($lat_1);
var_dump($lng_1);
var_dump($lat_2);
var_dump($lng_2);
var_dump($d_lat);
var_dump($d_lng);
echo "-----------------\n";
$angle = 2 * asin(sqrt(pow(sin($d_lat/2), 2) + cos($lat_1) * cos($lat_2) * pow(sin($d_lng/2), 2)));
return $angle * self::EARTH_RADIUS;
}
public function haversineDistance3($lat_long_1, $lat_long_2)
{
$latFrom = deg2rad($lat_long_1->lat);
$lonFrom = deg2rad($lat_long_1->lng);
$latTo = deg2rad($lat_long_2->lat);
$lonTo = deg2rad($lat_long_2->lng);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
echo "-----------------\n";
var_dump($latFrom);
var_dump($lonFrom);
var_dump($latTo);
var_dump($lonTo);
var_dump($latDelta);
var_dump($lonDelta);
echo "-----------------\n";
$angle = 2 * asin(sqrt(pow(sin($latDelta/2), 2) +cos($latFrom) * cos($latTo) * pow(sin($lonDelta/2), 2)));
return $angle * self::EARTH_RADIUS;
}
}
$new = new GeoCalculations();
$circle_1 = (object) array('lat' => 36.06228, 'lng' => -79.60886);
$circle_2 = (object) array('lat' => 36.10926, 'lng' => -79.54423);
var_dump($new->haversineDistance($circle_1, $circle_2));
var_dump($new->haversineDistance2($circle_1, $circle_2));
var_dump($new->haversineDistance3($circle_1, $circle_2));
它打印:
--------------- -
浮子(0.6294055217761)
浮子(-1.3894367207592)
浮子(0.63022547745869)
浮子(-1.3883087144636)
浮子(0.00081995568258686)
浮子(0)
------------ -----
浮子(5223.9376537609)
-----------------
浮子(0.6294055217761)
浮子(-1.3894367207592)
浮子(0.63022547745869)
浮子(-1.3883087144636)
浮子( (0)
-----------------
float(5223.9376537616)
---------------- -
浮子(0.6294055217761)
浮子(-1.3894367207592)
浮子(0.63022547745869)
浮子(-1.3883087144636)
浮子(0.000819955682 58697)
浮子(0.0011280062955641)
-----------------
浮子(7811.4545246093)
第三結果是正確的,但我不能瞭解前兩者有什麼問題?
不是一個解決辦法,但可以使用內置['deg2rad()'](http://php.net/manual/en/function.deg2rad.php)函數。 – Voitcus