Я собираюсь создать приложение, в котором пользователи смогут видеть достопримечательности в заданном радиусе вокруг своего местоположения.
Моя первая идея состояла в том, чтобы сохранить широту и долготу всех POI в базе данных и сравнить местоположение пользователей с местоположением POI через SQL.
Проблема в производительности, я думаю. Если есть тысячи POI и тысячи пользовательских запросов с их местоположением, это не будет очень экономно или это не проблема для современных серверов?
Мой следующий подход состоял в том, чтобы разделить карту на квадранты и только наблюдать за окружающими квадрантами.
ТЛ; др:
В общем, я ищу:
Если у вас есть идеи, как реализовать что-то подобное, пожалуйста, дайте мне знать.
Спасибо
Fabian
Я думаю, что вы ищете Формула Harversine, что позволяет найти расстояние между двумя точками в сфере (в данном случае Земли). Реализация с использованием SQL будет выглядеть примерно так:
ACOS (
SIN(RADIANS($latitude)) *
SIN(RADIANS(T.latitude))+
COS(RADIANS($latitude)) *
COS(RADIANS(T.latitude))*
COS(RADIANS($longitude-T.longitud)))*6378.137 AS distance
Добавление этого к выбору вашего запроса вернет столбец, называемый расстоянием, вычисляющий (в км), как далеко находится точка ($ широта, $ долгота), обычно пользователь, из (T.latitude, T.longitude), обычно элемент стола.
Если вы хотите отфильтровать и не показывать элементы дальше определенного расстояния, вы можете создать условие:
HAVING distance<$radius
Я полагаю, что вы используете MySQL, если это так, вы должны использовать HAVING
вместо WHERE
сделать условие для вычисляемого столбца (расстояние).
Полный пример запроса будет выглядеть так:
SELECT T.*, ACOS (
SIN(RADIANS($latitude)) *
SIN(RADIANS(T.latitude))+
COS(RADIANS($latitude)) *
COS(RADIANS(T.latitude))*
COS(RADIANS($longitude-T.longitud)))*6378.137 AS distance
FROM your_table as T
HAVING distance < $radius
ORDER BY distance LIMIT $limit
Если вы хотите немного оптимизировать производительность, добавьте ограничение к запросу, чтобы у вас было, например, 10 ближайших мест.
Не торопитесь, чтобы рассмотреть Пространственные типы данных а также, так как они были специально созданы для такой работы.
Обратите внимание, что я не рекомендую вам вставлять переменные php непосредственно в ваш запрос, это действительно небезопасно, я сделал это только в качестве примера.
Надеюсь, это поможет вам.
Других решений пока нет …