sql — PHP Радиус поиска

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

Моя первая идея состояла в том, чтобы сохранить широту и долготу всех POI в базе данных и сравнить местоположение пользователей с местоположением POI через SQL.

Проблема в производительности, я думаю. Если есть тысячи POI и тысячи пользовательских запросов с их местоположением, это не будет очень экономно или это не проблема для современных серверов?

Мой следующий подход состоял в том, чтобы разделить карту на квадранты и только наблюдать за окружающими квадрантами.

ТЛ; др:

В общем, я ищу:

  • способ поиска радиуса
  • в лучшем случае кеширование результатов для других пользователей
  • кеш будет обновляться при регистрации нового POI.

Если у вас есть идеи, как реализовать что-то подобное, пожалуйста, дайте мне знать.

Спасибо

Fabian

1

Решение

Я думаю, что вы ищете Формула 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 непосредственно в ваш запрос, это действительно небезопасно, я сделал это только в качестве примера.

Надеюсь, это поможет вам.

1

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

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

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