Я использую запрос haversine, чтобы вытащить места, ближайшие к лат/лону, предоставленные из мобильного приложения.расчет расстояния с haversine и float ... kinda working
Запрос выглядит следующим образом:
SELECT *,(((acos(sin(($latitude *pi()/180)) * sin((`lat`*pi()/180))+cos(($latitude *pi()/180)) * cos((`lat`*pi()/180))* cos((($longitude - `lon`)*pi()/180))))*180/pi())*60*1.1515) AS dist_x
FROM `work_places`
HAVING dist_x <= '1'
ORDER BY dist_x ASC
LIMIT 10
Это работает просто отлично, и я получаю именно те места, я должен получать.
Проблема заключается в преобразовании dist_x в нечто, читаемое пользователями. Прямо сейчас, скажем, dist_x читается как: 0.00996273036944 (floatval и как строка показывает то же самое, что и преобразование)
Поскольку запрос выполняется с 1 милю, я пытаюсь преобразовать это в ногу, поэтому я разделяю dist_x по 5280.
$distance = (float)($dist_x/5280);
Что я получаю обратно $ = расстояние 1.88688075179E-6
Что я делаю неправильно?
коэффициента немного неправильно: 1852 м (морская миля)/1609,344 м (стандартные миль) ~ 1,1508. Просто небольшая точка .... –
Я не понимаю, где вы видите эти значения ... – ppetree
В конце инструкции SELECT у вас есть «pi()) * 60 * 1.1515». Вы получаете результат в виде радианов, преобразуете его в градусы, затем в arcminutes, умножая на 60. Один arcminute - это морская миля, а морская миля - 11508 миль. –