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

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

SDK Navigation avec détection de zones de géorepérage
SDK Navigation avec détection des zones géographiques

Les entreprises ont souvent besoin de savoir quand un appareil mobile entre dans une zone spécifique ou en sort. Pour ce faire, des limites géographiques virtuelles (ou géorepères) sont définies, ce qui permet au logiciel de déclencher des événements lorsqu'un appareil franchit une limite.

Il est important de savoir quand un véhicule franchit une limite pour de nombreux cas d'utilisation, par exemple :

  • Engagement client : les entreprises peuvent utiliser le géorepérage pour envoyer des notifications push aux utilisateurs finaux concernant des offres spéciales, des événements ou de nouveaux produits.
  • Sécurité : les entreprises peuvent utiliser le géorepérage pour créer des périmètres virtuels autour des zones sensibles, comme les centres de données ou les entrepôts, et alerter le personnel de sécurité si quelqu'un entre dans la zone ou en sort.
  • Transports : les entreprises peuvent utiliser le géorepérage pour suivre la position des véhicules et optimiser les itinéraires et les plannings.

Il est donc important que vous sachiez comment représenter ces zones (polygones) dans une application destinée aux clients. Cette application doit suivre la position de l'appareil et vérifier s'il a franchi une certaine zone géographique.

Champ d'application

Ce document se concentre sur l'implémentation côté client du géorepérage . Cela signifie que l'application cliente doit disposer des éléments suivants :

  1. les polygones à vérifier pour détecter les infractions ;
  2. Position en temps réel de l'utilisateur
  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 inclut des exemples sur Android, mais il existe des méthodes équivalentes pour y parvenir sur iOS. Le service de localisation Android dispose d'une implémentation intégrée pour les géorepères circulaires, que vous pouvez consulter sur cette page. 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 chauffeur. Il est responsable des éléments suivants :

  • Obtenir les positions ajustées sur la route à partir de l'application qui l'exécute. Il est plus précis que FusedLocationProvider (FLP) d'Android, car il utilise le réseau routier de Google pour associer les positions au segment de route le plus proche, ce qui rend l'heure d'arrivée beaucoup plus précise, ainsi que d'autres informations de FLP.
  • Expérience de navigation qui permet aux conducteurs de se rendre efficacement d'un point A à un point B en tenant compte du trafic en temps réel et d'autres restrictions de route.
  • Déclenchement d'événements via des écouteurs d'événements et des rappels enregistrés.

Écouteurs

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

  • Modifications de l'emplacement via le fournisseur RoadSnappedLocation.
  • Redirigez les événements (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.
  • Les événements de distance restante et d'heure d'arrivée prévue (recevoir une notification lorsque le chauffeur est sur le point d'arriver à destination en fonction de la distance, recevoir une notification lorsque le chauffeur est sur le point d'arriver à destination en fonction du temps) sont tous deux disponibles via RemainingTimeOrDistanceChangedListener.

Dans ce guide, seuls le fournisseur RoadSnappedLocation et son LocationListener sont utilisés.

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

Nous allons maintenant passer en revue la création d'une fonctionnalité de géorepérage côté client. Dans l'exemple ci-dessous, le SDK Navigation fonctionne en mode guidage vocal et un polygone défini dans l'itinéraire représente notre géorepère.

Schéma fonctionnel
Schéma fonctionnel

  1. Les géofences sont stockées dans BigQuery et extraites par votre backend.
  2. Le backend envoie régulièrement les zones géographiques aux applications Drive.
  3. Le chauffeur navigue et l'application chauffeur vérifie régulièrement les zones géographiques pour détecter un déclencheur.
  4. L'application chauffeur avertit le backend d'un événement déclencheur afin qu'il puisse agir.

À mesure que le véhicule se déplace sur l'itinéraire, l'application vérifie régulièrement si le polygone a été franchi. Lorsque l'application détecte qu'elle a franchi une zone de géorepérage, le message Zone de géorepérage franchie s'affiche dans l'UI.

Configurer les 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 pour 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 (champ d'application de ce document), vous devez modifier votre fichier build.gradle pour l'inclure. Notez que ce fichier build.gradle concerne le module (application) que vous compilez, et non le 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 géographiques

Notez que PolygonOptions est également importé ici. 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 de coordonnées (latitude, longitude) préétablies. Toutefois, dans des scénarios réels, ces coordonnées et définitions de polygones proviennent généralement d'un point de terminaison backend et sont 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 ce qui peut être spécifié dans PolygonOptions, cliquez ici.

Vous devez définir le ou les polygones lors de la création de votre fragment ou 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 géographiques, il vous suffit de créer un écouteur de mise à jour de la position pour vous abonner à l'événement RoadSnappedLocationProvider du SDK Navigation, 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 à l'intérieur du polygone prédéfini. Dans l'exemple ci-dessous, le polygone prédéfini représentant la zone géographique est utilisé, mais en pratique, vous pouvez avoir plusieurs polygones et une boucle serait nécessaire.

Une autre approche

Ce document se concentre sur une application destinée aux clients qui vérifie le non-respect d'une géofence personnalisée (polygone). Toutefois, il existe des scénarios dans lesquels vous pouvez effectuer ces vérifications sur votre backend.

Cela signifie que l'application enverrait des informations de localisation à un backend, qui vérifierait ensuite si le véhicule a franchi un certain polygone, sans dépendre 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 côté serveur pour le géorepérage.

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

  1. L'application du chauffeur, à l'aide du Driver SDK, envoie des informations de localisation à 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 géofences sont stockées dans BigQuery pour être analysées par le backend.
  5. Lorsque la zone géographique est déclenchée, des alertes sont envoyées à l'application Driver.

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 ensuite surveiller la file d'attente Pub/Sub ou lire les journaux et rechercher les mises à jour des véhicules. Ensuite, chaque fois qu'une mise à jour a lieu (ou toutes les quelques secondes ou minutes, selon son importance), le backend peut appeler les fonctions BigQuery GIS pour déterminer si un véhicule donné se trouve à l'intérieur ou à l'extérieur des zones géographiques. Si une ou plusieurs zones géofencées ont été enfreintes, 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, fournir des services basés sur la localisation et améliorer 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 trajet. Les entreprises ont souvent besoin de géorepères personnalisés pour des cas d'utilisation spécifiques. Dans ce document, nous avons montré une façon d'y parvenir, mais les possibilités sont infinies. Nous avons hâte de découvrir vos créations.

Actions suivantes

Lectures complémentaires suggérées :