Cómo activar el geovallado del cliente para hacer un seguimiento de los recursos para dispositivos móviles con el SDK de Nav

En este documento, se describe qué es el geovallado del cliente, cuándo se usa y cómo aplicarlo a casos de uso en una aplicación para dispositivos móviles. También se muestra cómo implementar un ejemplo en Android con el SDK de Google Navigation.

SDK de Nav con detección de geovallas
SDK de Nav con detección de geovallas

Las empresas a menudo necesitan saber cuándo un dispositivo móvil entra o sale de un área en particular. Esto se logra manteniendo los límites geográficos virtuales, o geovallas, lo que permite que el software active eventos cuando un dispositivo cruza un límite.

Comprender cuándo un vehículo determinado cruza un límite es importante para varios casos de uso, como los siguientes:

  • Interacción con los clientes: Las empresas pueden usar el geovallado para enviar notificaciones push a los usuarios finales sobre ofertas especiales, eventos o productos nuevos.
  • Seguridad y protección: Las empresas pueden usar geovallado para crear perímetros virtuales alrededor de áreas sensibles, como centros de datos o almacenes, y alertar al personal de seguridad si alguien entra o sale del área.
  • Transporte: Las empresas pueden usar el geovallado para hacer un seguimiento de la ubicación de los vehículos y optimizar las rutas y los horarios.

Por lo tanto, es importante que sepas cómo representar esas zonas (polígonos) dentro de una app orientada al cliente. Esta app debe realizar un seguimiento de la ubicación del dispositivo y verificar si se incumplió de cierta geovalla.

Alcance

Este documento se centra en una implementación del geovallado del cliente . Esto significa que la app cliente debe tener lo siguiente:

  1. Los polígonos que necesita comprobar para detectar violaciones de seguridad;
  2. Ubicación en tiempo real del usuario
  3. Lógica para verificar si la ubicación actual se encuentra dentro o fuera de alguno de los polígonos

Esta guía incluye ejemplos en Android, pero existen formas equivalentes de lograrlo en iOS. Los Servicios de ubicación de Android tienen una implementación integrada para geovallas circulares, que puedes ver aquí. El código de referencia y la descripción que aparecen a continuación son un punto de partida para implementaciones más complejas.

El SDK de Navigation es una biblioteca nativa de Android / iOS que se agrega a la app del controlador. Es responsable de lo siguiente:

  • Obtener ubicaciones extraídas de la ruta desde la app que lo ejecuta Esto es más preciso que FusedLocationProvider (FLP) de Android, ya que usa la red de rutas de Google para ajustar las ubicaciones al tramo de ruta más cercano, lo que hace que la hora de llegada estimada sea mucho más precisa, así como otra información del FLP.
  • Experiencia paso a paso que permite a los conductores ir eficientemente del punto A al punto B teniendo en cuenta el tráfico en tiempo real y otras restricciones de ruta.
  • Activación de eventos a través de objetos de escucha de eventos y devoluciones de llamadas registradas.

Objetos de escucha

El SDK de Navigation tiene muchos objetos de escucha que puedes usar. A continuación, te mostramos algunas de ellas:

  • Cambios de ubicación mediante el proveedor de RoadSnappedLocation
  • Eventos de redireccionamiento (el usuario no hace el giro de u, giro a la izquierda, etc., y se desvía de la ruta recomendada) mediante ReroutingListener.
  • Eventos de llegada (el usuario llega al destino planificado) mediante ArrivalListener
  • Eventos de distancia restante y hora de llegada (puedes recibir una notificación cuando el conductor está por llegar al destino según los metros; recibe una notificación cuando el conductor está por llegar al destino, según la hora) disponibles a través de .RemainingTimeOrDistanceChangedListener

En esta guía, solo se usan el RoadSnappedLocation y su LocationListener.

La solución de geovallado del cliente

Ahora veamos la compilación de una capacidad de geovallado del cliente. En el siguiente ejemplo, tenemos el SDK de Navigation que funciona en modo paso a paso y un polígono definido en la ruta que representa nuestra geovalla.

Diagrama funcional
Diagrama funcional

  1. Los geovallados se almacenan en BigQuery y los extrae tu backend.
  2. El backend envía periódicamente los geovallados a las apps de Drive.
  3. El conductor navega, y la app del conductor verifica con regularidad los geovallados en busca de un activador.
  4. La app de Driver notifica al backend sobre un evento activador para que pueda actuar.

A medida que el vehículo se desplaza por la ruta, la app verifica con regularidad si se produjo una violación de la seguridad en el polígono. Cuando la app detecta que cruzó un geovallado, se muestra un mensaje en la IU que dice: Geofence vulnerado.

