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