Активируйте геозоны на стороне клиента для отслеживания мобильных активов с помощью 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 для привязки к ближайшему участку дороги, что значительно повышает точность расчётного времени прибытия (ETA) и другой информации из FLP.
  • Пошаговый опыт, позволяющий водителям эффективно добираться из пункта А в пункт Б с учетом текущей ситуации на дорогах и других ограничений маршрута.
  • Запуск событий через прослушиватели событий и зарегистрированные обратные вызовы.

Слушатели

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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