2013-08-27 4 views
4

Я пытаюсь получить расстояние от двух мест, мне действительно нужно, чтобы это было сделано с mySQL, так как мне приходится фильтровать множество записей. К сожалению, результаты оператора mysql отличаются от результатов Google Maps. Что может быть причиной.Расчет расстояния с долготой и широтой имеет разные результаты

Мое заявление Mysql является (Значения жестко вписаны)

SELECT ((ACOS(SIN(6.914556 * PI()/180) * SIN(6.913794 * PI()/180) + COS(6.914556 * PI()/180) * COS(6.913794 * PI()/180) * COS((79.973194- 79.97330) * PI()/180)) * 180/PI()) * 60 * 1.609344 * 1000) AS `distance` 

Я получаю 74,27 метров как расстояние.

Затем я использовал другой оператор SQL, который я нашел, и он дает 85,53 метра.

SELECT (1.609344 * 1000 * 3959 * acos(cos(radians(6.914556)) * cos(radians(6.913794)) * cos(radians(79.97330) - radians(79.973194)) + sin(radians(6.914556)) * sin(radians(6.913794)))) AS distance 

Но если я использую Google API

http://maps.googleapis.com/maps/api/directions/json?origin=6.914556,79.973194&destination=6.913794,79.97330&sensor=false

Я получаю 28 метров как расстояние.

В любом случае, я могу исправить эту проблему. Мне нужно решение для работы с MySQL. Подтвердите всю вашу поддержку.

Edit:

Я попытался с PHP еще у меня есть эта разница расстояния.

<?php 
function distance($lat1, $lon1, $lat2, $lon2, $unit) { 

    $theta = $lon1 - $lon2; 
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
    $dist = acos($dist); 
    $dist = rad2deg($dist); 
    $miles = $dist * 60 * 1.1515; 
    $unit = strtoupper($unit); 

    if ($unit == "K") { 
    return ($miles * 1.609344); 
    } 
    else if ($unit == "M") { 
    return ($miles * 1.609344 * 1000); 
    }else if ($unit == "N") { 
    return ($miles * 0.8684); 
    } else { 
    return $miles; 
    } 
} 

function getDrivingDistance($inLatitude,$inLongitude,$outLatitude,$outLongitude) 
    { 
     if(empty($inLatitude) || empty($inLongitude) ||empty($outLatitude) ||empty($outLongitude)) 
      return 0; 

     // Generate URL 
     $url = "http://maps.googleapis.com/maps/api/directions/json?origin=$inLatitude,$inLongitude&destination=$outLatitude,$outLongitude&sensor=false"; 

     // Retrieve the URL contents 
     $c = curl_init(); 
     curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($c, CURLOPT_URL, $url); 
     $jsonResponse = curl_exec($c); 
     curl_close($c); 

     $dataset = json_decode($jsonResponse); 
     if(!$dataset) 
      return 0; 
     if(!isset($dataset->routes[0]->legs[0]->distance->value)) 
      return 0; 
     $distance = $dataset->routes[0]->legs[0]->distance->value; 

     return $distance; 
    } 
echo distance(6.914556,79.973194,6.913794,79.97330,'M') . "<br>"; 
echo getDrivingDistance(6.914556,79.973194,6.913794,79.97330); 

?> 
+2

Возможно, вы используете другую (и менее точная) формула для расчета - Винцентий и Хаверсине - две основные формулы большого круга (Винчентий более точен, но также требует больше вычислительной мощности для расчета), я бы предположил, что Google будет использовать один из этих ... вы используя гораздо более простую формулу (Сферический закон косинусов), который будет менее точным, чем вышеупомянутые формулы расстояния большого круга. –

ответ

2

Указанная ссылка на карту имеет разную широту и долготу.

 "northeast" : { 
      "lat" : 6.913845999999999, 
      "lng" : 79.9733002 
     }, 
     "southwest" : { 
      "lat" : 6.913794800000001, 
      "lng" : 79.9730488 
     } 

Используя это в своем запросе, оно дает правильное расстояние.

4

Я пробовал Формула большого круга, и результат 85,5 м (ваша формула не совсем правильная, но близкая). Разница с Google заключается в том, что Google пытается рассчитать расстояние от двух точек на дороге, так или иначе проецируется точка на дорогу. См. Рисунок ниже. (Красная линия - график из координат, имеет расстояние 85,5 м, синяя линия отображается Google, как-то «привязана» к дороге) The actual line is red has a distance of 85.5m, the blue line is render by Google, is 'snapped' to the road

+0

Это просто потому, что это более визуально и легче понять? Почему ты так злишься? – haibuihoang

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