Предполагая, что у вас есть местоположение и направление, ваша цель состоит в том, чтобы найти, какие элементы в вашей базе данных находятся рядом с местоположением, в соответствующем направлении.
Очевидно, что вы можете сканировать каждый элемент в вашей базе данных и отвечать на каждый из них: «Это в регионе?». Настоящая магия - это эффективность; как вы индексируете данные в базе данных, так что вы можете ответить на этот вопрос, не изучая каждую запись.
Отличным примером этого является MongoDB . Однако его реализация не обрабатывает направление, поэтому вам нужно будет отфильтровать результаты. Вы будете использовать базу данных, чтобы получить все объекты на расстоянии х от вас, и отфильтруете те элементы, которые не в нужном направлении.
Если вы не можете использовать ядро базы данных с собственной геопространственной индексацией, вам придется реализовать его самостоятельно. Как упоминалось в комментариях, функция Хаверсайна используется для вычисления расстояния на сфере (в данном случае, на земле). Вместо того, чтобы вычислять расстояние между каждой точкой и вами, вы могли бы начать с устранения любых элементов, которые находятся за пределами допустимого диапазона, например (ваша широта + ваше расстояние поиска) <(широта объектов). Затем используйте Haversine для дальнейшей фильтрации. Вы также можете использовать функцию геопространственного хеширования, чтобы выполнить большую часть работы заранее. </p>
Как только у вас есть все элементы в пределах диапазона, вы можете преобразовать координаты x-y в вашей базе данных в полярные координаты. Короче говоря:
arctan((item_y - users_y) / (item_x - users_x)) = the angle between the item and the user
Если вы вычислите это для каждого элемента в пределах «диапазона» пользователя и отфильтруете любые элементы, которые не находятся в пределах некоторых границ угла компаса (например, +/- 20 градусов), вы получите элементы, которые вы необходимо.
Если эффективность все еще является проблемой, вы можете стать более умным, немедленно аннулировав любые элементы, которые, например, находятся не на той стороне пользователя (если пользователь обращен на запад, чем любые элементы, координата х которых выше, чем пользователь не может быть в его представлении). В зависимости от вашего языка программирования также может быть более эффективно использовать статическую таблицу арктанов с более низкой степенью точности, чем обычно предоставляется.
Если вы особенно умны, вы также можете найти способы индексирования данных по углу, что еще больше снизит требуемые вычисления.