Предупреждение о близости для местоположений, сохраненных на сервере
Я сделал поиск, но не нашел подходящего ответа.
Мое приложение должно сравниваться с несколькими местоположениями для близости. Это означает, что я не смогу сохранить все местоположения в своем приложении, чтобы подтвердить близость с помощью 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 минут.