расчет расстояния с гаверсинусом и поплавком вроде работает

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

Запрос выглядит так:

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 );

Я получаю обратно $distance = 1.88688075179E-6

Что я делаю не так?


person ppetree    schedule 26.10.2012    source источник
comment
Коэффициент пересчета немного неверен: 1852 м (морская миля) / 1609,344 м (стандартная миля) ~ 1,1508. Просто незначительный момент....   -  person Thorsten S.    schedule 29.10.2012
comment
Я не понимаю, где вы видите эти значения...   -  person ppetree    schedule 29.10.2012
comment
В конце оператора SELECT у вас есть pi())*60*1,1515. Вы получаете результат в радианах, преобразуете его в градусы, а затем в угловые минуты, умножая на 60. Одна угловая минута — это морская миля, а морская миля — 11508 стандартных миль.   -  person Thorsten S.    schedule 29.10.2012
comment
Кстати, спасибо за это ... Я изменил расчеты с * 5280 на * 6076,12, что намного точнее.   -  person ppetree    schedule 25.06.2016


Ответы (2)


Я могу что-то упустить, но если вы хотите перевести мили в футы, разве вы не хотите умножать на 5280 вместо деления?

person localhost    schedule 27.10.2012
comment
Вот что происходит, когда вы работаете слишком много часов... вы делаете зигзаги, когда вы должны быть загами, и делаете маленькие глупые ошибки, и вы не можете понять, почему вы получаете те ошибки, которые получаете, и вы публикуете глупые вопросы для других людей. отвечать! Лол спасибо! - person ppetree; 29.10.2012

В миле 5280 футов, так что должно быть

$distance = (float)( $dist_x * 5280 );
person interskh    schedule 27.10.2012
comment
Я дал локальному хосту решение, потому что... он ответил первым... но спасибо! - person ppetree; 29.10.2012