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

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

SDK для навигации с функцией обнаружения геозон
SDK для навигации с функцией обнаружения геозон

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

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

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

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

Объем

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

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

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

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

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

Слушатели

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

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

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

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

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

Функциональная диаграмма
Функциональная диаграмма

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

Заключение

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

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

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

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