Активируйте геозоны на стороне клиента для отслеживания мобильных активов с помощью Nav SDK.

В этом документе описывается, что такое геозоны на стороне клиента, когда их использовать и как применять к вариантам использования в мобильном приложении. Также показано, как реализовать пример на Android с помощью Google Navigation SDK .

Nav SDK с обнаружением геозон
Nav SDK с обнаружением геозон

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

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

  • Взаимодействие с клиентами . Компании могут использовать геозоны для отправки конечным пользователям push-уведомлений о специальных предложениях, событиях или новых продуктах.
  • Безопасность и безопасность . Предприятия могут использовать геозоны для создания виртуальных периметров вокруг чувствительных зон, таких как центры обработки данных или склады, и предупреждать сотрудников службы безопасности, если кто-то входит или покидает эту зону.
  • Транспорт : предприятия могут использовать геозоны для отслеживания местоположения транспортных средств и оптимизации маршрутов и расписаний.

Поэтому важно знать, как представлять эти зоны (полигоны) внутри клиентского приложения. Это приложение должно отслеживать местоположение устройства и проверять, не нарушило ли оно определенную геозону.

Объем

В этом документе основное внимание уделяется реализации геозон на стороне клиента. Это означает, что клиентское приложение должно иметь:

  1. Полигоны, которые необходимо проверить на наличие нарушений;
  2. Местоположение пользователя в реальном времени
  3. Логика для проверки того, находится ли текущее местоположение внутри или снаружи какого-либо полигона.

В это руководство включены примеры для Android, но есть эквивалентные способы сделать это и для iOS. Служба местоположения Android имеет встроенную реализацию круговых геозон, которую можно увидеть здесь . Приведенный ниже ссылочный код и описание являются отправной точкой для более сложных реализаций.

Navigation SDK — это собственная библиотека Android/iOS, добавленная в приложение драйвера. Он отвечает за:

  • Получение снимков дорог из приложения, на котором оно запущено. Это более точно, чем FusedLocationProvider (FLP) в Android, поскольку он использует дорожную сеть Google для привязки местоположений к ближайшему сегменту дороги, что делает расчетное время прибытия гораздо более точным, а также другую информацию из FLP.
  • Пошаговый опыт, который позволяет водителям эффективно добираться из точки А в точку Б, принимая во внимание движение транспорта в реальном времени и другие ограничения маршрута.
  • Запуск событий через прослушиватели событий и зарегистрированные обратные вызовы.

Слушатели

В навигационном SDK имеется множество прослушивателей, которые вы можете использовать. Назвать несколько:

  • Местоположение меняется через провайдера RoadSnappedLocation .
  • Перенаправить события (пользователь пропускает разворот, левый поворот и т. д. и отклоняется от рекомендуемого маршрута) через ReroutingListener .
  • События прибытия (пользователь прибывает в запланированный пункт назначения) через ArrivalListener .
  • Оставшееся расстояние и события ETA (получать уведомление, когда водитель собирается прибыть в пункт назначения - на основе счетчиков, получать уведомления, когда водитель собирается прибыть в пункт назначения - на основе времени) оба доступны через . RemainingTimeOrDistanceChangedListener

В этом руководстве используются только поставщик RoadSnappedLocation и его LocationListener.

Решение для геозон на стороне клиента

Теперь давайте перейдем к созданию возможности геозонирования на стороне клиента. В приведенном ниже примере у нас есть Navigation SDK, работающий в пошаговом режиме, и полигон, определенный в маршруте, представляющий нашу геозону.

Функциональная схема
Функциональная схема

  1. Геозоны хранятся в BigQuery и извлекаются вашим сервером.
  2. Серверная часть периодически передает геозоны приложениям на диске.
  3. Водитель осуществляет навигацию, а приложение водителя регулярно проверяет геозоны на наличие триггера.
  4. Приложение Driver уведомляет серверную часть о событии-триггере, чтобы он мог действовать.

По мере движения автомобиля по маршруту приложение регулярно проверяет, не нарушен ли полигон. Когда приложение обнаруживает, что оно пересекло геозону, в пользовательском интерфейсе отображается сообщение: Геозона нарушена .

Настройка зависимостей для Android-Maps-Utils

В этом решении используется Android-Maps-Utils, библиотека с открытым исходным кодом, содержащая утилиты, полезные для широкого спектра приложений, использующих Android API Google Maps.

Эта библиотека является общедоступной и размещена на Github. Доступ к ней можно получить по адресу:

  • Android : https://github.com/googlemaps/android-maps-utils.
  • iOS : https://github.com/googlemaps/google-maps-ios-utils.

Чтобы включить эту библиотеку в свое приложение для Android (область этого документа), вам следует изменить файл build.gradle , включив ее. Обратите внимание, что этот файл build.gradle предназначен для создаваемого вами модуля (приложения), а не на уровне проекта.

