Ответ 1
Вот запрос, который я использую в локаторе хранилища, с которым я работаю:
SELECT
`id`,
(
6371 *
acos(
cos( radians( :lat ) ) *
cos( radians( `lat` ) ) *
cos(
radians( `long` ) - radians( :long )
) +
sin(radians(:lat)) *
sin(radians(`lat`))
)
) `distance`
FROM
`location`
HAVING
`distance` < :distance
ORDER BY
`distance`
LIMIT
25
:lat
и :long
- это точки, переданные пользователем, где lat
и long
- это точки, хранящиеся в базе данных.
: расстояние измеряется в милях, в рабочей версии кода: расстояние фактически вытягивается от падения в пределах от 10 до 50 миль.
Изменение кода для работы с километрами может быть выполнено путем изменения 3959 (расстояния от центра земли до его поверхности в милях) до 6371 (3959 миль, пересчитанных в километры) благодаря joshhendo для этого решения.