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 la delimitación geográfica del cliente, cuándo usarla y cómo aplicarla 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 Navigation con detección de zonas geográficas
SDK de Navigation con detección de zonas geográficas

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

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

  • Participación del cliente: Las empresas pueden usar el geocercado para enviar notificaciones push a los usuarios finales sobre ofertas especiales, eventos o productos nuevos.
  • Seguridad: Las empresas pueden usar el geocercado 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 geocercado 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 hacer un seguimiento de la ubicación del dispositivo y verificar si se infringió una determinada zona geográfica.

Alcance

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

  1. Los polígonos con los que debe comparar para detectar incumplimientos
  2. Ubicación del usuario en tiempo real
  3. Lógica para verificar si la ubicación actual está dentro o fuera de alguno de los polígonos.

En esta guía, se incluyen ejemplos en Android, pero existen formas equivalentes de lograr esto en iOS. El Servicio de ubicación de Android tiene una implementación integrada para las geocercas circulares que se puede ver aquí. El código de referencia y la descripción que se incluyen a continuación son un punto de partida para implementaciones más complejas.

El SDK de Navigation es una biblioteca nativa para Android o iOS que se agrega a la app para conductores y es responsable de lo siguiente:

  • Obtener ubicaciones ajustadas a la ruta desde la app que la ejecuta Es más precisa 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 ETA sea mucho más precisa, y otra información de FLP.
  • Experiencia paso a paso que permite a los conductores ir de un punto A a un punto B de manera eficiente, teniendo en cuenta el tráfico en tiempo real y otras restricciones de la ruta.
  • Se activan eventos a través de objetos de escucha de eventos y devoluciones de llamada 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 a través del proveedor RoadSnappedLocation
  • Redirige eventos (el usuario no realiza un cambio de sentido, un giro a la izquierda, etc., y se desvía de la ruta recomendada) a través de ReroutingListener.
  • Eventos de llegada (el usuario llega al destino planificado) a través de ArrivalListener.
  • Los eventos de distancia restante y ETA (recibe una notificación cuando el conductor esté a punto de llegar al destino, según los metros; recibe una notificación cuando el conductor esté a punto de llegar al destino, según el tiempo) están disponibles a través de RemainingTimeOrDistanceChangedListener.

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

La solución de geovallas del cliente

Ahora, veamos cómo compilar una capacidad de geovallas del cliente. En el siguiente ejemplo, el SDK de Navigation funciona en modo de indicaciones paso a paso y se define un polígono en la ruta que representa nuestra zona geográfica.

Diagrama funcional
Diagrama funcional

  1. Las zonas geográficas se almacenan en BigQuery y tu backend las recupera.
  2. El backend envía las geocercas periódicamente a las apps de conducción.
  3. El conductor navega y la app para conductores verifica periódicamente las zonas geográficas para detectar un activador.
  4. La app para socios conductores notifica al backend un evento de activación para que pueda actuar.

A medida que el vehículo se desplaza por la ruta, la app verifica periódicamente si se infringió el polígono. Cuando la app detecta que cruzó un límite geográfico, se muestra un mensaje en la IU que dice: Se cruzó el límite geográfico.

Configura dependencias para Android-Maps-Utils

Esta solución usa Android-Maps-Utils, una biblioteca de código abierto que contiene utilidades que son útiles para una amplia variedad 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 en la siguiente dirección:

  • 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 tu archivo build.gradle para incluirla. Ten en cuenta que este archivo build.gradle es para el módulo (app) que estás compilando, no para el nivel del 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 tu archivo Java:

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

Cómo definir tus geovallas

Ten en cuenta que aquí también se importa PolygonOptions. El motivo es que esto es lo que se usa 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, aquí definimos un polígono fijo con coordenadas preestablecidas: pares (latitud, longitud). Sin embargo, en situaciones reales, esas coordenadas y definiciones de polígonos casi siempre provendrán de un extremo de backend y probablemente se recuperarán de forma remota. Esto significa que la app tendrá que 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 Fragment o Activity. 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 geocercas, solo debes crear un objeto de escucha de actualización de la ubicación para suscribirte al evento mencionado anteriormente en el SDK de Navigation llamado RoadSnappedLocationProvider, que devolverá 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 usar PolyUtil.containsLocation para verificar si la ubicación recibida está dentro del polígono predefinido. En el siguiente ejemplo, se usa el polígono predefinido que representa la zona geográfica, pero, en la práctica, es posible que tengas varios polígonos y se requiera un bucle.

Un enfoque alternativo

Este documento se centra en una aplicación orientada al cliente que verifica si se infringió una zona geográfica personalizada (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ía las actualizaciones de ubicación a un backend, y este backend luego verificaría si ese vehículo incumplió un determinado polígono, por lo que no dependería de la app cliente para realizar la validación.

Una posible solución sería la siguiente:

[Entorno de ejecución] Arquitectura de la delimitación geográfica del servidor

Ejemplo de arquitectura que demuestra un enfoque del lado del servidor para el geocercado.

Solución del servidor
Solución del servidor

  1. La app para el conductor, que usa el SDK del Driver, envía actualizaciones de ubicación a Fleet Engine. Las actualizaciones de ubicación y la navegación en la app se realizan a través del SDK de Navigation.
  2. Fleet Engine envía esas actualizaciones a Cloud Logging o Pub/Sub.
  3. El backend recopila esos indicadores de ubicación.
  4. Las zonas geográficas se almacenan en BigQuery para que el backend las analice.
  5. Cuando se activa la zona geográfica, se envían alertas a la app para conductores.

En esta arquitectura, se usan el SDK para el controlador 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 los registros y observar las actualizaciones de los vehículos. Luego, cada vez que se produzca una actualización (o cada pocos segundos o minutos, según la criticidad), el backend podría llamar a las funciones de BigQuery GIS para determinar si un vehículo determinado está dentro o fuera de las zonas geográficas. En caso de que se haya incumplido una o más zonas geográficas, el backend puede actuar y activar canalizaciones internas o flujos de trabajo relevantes.

Conclusión

El geocercado es una herramienta potente que se puede usar para diversos propósitos. Las empresas pueden usar el geofencing para segmentar a los usuarios finales con anuncios y promociones relevantes, brindar 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 viaje. Las empresas suelen requerir geocercas personalizadas para casos de uso específicos. En este documento, mostramos una forma de lograrlo, pero las posibilidades son infinitas. Esperamos ver tus creaciones.

Próximas acciones

Lecturas adicionales sugeridas: