В этом документе описывается, что такое геозоны на стороне клиента, когда их использовать и как применять к вариантам использования в мобильном приложении. Также показано, как реализовать пример на Android с помощью Google Navigation SDK .
Компаниям часто необходимо знать, когда мобильное устройство входит или покидает определенную зону. Это достигается за счет поддержания виртуальных географических границ или геозон, позволяющих программному обеспечению инициировать события, когда устройство пересекает границу.
Понимание того, когда определенное транспортное средство пересекает границу, важно для нескольких случаев использования, таких как:
- Взаимодействие с клиентами . Компании могут использовать геозоны для отправки конечным пользователям push-уведомлений о специальных предложениях, событиях или новых продуктах.
- Безопасность и безопасность : предприятия могут использовать геозоны для создания виртуальных периметров вокруг чувствительных зон, таких как центры обработки данных или склады, и предупреждать сотрудников службы безопасности, если кто-то входит или покидает эту зону.
- Транспорт : предприятия могут использовать геозоны для отслеживания местоположения транспортных средств и оптимизации маршрутов и расписаний.
Поэтому важно знать, как представлять эти зоны (полигоны) внутри клиентского приложения. Это приложение должно отслеживать местоположение устройства и проверять, не нарушило ли оно определенную геозону.
Объем
В этом документе основное внимание уделяется реализации геозон на стороне клиента. Это означает, что клиентское приложение должно иметь:
- Полигоны, которые необходимо проверить на наличие нарушений;
- Местоположение пользователя в реальном времени
- Логика для проверки того, находится ли текущее местоположение внутри или снаружи какого-либо полигона.
В это руководство включены примеры для Android, но есть эквивалентные способы сделать это и для iOS. Служба местоположения Android имеет встроенную реализацию круговых геозон, которую можно увидеть здесь . Приведенный ниже ссылочный код и описание являются отправной точкой для более сложных реализаций.
Навигационный SDK
Navigation SDK — это собственная библиотека Android/iOS, добавленная в приложение драйвера. Он отвечает за:
- Получение снимков дорог из приложения, на котором оно запущено. Это более точно, чем FusedLocationProvider (FLP) в Android, поскольку он использует дорожную сеть Google для привязки местоположений к ближайшему сегменту дороги, что делает расчетное время прибытия гораздо более точным, а также другую информацию из FLP.
- Пошаговый опыт, который позволяет водителям эффективно добираться из точки А в точку Б, принимая во внимание движение транспорта в реальном времени и другие ограничения маршрута.
- Запуск событий через прослушиватели событий и зарегистрированные обратные вызовы.
Слушатели
В навигационном SDK имеется множество прослушивателей, которые вы можете использовать. Вот некоторые из них:
- Местоположение меняется через провайдера RoadSnappedLocation .
- Перенаправить события (пользователь пропускает разворот, левый поворот и т. д. и отклоняется от рекомендуемого маршрута) через ReroutingListener .
- События прибытия (пользователь прибывает в запланированный пункт назначения) через ArrivalListener .
- Оставшееся расстояние и события ETA (получать уведомление, когда водитель собирается прибыть в пункт назначения - на основе счетчиков, получать уведомления, когда водитель собирается прибыть в пункт назначения - на основе времени) оба доступны через . RemainingTimeOrDistanceChangedListener
В этом руководстве используются только поставщик RoadSnappedLocation и его LocationListener.
Решение для геозон на стороне клиента
Теперь давайте перейдем к созданию возможности геозонирования на стороне клиента. В приведенном ниже примере у нас есть Navigation SDK, работающий в пошаговом режиме, и полигон, определенный в маршруте, представляющий нашу геозону.
- Геозоны хранятся в BigQuery и извлекаются вашим сервером.
- Серверная часть периодически передает геозоны приложениям на диске.
- Водитель осуществляет навигацию, а приложение водителя регулярно проверяет геозоны на наличие триггера.
- Приложение 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
, чтобы проверить, находится ли полученное местоположение внутри предопределенного многоугольника. В приведенном ниже примере используется предопределенный многоугольник, представляющий геозону, но на практике может потребоваться несколько полигонов, и потребуется цикл.
Альтернативный подход
В этом документе основное внимание уделяется клиентскому приложению, которое проверяет наличие нарушений пользовательской геозоны (многоугольника). Однако существуют сценарии, в которых вы можете захотеть провести такие проверки на своем бэкэнде.
Это означает, что приложение будет сообщать об обновлениях местоположения на серверную часть, а затем эта серверная часть будет проверять, нарушило ли это транспортное средство определенный полигон, таким образом, не завися от клиентского приложения для выполнения проверки.
Возможным решением может быть следующее:
[Среда выполнения] Архитектура геозон на стороне сервера
Пример архитектуры, демонстрирующий подход к геозонированию на стороне сервера.
- Приложение для водителей с помощью Driver SDK отправляет обновления местоположения в Fleet Engine. Обновление местоположения и навигация в приложении происходят с помощью Navigation SDK.
- Fleet Engine выводит эти обновления в Cloud Logging или Pub/Sub.
- Серверная часть собирает эти сигналы местоположения.
- Геозоны сохраняются в Big Query для анализа серверной частью.
- При срабатывании геозоны оповещения отправляются в приложение для водителей.
В этой архитектуре используются Driver SDK и Fleet Engine. Fleet Engine может отправлять обновления PubSub и создавать записи журнала в Cloud Logging. В обоих случаях можно получить местоположение транспортного средства.
Тогда серверная часть может отслеживать очередь PubSub или читать журналы и следить за обновлениями транспортных средств. Затем всякий раз, когда происходит обновление (или каждые несколько секунд, минут, в зависимости от его критичности), серверная часть может вызывать функции ГИС BigQuery, чтобы определить, находится ли данное транспортное средство внутри или за пределами геозон. В случае нарушения одной или нескольких геозон бэкэнд может сработать и запустить внутренние конвейеры или другие соответствующие рабочие процессы.
Заключение
Геофенсинг — мощный инструмент, который можно использовать для различных целей. Предприятия могут использовать геозоны, чтобы показывать конечным пользователям релевантную рекламу и рекламные акции, предоставлять услуги на основе местоположения и повышать безопасность и безопасность.
Navigation SDK предоставляет полезные прослушиватели событий, которые могут обнаружить многие важные моменты во время путешествия. Компаниям часто требуются специальные геозоны для конкретных случаев использования. В этом документе мы продемонстрировали способ добиться этого, но возможности безграничны. Мы с нетерпением ждем возможности увидеть, что у вас получится.
Следующие действия
- Посмотрите вебинар «Исследуйте, учитесь и вдохновляйтесь возможностями платформы Google Карт» .
Рекомендуемая дополнительная литература:
,В этом документе описывается, что такое геозоны на стороне клиента, когда их использовать и как применять к вариантам использования в мобильном приложении. Также показано, как реализовать пример на Android с помощью Google Navigation SDK .
Компаниям часто необходимо знать, когда мобильное устройство входит или покидает определенную зону. Это достигается за счет поддержания виртуальных географических границ или геозон, позволяющих программному обеспечению инициировать события, когда устройство пересекает границу.
Понимание того, когда определенное транспортное средство пересекает границу, важно для нескольких случаев использования, таких как:
- Взаимодействие с клиентами . Компании могут использовать геозоны для отправки конечным пользователям push-уведомлений о специальных предложениях, событиях или новых продуктах.
- Безопасность и безопасность . Предприятия могут использовать геозоны для создания виртуальных периметров вокруг чувствительных зон, таких как центры обработки данных или склады, и предупреждать сотрудников службы безопасности, если кто-то входит или покидает эту зону.
- Транспорт : предприятия могут использовать геозоны для отслеживания местоположения транспортных средств и оптимизации маршрутов и расписаний.
Поэтому важно знать, как представлять эти зоны (полигоны) внутри клиентского приложения. Это приложение должно отслеживать местоположение устройства и проверять, не нарушило ли оно определенную геозону.
Объем
В этом документе основное внимание уделяется реализации геозон на стороне клиента. Это означает, что клиентское приложение должно иметь:
- Полигоны, которые необходимо проверить на наличие нарушений;
- Местоположение пользователя в реальном времени
- Логика для проверки того, находится ли текущее местоположение внутри или снаружи какого-либо полигона.
В это руководство включены примеры для Android, но есть эквивалентные способы сделать это и для iOS. Служба местоположения Android имеет встроенную реализацию круговых геозон, которую можно увидеть здесь . Приведенный ниже ссылочный код и описание являются отправной точкой для более сложных реализаций.
Навигационный SDK
Navigation SDK — это собственная библиотека Android/iOS, добавленная в приложение драйвера. Он отвечает за:
- Получение снимков дорог из приложения, на котором оно запущено. Это более точно, чем FusedLocationProvider (FLP) в Android, поскольку он использует дорожную сеть Google для привязки местоположений к ближайшему сегменту дороги, что делает расчетное время прибытия гораздо более точным, а также другую информацию из FLP.
- Пошаговый опыт, который позволяет водителям эффективно добираться из точки А в точку Б, принимая во внимание движение транспорта в реальном времени и другие ограничения маршрута.
- Запуск событий через прослушиватели событий и зарегистрированные обратные вызовы.
Слушатели
В навигационном SDK имеется множество прослушивателей, которые вы можете использовать. Вот некоторые из них:
- Местоположение меняется через провайдера RoadSnappedLocation .
- Перенаправить события (пользователь пропускает разворот, левый поворот и т. д. и отклоняется от рекомендуемого маршрута) через ReroutingListener .
- События прибытия (пользователь прибывает в запланированный пункт назначения) через ArrivalListener .
- Оставшееся расстояние и события ETA (получать уведомление, когда водитель собирается прибыть в пункт назначения - на основе счетчиков, получать уведомления, когда водитель собирается прибыть в пункт назначения - на основе времени) оба доступны через . RemainingTimeOrDistanceChangedListener
В этом руководстве используются только поставщик RoadSnappedLocation и его LocationListener.
Решение для геозон на стороне клиента
Теперь давайте перейдем к созданию возможности геозонирования на стороне клиента. В приведенном ниже примере у нас есть Navigation SDK, работающий в пошаговом режиме, и полигон, определенный в маршруте, представляющий нашу геозону.
- Геозоны хранятся в BigQuery и извлекаются вашим сервером.
- Серверная часть периодически передает геозоны приложениям на диске.
- Водитель осуществляет навигацию, а приложение водителя регулярно проверяет геозоны на наличие триггера.
- Приложение 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
, чтобы проверить, находится ли полученное местоположение внутри предопределенного многоугольника. В приведенном ниже примере используется предопределенный многоугольник, представляющий геозону, но на практике у вас может быть несколько полигонов, и потребуется цикл.
Альтернативный подход
В этом документе основное внимание уделяется клиентскому приложению, которое проверяет наличие нарушений пользовательской геозоны (многоугольника). Однако существуют сценарии, в которых вы можете захотеть провести такие проверки на своем бэкэнде.
Это означает, что приложение будет сообщать об обновлениях местоположения на серверную часть, а затем эта серверная часть будет проверять, нарушило ли это транспортное средство определенный полигон, таким образом, не завися от клиентского приложения для выполнения проверки.
Возможным решением может быть следующее:
[Среда выполнения] Архитектура геозон на стороне сервера
Пример архитектуры, демонстрирующий подход к геозонированию на стороне сервера.
- Приложение для водителей с помощью Driver SDK отправляет обновления местоположения в Fleet Engine. Обновление местоположения и навигация в приложении происходят с помощью Navigation SDK.
- Fleet Engine выводит эти обновления в Cloud Logging или Pub/Sub.
- Серверная часть собирает эти сигналы местоположения.
- Геозоны сохраняются в Big Query для анализа серверной частью.
- При срабатывании геозоны оповещения отправляются в приложение для водителей.
В этой архитектуре используются Driver SDK и Fleet Engine. Fleet Engine может отправлять обновления PubSub и создавать записи журнала в Cloud Logging. В обоих случаях можно получить местоположение транспортного средства.
Тогда серверная часть может отслеживать очередь PubSub или читать журналы и следить за обновлениями транспортных средств. Затем всякий раз, когда происходит обновление (или каждые несколько секунд, минут, в зависимости от его критичности), серверная часть может вызывать функции ГИС BigQuery, чтобы определить, находится ли данное транспортное средство внутри или за пределами геозон. В случае нарушения одной или нескольких геозон бэкэнд может сработать и запустить внутренние конвейеры или другие соответствующие рабочие процессы.
Заключение
Геозенс — мощный инструмент, который можно использовать для различных целей. Предприятия могут использовать геозоны, чтобы показывать конечным пользователям релевантную рекламу и рекламные акции, предоставлять услуги на основе местоположения и повышать безопасность и безопасность.
Navigation SDK предоставляет полезные прослушиватели событий, которые могут обнаружить многие важные моменты во время путешествия. Компаниям часто требуются специальные геозоны для конкретных случаев использования. В этом документе мы продемонстрировали способ добиться этого, но возможности безграничны. Мы с нетерпением ждем возможности увидеть, что у вас получится.
Следующие действия
- Посмотрите вебинар «Исследуйте, учитесь и вдохновляйтесь возможностями платформы Google Карт» .
Рекомендуемая дополнительная литература:
,В этом документе описывается, что такое геозоны на стороне клиента, когда их использовать и как применять к вариантам использования в мобильном приложении. Также показано, как реализовать пример на Android с помощью Google Navigation SDK .
Компаниям часто необходимо знать, когда мобильное устройство входит или покидает определенную зону. Это достигается за счет поддержания виртуальных географических границ или геозон, позволяющих программному обеспечению инициировать события, когда устройство пересекает границу.
Понимание того, когда определенное транспортное средство пересекает границу, важно для нескольких случаев использования, таких как:
- Взаимодействие с клиентами . Компании могут использовать геозоны для отправки конечным пользователям push-уведомлений о специальных предложениях, событиях или новых продуктах.
- Безопасность и безопасность . Предприятия могут использовать геозоны для создания виртуальных периметров вокруг чувствительных зон, таких как центры обработки данных или склады, и предупреждать сотрудников службы безопасности, если кто-то входит или покидает эту зону.
- Транспорт : предприятия могут использовать геозоны для отслеживания местоположения транспортных средств и оптимизации маршрутов и расписаний.
Поэтому важно знать, как представлять эти зоны (полигоны) внутри клиентского приложения. Это приложение должно отслеживать местоположение устройства и проверять, не нарушило ли оно определенную геозону.
Объем
В этом документе основное внимание уделяется реализации геозон на стороне клиента. Это означает, что клиентское приложение должно иметь:
- Полигоны, которые необходимо проверить на наличие нарушений;
- Местоположение пользователя в реальном времени
- Логика для проверки того, находится ли текущее местоположение внутри или снаружи какого-либо полигона.
В это руководство включены примеры для Android, но есть эквивалентные способы сделать это и для iOS. Служба местоположения Android имеет встроенную реализацию круговых геозон, которую можно увидеть здесь . Приведенный ниже ссылочный код и описание являются отправной точкой для более сложных реализаций.
Навигационный SDK
Navigation SDK — это собственная библиотека Android/iOS, добавленная в приложение драйвера. Он отвечает за:
- Получение снимков дорог из приложения, на котором оно запущено. Это более точно, чем FusedLocationProvider (FLP) в Android, поскольку он использует дорожную сеть Google для привязки местоположений к ближайшему сегменту дороги, что делает расчетное время прибытия гораздо более точным, а также другую информацию из FLP.
- Пошаговый опыт, который позволяет водителям эффективно добираться из точки А в точку Б, принимая во внимание движение транспорта в реальном времени и другие ограничения маршрута.
- Запуск событий через прослушиватели событий и зарегистрированные обратные вызовы.
Слушатели
В навигационном SDK имеется множество прослушивателей, которые вы можете использовать. Вот некоторые из них:
- Местоположение меняется через провайдера RoadSnappedLocation .
- Перенаправить события (пользователь пропускает разворот, левый поворот и т. д. и отклоняется от рекомендуемого маршрута) через ReroutingListener .
- События прибытия (пользователь прибывает в запланированный пункт назначения) через ArrivalListener .
- Оставшееся расстояние и события ETA (получать уведомление, когда водитель собирается прибыть в пункт назначения - на основе счетчиков, получать уведомления, когда водитель собирается прибыть в пункт назначения - на основе времени) оба доступны через . RemainingTimeOrDistanceChangedListener
В этом руководстве используются только поставщик RoadSnappedLocation и его LocationListener.
Решение для геозон на стороне клиента
Теперь давайте перейдем к созданию возможности геозонирования на стороне клиента. В приведенном ниже примере у нас есть Navigation SDK, работающий в пошаговом режиме, и полигон, определенный в маршруте, представляющий нашу геозону.
- Геозоны хранятся в BigQuery и извлекаются вашим сервером.
- Серверная часть периодически передает геозоны приложениям на диске.
- Водитель осуществляет навигацию, а приложение водителя регулярно проверяет геозоны на наличие триггера.
- Приложение 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
, чтобы проверить, находится ли полученное местоположение внутри предопределенного многоугольника. В приведенном ниже примере используется предопределенный многоугольник, представляющий геозону, но на практике может потребоваться несколько полигонов, и потребуется цикл.
Альтернативный подход
В этом документе основное внимание уделяется клиентскому приложению, которое проверяет наличие нарушений пользовательской геозоны (многоугольника). Однако существуют сценарии, в которых вы можете захотеть провести такие проверки на своем бэкэнде.
Это означает, что приложение будет сообщать об обновлениях местоположения на серверную часть, а затем эта серверная часть будет проверять, нарушило ли это транспортное средство определенный полигон, таким образом, не завися от клиентского приложения для выполнения проверки.
Возможным решением может быть следующее:
[Среда выполнения] Архитектура геозон на стороне сервера
Пример архитектуры, демонстрирующий подход к геозонированию на стороне сервера.
- Приложение для водителей с помощью Driver SDK отправляет обновления местоположения в Fleet Engine. Обновление местоположения и навигация в приложении происходят с помощью Navigation SDK.
- Fleet Engine выводит эти обновления в Cloud Logging или Pub/Sub.
- Серверная часть собирает эти сигналы местоположения.
- Геозоны сохраняются в Big Query для анализа серверной частью.
- При срабатывании геозоны оповещения отправляются в приложение для водителей.
В этой архитектуре используются Driver SDK и Fleet Engine. Fleet Engine может отправлять обновления PubSub и создавать записи журнала в Cloud Logging. В обоих случаях можно получить местоположение транспортного средства.
Тогда серверная часть может отслеживать очередь PubSub или читать журналы и следить за обновлениями транспортных средств. Затем всякий раз, когда происходит обновление (или каждые несколько секунд, минут, в зависимости от его критичности), серверная часть может вызывать функции ГИС BigQuery, чтобы определить, находится ли данное транспортное средство внутри или за пределами геозон. В случае нарушения одной или нескольких геозон бэкэнд может сработать и запустить внутренние конвейеры или другие соответствующие рабочие процессы.
Заключение
Геофенсинг — мощный инструмент, который можно использовать для различных целей. Предприятия могут использовать геозоны, чтобы показывать конечным пользователям релевантную рекламу и рекламные акции, предоставлять услуги на основе местоположения и повышать безопасность и безопасность.
Navigation SDK предоставляет полезные прослушиватели событий, которые могут обнаружить многие важные моменты во время путешествия. Компаниям часто требуются специальные геозоны для конкретных случаев использования. В этом документе мы продемонстрировали способ добиться этого, но возможности безграничны. Мы с нетерпением ждем возможности увидеть, что у вас получится.
Следующие действия
- Посмотрите вебинар «Исследуйте, учитесь и вдохновляйтесь возможностями платформы Google Карт» .
Рекомендуемая дополнительная литература:
,В этом документе описывается, что такое геозоны на стороне клиента, когда их использовать и как применять к вариантам использования в мобильном приложении. Также показано, как реализовать пример на Android с помощью Google Navigation SDK .
Компаниям часто необходимо знать, когда мобильное устройство входит или покидает определенную зону. Это достигается за счет поддержания виртуальных географических границ или геозон, позволяющих программному обеспечению инициировать события, когда устройство пересекает границу.
Понимание того, когда определенное транспортное средство пересекает границу, важно для различных случаев использования, таких как:
- Взаимодействие с клиентами . Компании могут использовать геозоны для отправки конечным пользователям push-уведомлений о специальных предложениях, событиях или новых продуктах.
- Безопасность и безопасность . Предприятия могут использовать геозоны для создания виртуальных периметров вокруг чувствительных зон, таких как центры обработки данных или склады, и предупреждать сотрудников службы безопасности, если кто-то входит или покидает эту зону.
- Транспорт : предприятия могут использовать геозоны для отслеживания местоположения транспортных средств и оптимизации маршрутов и расписаний.
Поэтому важно знать, как представлять эти зоны (полигоны) внутри клиентского приложения. Это приложение должно отслеживать местоположение устройства и проверять, не нарушило ли оно определенную геозону.
Объем
В этом документе основное внимание уделяется реализации геозон на стороне клиента. Это означает, что клиентское приложение должно иметь:
- Полигоны, которые необходимо проверить на наличие нарушений;
- Местоположение пользователя в реальном времени
- Логика для проверки того, находится ли текущее местоположение внутри или снаружи какого-либо полигона.
В это руководство включены примеры для Android, но есть эквивалентные способы сделать это и для iOS. Служба местоположения Android имеет встроенную реализацию круговых геозон, которую можно увидеть здесь . Приведенный ниже ссылочный код и описание являются отправной точкой для более сложных реализаций.
Навигационный SDK
Navigation SDK — это собственная библиотека Android/iOS, добавленная в приложение драйвера. Он отвечает за:
- Получение снимков дорог из приложения, на котором оно запущено. Это более точно, чем FusedLocationProvider (FLP) в Android, поскольку он использует дорожную сеть Google для привязки местоположений к ближайшему сегменту дороги, что делает расчетное время прибытия гораздо более точным, а также другую информацию из FLP.
- Пошаговый опыт, который позволяет водителям эффективно добираться из точки А в точку Б, принимая во внимание движение транспорта в реальном времени и другие ограничения маршрута.
- Запуск событий через прослушиватели событий и зарегистрированные обратные вызовы.
Слушатели
В навигационном SDK имеется множество прослушивателей, которые вы можете использовать. Вот некоторые из них:
- Местоположение меняется через провайдера RoadSnappedLocation .
- Перенаправить события (пользователь пропускает разворот, левый поворот и т. д. и отклоняется от рекомендуемого маршрута) через ReroutingListener .
- События прибытия (пользователь прибывает в запланированный пункт назначения) через ArrivalListener .
- Оставшееся расстояние и события ETA (получать уведомление, когда водитель собирается прибыть в пункт назначения - на основе счетчиков, получать уведомления, когда водитель собирается прибыть в пункт назначения - на основе времени) оба доступны через . RemainingTimeOrDistanceChangedListener
В этом руководстве используются только поставщик RoadSnappedLocation и его LocationListener.
Решение для геозонирования на стороне клиента
Теперь давайте перейдем к созданию возможности геозонирования на стороне клиента. В приведенном ниже примере у нас есть Navigation SDK, работающий в пошаговом режиме, и полигон, определенный в маршруте, представляющий нашу геозону.
- Геозоны хранятся в BigQuery и извлекаются вашим сервером.
- Серверная часть периодически передает геозоны приложениям на диске.
- Водитель осуществляет навигацию, а приложение водителя регулярно проверяет геозоны на наличие триггера.
- Приложение 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
, чтобы проверить, находится ли полученное местоположение внутри предопределенного многоугольника. В приведенном ниже примере используется предопределенный многоугольник, представляющий геозону, но на практике может потребоваться несколько полигонов, и потребуется цикл.
Альтернативный подход
Этот документ фокусируется на приложении, обращенном к клиенту, которое проверяет на нестандартное нарушение геофоны (многоугольник). Существуют сценарии, хотя вы можете сделать такие чеки на бэкэнде.
Это означает, что приложение будет сообщать об обновлениях местоположения в бэкэнд, и этот бэкэнд будет проверять, нарушит ли этот автомобиль определенный многоугольник, поэтому не зависит от приложения клиента для выполнения проверки.
Возможное решение было бы следующим образом:
[Среда выполнения] Архитектура геозона на стороне сервера
Пример архитектуры, демонстрирующий подход на стороне сервера к геозоне.
- Приложение Driver, использующее Driver SDK, отправляет обновления местоположения в двигатель флота. Обновления местоположения и навигация в приложении происходит через SDK навигации.
- Флот двигатель выводит эти обновления в облачный журнал или паб/суб.
- Бэкэнд собирает эти сигналы местоположения.
- Геоза хранятся в большом запросе для анализа по бэкэнду.
- После запуска геозоны оповещения отправляются в приложение драйвера.
В этой архитектуре используются драйвер SDK и двигатель флота. Двигатель флота может выделять обновления Pubsub и генерировать записи журнала в регистрации облака. В обоих случаях расположение транспортного средства может быть получено.
Затем бэкэнд может контролировать очередь PubSub или чтение журналов и наблюдать за обновлениями автомобилей. Затем, когда происходит обновление (или каждые несколько секунд, минуты, в зависимости от его критичности), бэкэнд может вызвать функции BigQuery GIS, чтобы определить, находится ли данное транспортное средство внутри или снаружи. В случае нарушения одной или нескольких геозин
Заключение
Геозование - это мощный инструмент, который можно использовать для различных целей. Предприятия могут использовать геозон для целевых конечных пользователей с соответствующими рекламными объявлениями и рекламными акциями, предоставлять услуги на основе местоположения и повысить безопасность и безопасность.
Навигация SDK предоставляет полезные слушатели, которые могут обнаружить много важных моментов во время путешествия. Компании часто требуют пользовательских геозисов для конкретных вариантов использования. В этом документе мы продемонстрировали способ достичь этого, но возможности бесконечны. Мы с нетерпением ждем возможности увидеть то, что вы придумали.
Следующие действия
- Посмотрите , чтобы исследовать, учиться и вдохновляться тем, что возможно с вебинаром Google Maps Platform .
Предложил дальнейшее чтение: