2013-10-07 6 views
1

У меня есть 3 метода, который выглядит почти так же, но результат разный ...Где я ошибся с расчетами Хаверсина в 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,00081995568258697)
поплавок (0)
-----------------
поплавок (5223,9376537616)
---------------- -
поплавок (+0,6294055217761)
поплавок (-1,3894367207592)
поплавок (+0,63022547745869)
поплавок (-1,3883087144636)
поплавок (+0,000819955682 58697)
поплавок (0,0011280062955641)
-----------------
поплавка (7811,4545246093)

Третий результат является правильным, но не могу понять, что не так с первыми двумя?

+1

не решение, но вы можете используйте встроенную функцию '' deg2rad() '] (http://php.net/manual/en/function.deg2rad.php). – Voitcus

ответ

2

Первый 2 есть:

$d_lng = $lng_2 - $lng_2; 

вместо:

$d_lng = $lng_2 - $lng_1; 

(эквивалент этой линии в третьем примере):

$lonDelta = $lonTo - $lonFrom; 
+0

Да, спасибо, человек - моя ошибка. – Kin

 Смежные вопросы

  • Нет связанных вопросов^_^