Déclencher des zones de géorepérage côté client pour suivre les ressources mobiles avec le SDK Nav

Ce document décrit en quoi consiste le géorepérage côté client, et quand l'utiliser et comment l'appliquer à des cas d'utilisation dans une application mobile. Elle montre également comment implémenter un exemple sur Android à l'aide du SDK Google Navigation.

SDK Nav avec détection de zones de géorepérage
SDK Nav avec détection de zones de géorepérage

Les entreprises ont souvent besoin de savoir quand un appareil mobile entre dans une zone particulière ou en sort. Pour ce faire, vous devez gérer des limites géographiques virtuelles (ou zones de géorepérage), ce qui permet aux logiciels de déclencher des événements lorsqu'un appareil traverse une limite.

Il est important de savoir quand un véhicule traverse une limite, par exemple dans les cas suivants:

  • Engagement client: les entreprises peuvent utiliser le géorepérage pour envoyer des notifications push aux utilisateurs finaux au sujet d'offres spéciales, d'événements ou de nouveaux produits.
  • Sécurité et sécurité: le géorepérage permet aux entreprises de créer des périmètres virtuels autour de zones sensibles, comme des centres de données ou des entrepôts, et d'alerter le personnel de sécurité en cas d'entrée ou de sortie d'une personne.
  • Transports: les entreprises peuvent utiliser le géorepérage pour suivre la position des véhicules, et optimiser les itinéraires et les horaires.

Il est donc important que vous sachiez comment représenter ces zones (polygones) dans une application destinée au client. Cette application doit suivre la position de l'appareil et vérifier s'il a enfreint une zone de géorepérage.

Définition du champ d'application

Ce document porte sur l'implémentation du géorepérage côté client . Cela signifie que l'application cliente doit comporter les éléments suivants:

  1. les polygones dont il doit vérifier la présence de brèches ;
  2. Position de l'utilisateur en temps réel
  3. Logique permettant de vérifier si la position actuelle se trouve à l'intérieur ou à l'extérieur de l'un des polygones.

Ce guide comprend des exemples sur Android, mais il existe des méthodes équivalentes sur iOS. Le service de localisation Android dispose d'une implémentation intégrée pour les zones de géorepérage circulaires, que vous pouvez consulter ici. Le code de référence et la description ci-dessous constituent un point de départ pour des implémentations plus complexes.

Le SDK Navigation est une bibliothèque Android / iOS native ajoutée à l'application du pilote. Il permet de:

  • Obtenir des positions avec tracé sur la route à partir de l'application qui l'exécute Cette méthode est plus précise que FusedLocationProvider (FLP) d'Android, car elle utilise le réseau routier de Google pour aligner les positions sur la section de route la plus proche, ce qui rend l'heure d'arrivée prévue bien plus précise et fournit d'autres informations de FLP.
  • la navigation détaillée permettant aux conducteurs de se rendre d'un point A à un point B avec efficacité en tenant compte du trafic en temps réel et d'autres restrictions d'itinéraire ;
  • Déclenchement d'événements via des écouteurs d'événements et des rappels enregistrés

Écouteurs

Le SDK Navigation dispose de nombreux écouteurs que vous pouvez utiliser. dont les suivants :

  • Modifications de la position via le fournisseur RoadSnappedLocation.
  • Les événements permettant de modifier l'itinéraire (l'utilisateur manque un demi-tour, un virage à gauche, etc. et s'écarte de l'itinéraire recommandé) via ReroutingListener
  • Événements d'arrivée (l'utilisateur arrive à la destination prévue) via ArrivalListener
  • Distance restante et événements d'heure d'arrivée prévue (recevoir une notification lorsque le conducteur est sur le point d'arriver à destination, en fonction du nombre de mètres, recevoir une notification lorsque le conducteur est sur le point d'arriver à destination en fonction de l'heure) sont tous deux disponibles via .RemainingTimeOrDistanceChangedListener

Dans ce guide, seuls RoadSnappedLocationProvider et son LocationListener sont utilisés.

Solution de géorepérage côté client

Passons maintenant à la création d'une fonctionnalité de géorepérage côté client. Dans l'exemple ci-dessous, le SDK Navigation fonctionne en mode de navigation détaillée. Un polygone est défini dans l'itinéraire représentant notre zone de géorepérage.

Diagramme fonctionnel
Diagramme fonctionnel

  1. Les zones de géorepérage sont stockées dans BigQuery et extraites par votre backend.
  2. Le backend pousse régulièrement les zones de géorepérage vers les applications Drive.
  3. Le conducteur navigue et l'application du conducteur vérifie régulièrement les zones de géorepérage pour un déclencheur.
  4. L'application pilote notifie le backend d'un événement déclencheur pour qu'il puisse agir.

À mesure que le véhicule se déplace le long de la route, l'application vérifie régulièrement si le polygone n'a pas été brisé. Lorsque l'application détecte qu'elle a franchi une zone de géorepérage, le message Zone de géorepérage compromise s'affiche dans l'interface utilisateur.

Configurer des dépendances pour Android-Maps-Utils

Cette solution utilise Android-Maps-Utils, une bibliothèque Open Source contenant des utilitaires utiles pour un large éventail d'applications utilisant l'API Google Maps Android.

Cette bibliothèque est publique et hébergée sur GitHub. Vous pouvez y accéder à l'adresse suivante:

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

Pour inclure cette bibliothèque dans votre application Android (dans le champ d'application de ce document), vous devez modifier votre fichier build.gradle afin de l'inclure. Notez que ce fichier build.gradle est destiné au module (application) que vous compilez, et non au niveau du projet.

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

Ensuite, après avoir synchronisé Gradle avec votre dernier fichier build.gradle, vous pouvez importer com.google.maps.android.PolyUtil dans votre fichier Java:

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

Définir vos zones de géorepérage

Notez qu'ici, PolygonOptions est également importé. En effet, voici ce qui est utilisé pour représenter le polygone:

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);

Comme vous pouvez le voir ci-dessus, nous définissons ici un polygone fixe avec des paires coordonnées/longitude préétablies. Toutefois, en situation réelle, ces coordonnées et définitions de polygone proviendront généralement d'un point de terminaison backend et seront probablement récupérées à distance. Cela signifie que le ou les polygones devront être créés à la volée par l'application.

Pour en savoir plus sur les informations pouvant être spécifiées dans PolygonOptions, veuillez consulter cette page.

Vous devez définir le ou les polygones lors de la création de votre fragment ou de votre activité. Exemple :

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
}

