У меня есть база данных пользователей, каждому из которых присвоены значения долготы, широты, радиуса (в м) и NotificationID.
Когда пользователь входит в мое приложение, я проверяю его долготу и широту, и мне нужно получить список уведомлений, которые соответствуют этим критериям:
Пользователь А хочет получать уведомления от тех, кто находится в радиусе 1000 метров.
Пользователь B хочет получать уведомления от тех, кто находится в радиусе 20000 метров.
Пользователь C хочет получать уведомления от тех, кто находится в радиусе 5000 метров.
Поэтому, если пользователь C отправляет push-уведомление, оно может быть получено пользователем B, а не пользователем A, даже если пользователь A фактически ближе к пользователю C, чем к пользователю B.
Извинения, если это неясно, мне трудно объяснить.
Я сделал запрос, который будет возвращать координаты тех, кто находится в определенном диапазоне, например 50 м (ниже), но с чем я бьюсь, это расчет индивидуального радиуса каждого человека и то, как он будет связан, если они получат уведомление от других пользователей.
set @orig_lat= mysql_real_escape_string($_POST['Latitude']);
set @orig_lon=mysql_real_escape_string($_POST['Longitude']);
set @dist= mysql_real_escape_string($_POST['Distance']);
$Search_Query= "SELECT *,
3956 * 2 * ASIN(SQRT( POWER(SIN((@orig_lat -
abs(
dest.lat)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180 ) * COS(
abs
(dest.lat) * pi()/180) * POWER(SIN((@orig_lon – dest.lon) * pi()/180 / 2), 2) ))
as distance FROM hotels dest having distance < @distORDER BY distance limit 10";
Этот запрос будет использовать полное сканирование таблицы каждый раз. Вот почему люди используют ГИС (не уверен, почему TLama считает, что вам следует переключать СУБД, MySQL также имеет геопространственные возможности).
Вы не сказали, какой уровень точности вам нужен. Если бы это был я, я бы, вероятно, не стал бы беспокоиться о кругах и ГИС — просто используйте ограничивающий прямоугольник после того, как вы определите радиус по горизонтали и вертикали. Это может быть реализовано в предложении where, позволяющем эффективно использовать индексы. Поле будет включать дополнительные 22% площади в углах, но вы можете отфильтровать их в предложении HAVING.
Других решений пока нет …