Сферический закон косинусов разные результаты между MySQL и переполнением стека

В нашем приложении мы используем PHP для вычисления расстояния между координатами, используя Сферическая формула закона косинуса.
Хотя это не так хорошо масштабируется, поэтому я реорганизовал код для вычисления расстояния в MySQL.
Когда я сравниваю результаты между вычислениями PHP и MySQL, я вижу большие различия.

Lat       | Lng        | PHP     | MySQL
47.457131 | -10.615383 | 1112.8  | 7604.07
61.265367 | 19.939854  | 1508.5  | 6905.3
56.64524  | -21.312707 | 1745.6  | 8589.3
37.028064 | 18.732122  | 1957.5  | 4954.33
38.823754 | -17.029437 | 2112    | 7856.57
70.687405 | 11.08298   | 2217.1  | 7969.53

Все эти расстояния рассчитываются между этими координатами и (Lat: 51.0363432, Lng: 3.7351858).

Вот как это было рассчитано в PHP

public function getDistance($longitude, $latitude)
{
$pi = pi();
$dist = (
(
acos(
sin($latitude * $pi / 180)
*
sin($this->latitude * $pi / 180)
+
cos($latitude * $pi / 180)
*
cos($this->latitude * $pi / 180)
*
cos(($longitude - $this->longitude) * $pi / 180)
)
) * 180 / $pi
) * 60 * 1.1515;

$metric = $dist / 0.62137;
return $metric;
}

Вот как это рассчитывается в SQL

public static function getDistanceQuery($lat, $lng, $distance_name, $units)
{
/*
*  Allow for changing of units of measurement
*/
switch ($units) {
case 'mi':
//radius of the great circle in miles
$gr_circle_radius = 3959;
break;
default:
//radius of the great circle in kilometers
$gr_circle_radius = 6371;
break;

}

/*
*  Generate the select field for distance
*/
$distance_select = sprintf(
"ROUND(
( %d
* acos(
cos( radians(%s) )
* cos( radians( latitude ) )
* cos( radians( longitude ) - radians(%s) )
+ sin( radians(%s) )
* sin( radians( latitude ) )
)
)
, 2 )
AS %s ",
$gr_circle_radius,
$lat,
$lng,
$lat,
$distance_name
);
return $distance_select;
}

Это большие различия из-за более высокой точности в SQL, или что-то не так с одним из кодов?

2

Решение

Я нашел проблему, я должен был сделать математику вручную, прежде чем предполагать.
Широта и долгота перевернули функцию, где вызывается код MySQL.
Результаты сейчас очень близки друг к другу, с небольшими десятичными разностями.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]