Écouter les mises à jour de la position

Après avoir défini vos zones de géorepérage, il vous suffit de créer un écouteur de mise à jour de la position pour vous abonner à l'événement mentionné ci-dessus dans le SDK Navigation, appelé RoadSnappedLocationProvider, qui renverra la dernière position de l'appareil.

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) {
   }
};

Avec Android-Maps-Utils, vous pouvez ensuite utiliser PolyUtil.containsLocation pour vérifier si la position reçue se trouve dans le polygone prédéfini. Dans l'exemple ci-dessous, nous utilisons le polygone prédéfini, qui représente la zone de géorepérage, mais en pratique, plusieurs polygones peuvent nécessiter une boucle.

Une approche alternative

Ce document se concentre sur une application client qui recherche une violation de géorepérage (polygone) personnalisée. Toutefois, dans certains cas, vous souhaiterez peut-être effectuer ces vérifications sur votre backend.

Cela signifie que l'application signale les mises à jour de la position à un backend, qui vérifie ensuite si le véhicule a enfreint un certain polygone, ce qui ne dépend pas de l'application cliente pour effectuer la validation.

Voici une solution possible:

[Environnement d'exécution] Architecture de géorepérage côté serveur

Exemple d'architecture illustrant une approche du géorepérage côté serveur

Solution côté serveur
Solution côté serveur

  1. L'application du pilote, basée sur le SDK Driver, envoie des mises à jour de position à Fleet Engine. Les mises à jour de la position et la navigation dans l'application sont effectuées via le SDK Navigation.
  2. Fleet Engine envoie ces mises à jour à Cloud Logging ou Pub/Sub.
  3. Le backend collecte ces signaux de localisation.
  4. Les zones de géorepérage sont stockées dans BigQuery pour analyse par le backend.
  5. Lors du déclenchement de la zone de géorepérage, des alertes sont envoyées à l'application du conducteur.

Dans cette architecture, le SDK Driver et Fleet Engine sont utilisés. Fleet Engine peut émettre des mises à jour Pub/Sub et générer des entrées de journal dans Cloud Logging. Dans les deux cas, la position du véhicule peut être récupérée.

Le backend peut alors surveiller la file d'attente Pub/Sub, ou lire les journaux et surveiller les mises à jour du véhicule. Ensuite, chaque fois qu'une mise à jour se produit (ou toutes les quelques secondes ou minutes, selon son degré de gravité), le backend peut appeler les fonctions SIG BigQuery pour déterminer si un véhicule donné se trouve à l'intérieur ou à l'extérieur des zones de géorepérage. En cas de violation d'une ou de plusieurs zones de géorepérage, le backend peut agir et déclencher des pipelines internes ou d'autres workflows pertinents.

Conclusion

Le géorepérage est un outil puissant qui peut être utilisé à diverses fins. Les entreprises peuvent utiliser le géorepérage pour cibler les utilisateurs finaux avec des annonces et des promotions pertinentes, proposer des services géolocalisés, et renforcer la sécurité.

Le SDK Navigation fournit des écouteurs d'événements utiles qui peuvent détecter de nombreux moments importants au cours d'un parcours. Les entreprises ont souvent besoin de zones de géorepérage personnalisées pour des cas d'utilisation spécifiques. Dans ce document, nous vous avons montré comment y parvenir, mais les possibilités sont infinies. Nous sommes impatients de découvrir vos créations.

Actions suivantes

Documentation complémentaire suggérée: