Предупреждение о близости для местоположений, сохраненных на сервере

Я сделал поиск, но не нашел подходящего ответа.

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

Каким будет лучший способ реализовать это?

Было бы разумно, если приложение запрашивает подтверждение близости при каждом перемещении устройств?

Ответ 1

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

  • Получить исходное местоположение устройства и отправить его на сервер.
  • Определите разумный радиус, чтобы устройство оставалось в нем в течение следующих 5-10 минут. Также убедитесь, что у вас нет "слишком много" точек в этом радиусе, или вы можете сузить радиус в этом случае. Вам решать, радиус и количество очков, в зависимости от вашего использования, количество пунктов и т.д.
  • Отправлять на сервер все местоположения в пределах этого радиуса.
  • Позвольте устройству самостоятельно подсчитать близость.
  • Когда устройство выходит из начального радиуса - обновите сервер и получите новый соответствующих местах. Это можно сделать легко - вызовите радиус r. Сохраните исходное местоположение устройства и рассчитайте расстояние между текущим и начальным местоположением. Когда он "достаточно близко" до r - обновите сервер.

Ответ 2

В вашем случае просто вы можете отправить полученные адреса на свой сервер, а затем выполнить необходимые вычисления на сервере. Но не забывайте, что вы будете иметь дело с этими вопросами.

  • Сколько устройств отправляет местоположение на сервер?
  • Как часто каждое устройство отправляет местоположение на сервер?

Также ответственность за обнаружение устройства ввела область на сервере

Я думаю, что вы можете уменьшить сложность всех вещей, используя geofencing api, ссылка

  • Не нужно отправлять каждое местоположение на сервер.
  • Каждое устройство самостоятельно обнаруживает, что оно ввело или вышло из область.

ИЗМЕНИТЬ

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

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

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

  • Каждое устройство gps на шине периодически отправляет местоположение на сервер.

  • Когда шина закончила маршрутизировала, сервер проверяет устройство на всех найденных местоположениях на маршруте.

  • Сравнивает каждую геозонность с каждым местоположением шины.

Это реальный сценарий. Вы можете назвать это "основанием на основе сервера".

Ответ 3

Для хранения координат вы можете выполнить простую реализацию дерева k-d на стороне сервера.

Отправьте координаты устройства, которые можно определить в любой промежуток времени, который вам нужен. Если это каждые 5 секунд или 10 секунд, это не имеет большого значения. В основном это будет определяться минимальным расстоянием между каждой из координат/радиуса. Если они ближе, вам может потребоваться обновить его чаще.

Использование дерева k-d для нахождения ближайшего соседа будет O (log (n)). Однако вы делаете небольшую модификацию, когда вы можете начать добавлять узлы в список, если они находятся в пределах определенного радиуса координат вашего устройства. Фактически, если вы храните его локально как дерево k-d, тогда вы можете выбрать самые удаленные узлы в O (log (n))

Теперь во втором обновлении, когда местоположение устройства отправлено снова, вы можете быстро его обновить, так как у вас есть существующие местоположения. Скажем, вы двигаетесь в направлении x на 5. Вы можете сбросить точки, находящиеся за пределами радиуса, в x - 5. Новая близость, вы выполняете поиск ближайшего соседа, добавляя в узлы, как они находятся в радиусе, но на этот раз, начиная с кэшированных узлов, ближайших к направлению, в котором вы двигаетесь.

Объединим это с деревом интервалов для радиусов. Так скажите от 0 до 1, от 1 до 2, от 2 до 3, как ваши интервалы. Вы можете выбрать все в пределах определенного радиуса в O (log (n)) времени. Это должны быть указатели на узлы в дереве k-d. Это упростит вычисления радиуса и найдет местоположение, если вы готовы пожертвовать некоторой памятью для эффективности.

Ответ 4

Для "быстрого" способа реализовать его на стороне сервера вы можете использовать mondodb $около геопространственного запроса.

https://docs.mongodb.org/manual/reference/operator/query/near/

В то время как на мобильной стороне вы можете использовать свойство minDistance для обновлений местоположения. Вы можете установить его на разумное расстояние 20 м /50 м в зависимости от среднего расстояния между вашими местоположениями.

http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(java.lang.String,%20long,%20float,%20android.location.LocationListener)

Ответ 5

Для этой цели существует бесплатный сервис → Radar

Вы можете зарегистрировать неограниченный круг или геозонность полигона и зарегистрировать своего пользователя в приложении для отслеживания этого пользователя. Когда пользователь вводит один геофенсионный радар, отправьте уведомление на ваш сервер и отправьте данные ниже:
Идентификатор пользователя, Идентификатор Geofence, введенный или завершенный пользователем, Уверенность (низкая, средняя, ​​высокая), используемая для геопотенциала, которая перекрывается.
Вы можете использовать этот SDK всего за 10 минут.