Используя алгоритм Haversine и используя ссылку Вот Я нашел половину своего решения. Так вот в чем проблема:
Пользователь А, который стоит в «Назарете» и имеет 50-километровый радар вокруг него, я могу найти всех других пользователей в этом диапазоне, используя алгоритм, описанный выше. Теперь моя проблема в том, что пользователь, стоящий в точке B (пользователь около Ньюарка), у которого также есть радар в 50 км, пересекается с радаром пользователя A.
Таким образом, наряду с результатами, которые мне удалось получить, которые попадают под радар пользователя А в 50 км, используя вышеуказанный алгоритм, я также хочу включить всех пользователей (таких как пользователь Б), чьи радары пересекаются.
Я не уверен, что это правильный алгоритм для использования или у меня совершенно другой подход к этому моему запросу.
Ниже приведен запрос, который я написал, чтобы просто выбрать всех пользователей, которые попадают под радар пользователя А на расстоянии 50 км, и я получаю наиболее точные результаты, которые были первой частью проблемы.
SELECT
*
FROM
users
WHERE
acos(sin(".$user_location_A['latitude'].") * sin(radians(latitude)) +
cos(".$user_location_A['latitude'].") * cos(radians(latitude)) * cos(radians(longitude) -
(".$user_location_A['longitude']."))) * 6371 <= 50
Объяснение вышеупомянутого запроса следующее:
latitude
)), cos (радианы (latitude
)) — широта здесь — это широта имени столбца в таблице пользователей для каждого пользователяlongitude
) — долгота здесь — это долгота имени столбца в таблице пользователей для каждого пользователя50
в конце запроса — радиус 50 км, ради которого я хочу создать радар.Если все радары имеют радиус 50 км, то любой радар, центр которого находится в пределах 100 км от А, будет пересекаться с ним. Если они имеют разные радиусы, то интересующее расстояние составляет 50 км (радиус A) + R км (где R — радиус радиолокатора B).
Других решений пока нет …