dependencies {
   ...
   // Utilities for Maps SDK for Android (requires Google Play Services)
   implementation 'com.google.maps.android:android-maps-utils:2.3.0'
}

Затем, после синхронизации Gradle с последним файлом build.gradle, вы можете импортировать com.google.maps.android.PolyUtil в свой файл Java:

import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;

Определите свои геозоны

Обратите внимание, что здесь также импортируются PolygonOptions . Причина в том, что для представления многоугольника используется следующее:

mPolygonOptions = new PolygonOptions()
       .add(new LatLng(29.4264525,-98.4948758))
       .add(new LatLng(29.4267029,-98.4948758))
       .add(new LatLng(29.4273742,-98.4945822))
       .add(new LatLng(29.4264562,-98.4943592))
       .fillColor(0x0000ff36)
       .strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
       .strokeColor(Color.BLUE)
       .strokeWidth(5);

Как вы можете видеть выше, здесь мы определяем фиксированный многоугольник с заранее установленными парами координат — (широта, долгота). Однако в реальных сценариях эти координаты и определения многоугольников в большинстве случаев поступают из конечной точки серверной части и, вероятно, будут получены удаленно. Это означает, что полигоны должны будут создаваться приложением «на лету».

Более подробную информацию о том, что можно указать в PolygonOptions можно найти здесь .

Вы должны определить полигоны во время создания вашего фрагмента или действия. Например:

protected void onCreate(Bundle savedInstanceState) {
   ...
   mPolygonOptions = new PolygonOptions()
           .add(new LatLng(29.4264525,-98.4948758))
           .add(new LatLng(29.4267029,-98.4948758))
           .add(new LatLng(29.4273742,-98.4945822))
           .add(new LatLng(29.4264562,-98.4943592))
           .fillColor(0x0000ff36)
           .strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
           .strokeColor(Color.BLUE)
           .strokeWidth(5);

   ...// more code here
}

Слушайте обновления местоположения

После определения геозон вам просто нужно создать прослушиватель обновлений местоположения, чтобы подписаться на вышеупомянутое событие в Navigation SDK под названием RoadSnappedLocationProvider , которое будет возвращать последнее местоположение устройства.

mLocListener = new RoadSnappedLocationProvider.LocationListener() {
   @Override
   public void onLocationChanged(Location snapped) {
       LatLng snappedL = new LatLng(snapped.getLatitude(), snapped.getLongitude());
       if(PolyUtil.containsLocation(snappedL, mPolygonOptions.getPoints(), true) && !mGeofenceBreached){
           Log.d("Geofence", "Vehicle has breached the polygon");
       }
   }
   @Override
   public void onRawLocationUpdate(Location location) {
   }
};

С помощью Android-Maps-Utils вы можете использовать PolyUtil.containsLocation чтобы проверить, находится ли полученное местоположение внутри предопределенного многоугольника. В приведенном ниже примере используется предопределенный многоугольник, представляющий геозону, но на практике может потребоваться несколько полигонов, и потребуется цикл.

Альтернативный подход

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

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

Возможным решением может быть следующее:

[Среда выполнения] Архитектура геозон на стороне сервера

Пример архитектуры, демонстрирующий подход к геозонированию на стороне сервера.

Серверное решение
Серверное решение

  1. Приложение для водителей с помощью Driver SDK отправляет обновления местоположения в Fleet Engine. Обновление местоположения и навигация в приложении происходят с помощью Navigation SDK.
  2. Fleet Engine выводит эти обновления в Cloud Logging или Pub/Sub.
  3. Серверная часть собирает эти сигналы местоположения.
  4. Геозоны сохраняются в Big Query для анализа серверной частью.
  5. При срабатывании геозоны оповещения отправляются в приложение для водителей.

В этой архитектуре используются Driver SDK и Fleet Engine. Fleet Engine может отправлять обновления PubSub и создавать записи журнала в Cloud Logging. В обоих случаях можно получить местоположение транспортного средства.

Тогда серверная часть может отслеживать очередь PubSub или читать журналы и следить за обновлениями транспортных средств. Затем всякий раз, когда происходит обновление (или каждые несколько секунд, минут, в зависимости от его критичности), серверная часть может вызывать функции ГИС BigQuery , чтобы определить, находится ли данное транспортное средство внутри или за пределами геозон. В случае нарушения одной или нескольких геозон бэкэнд может сработать и запустить внутренние конвейеры или другие соответствующие рабочие процессы.

Заключение

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

Navigation SDK предоставляет полезные прослушиватели событий, которые могут обнаружить многие важные моменты во время путешествия. Компаниям часто требуются специальные геозоны для конкретных случаев использования. В этом документе мы продемонстрировали способ добиться этого, но возможности безграничны. Мы с нетерпением ждем возможности увидеть, что у вас получится.

Следующие действия

Рекомендуемая дополнительная литература: