Поиск точек с различными радиусами вокруг местоположения пользователя

Я использую Firebase для одного из своих проектов, и мне было интересно, можно ли добиться следующего с помощью Geofire.

У меня есть список точек с радиусами, в которых они доступны (широта, длина, радиус). На приложенном изображении синий круг создан точкой и ее радиусом.

Я хочу найти все круги, которые достигают местоположения пользователя (красный круг - просто точка). Конечный эффект, которого я хочу добиться, подобен просмотру всех сетей Wi-Fi вокруг вас, некоторые из которых могут иметь более сильный сигнал.

Можно ли это сделать с помощью Geofire? Если да, то как мне подойти к запросу?

введите здесь описание изображения


person Paweł    schedule 08.09.2016    source источник


Ответы (1)


Firebase не может обработать такой запрос, так как у вас не может быть логики в orderBy. Я не уверен, что geofire может обойти это ограничение (из документов, которые я просматривал, это невозможно), поэтому мы должны придумать другой способ сделать это. Если вы знаете максимальный размер одного из кругов, мы могли бы примерно определить, какие круги выбрать.

(Примечание: я предполагаю, что вам нужны вещи только в верхнем полушарии, есть немного больше математики, если вы хотите справиться с обоими, но я не буду здесь вдаваться в подробности)

Я собираюсь примерно описать, как это сделать, широта/долгота сложны, когда вы приближаетесь к полюсам, а радиус не всегда переводит 1 в 1 с кругом возле экватора, как это происходит дальше на север. По большей части эта идея будет работать, но изменится математика для определения минимума/максимума, а также последний шаг, на котором вы зацикливаетесь.

  1. Based on the red point and max circle radius create the following variables
    • minLatitude: (red circle latitude) - (max circle radius)
    • maxLatitude: (широта красного круга) + (максимальный радиус круга)
    • minLongitutde: (долгота красного круга) - (максимальный радиус круга)
    • maxLongitutde: (долгота красного круга) + (максимальный радиус круга)
  2. you'll have to update your databse to have an index that is searchable for each of the blue circles that contains both latitude and longitude with a certain decimal precision.
    • Something like LATITUDE_LONGITUDE.
  3. Сделайте запрос вроде: ... orderByChild('_latitude_longitude').startAt(minLatitude + '_' + minLatitude).endAt(maxLatitude + '_' + maxLongitutde) (не забудьте убедиться, что все они имеют одинаковую точность)
  4. Это вернет вам все круги, которые будут в пределах максимального радиуса вашего красного круга.
  5. Затем вам нужно будет просмотреть все возвращенные круги и посмотреть, основаны ли они на их собственном радиусе, содержится ли красный круг (здесь очень простая математическая формула, множество примеров в Интернете)

Это единственный метод, который я могу придумать, без обработки на стороне сервера.

person Mathew Berg    schedule 08.09.2016
comment
Спасибо за ваш ответ! По мере роста проблемы с дополнительными требованиями я остановился на гибридном подходе Firebase + PostGIS. - person Paweł; 30.11.2016