Cómo configurar dependencias para Android-Maps-Utils

Esta solución utiliza Android-Maps-Utils, una biblioteca de código abierto que contiene utilidades para una amplia gama de aplicaciones que usan la API de Google Maps para Android.

Esta biblioteca es pública y está alojada en GitHub. Se puede acceder a ella desde:

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

Para incluir esta biblioteca en tu app para Android (alcance de este documento), debes modificar el archivo build.gradle para incluirla. Ten en cuenta que este archivo build.gradle es para el módulo (app) que estás compilando, no a nivel de proyecto.

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

Luego, después de sincronizar Gradle con tu archivo build.gradle más reciente, puedes importar com.google.maps.android.PolyUtil en el archivo Java:

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

Define tus geovallas

Ten en cuenta que aquí también se está importando PolygonOptions. Esto se debe a que se usa lo siguiente para representar el polígono:

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

Como puedes ver arriba, definimos un polígono fijo con coordenadas preestablecidas: pares de coordenadas (latitud, longitud). Sin embargo, en situaciones reales, esas coordenadas y definiciones de polígonos, la mayoría de las veces, provendrán de un extremo de backend y probablemente se recuperarán de forma remota. Esto significa que la app deberá crear los polígonos sobre la marcha.

Para obtener más detalles sobre lo que se puede especificar en PolygonOptions, consulta aquí.

Debes definir los polígonos durante la creación de tu fragmento o actividad. Por ejemplo:

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
}

Cómo detectar actualizaciones de ubicación

Después de definir tus geovallas, solo debes crear un objeto de escucha de actualización de ubicación para suscribirte al evento mencionado en el SDK de Navigation, llamado RoadSnappedLocationProvider, que mostrará la ubicación más reciente del dispositivo.

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

Con Android-Maps-Utils, puedes utilizar PolyUtil.containsLocation para verificar si la ubicación recibida está dentro del polígono predefinido. En el ejemplo a continuación, se usa el polígono predefinido, que representa el geovallado, pero en la práctica podrías tener varios polígonos y se necesitaría un bucle.

Un enfoque alternativo

Este documento se centra en una aplicación orientada al cliente que busca una violación de la seguridad del geovallado personalizado (polígono). Sin embargo, hay situaciones en las que es posible que desees realizar esas verificaciones en tu backend.

Esto significa que la app informará las actualizaciones de ubicación a un backend, y este verificará si el vehículo infringió un polígono determinado, por lo que no dependerá de la app cliente para realizar la validación.

Una solución posible sería la siguiente:

[Entorno de ejecución] Arquitectura de geovallado del servidor

Una arquitectura de ejemplo que muestra un enfoque del servidor para el geovallado.

Solución del servidor
Solución del servidor

  1. La app del controlador, con el SDK de Driver, envía actualizaciones de ubicación a Fleet Engine. Las actualizaciones de ubicación y la navegación integrada en la app se llevan a cabo a través del SDK de Navigation.
  2. Fleet Engine exporta esas actualizaciones a Cloud Logging o Pub/Sub.
  3. El backend recopila esas señales de ubicación.
  4. Los geovallados se almacenan en BigQuery para que el backend los analice.
  5. Cuando se activa el geovallado, se envían alertas a la app del conductor.

En esta arquitectura, se utilizan el SDK de Driver y Fleet Engine. Fleet Engine puede emitir actualizaciones de Pub/Sub y generar entradas de registro en Cloud Logging. En ambos casos, se puede recuperar la ubicación del vehículo.

Luego, el backend podría supervisar la cola de Pub/Sub o leer registros y buscar actualizaciones del vehículo. Luego, cada vez que se realiza una actualización (o cada pocos segundos o minutos, sujeto a su criticidad), el backend puede llamar a las funciones de BigQuery GIS para determinar si un vehículo determinado está dentro o fuera de geovallas. En caso de que se hayan vulnerado uno o más geovallados, el backend puede actuar y activar canalizaciones internas o, también, otros flujos de trabajo relevantes.

Conclusión

El geovallado es una herramienta poderosa que se puede utilizar para diversos fines. Las empresas pueden usar el geovallado para dirigirse a los usuarios finales con anuncios y promociones relevantes, proporcionar servicios basados en la ubicación y mejorar la seguridad.

El SDK de Navigation proporciona objetos de escucha de eventos útiles que pueden detectar muchos momentos importantes durante un recorrido. Las empresas suelen requerir geovallas personalizadas para casos de uso específicos. En este documento, demostramos una forma de lograrlo, pero las posibilidades son infinitas. Esperamos ver tus ideas.

Acciones siguientes

Lecturas adicionales sugeridas: