En este documento, se describe qué es el geovallado del cliente, cuándo usarlo 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.
A menudo, las empresas necesitan 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 geovallas, que permiten que el software active eventos cuando un dispositivo cruza un límite.
Comprender cuándo un determinado vehículo atraviesa 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: Las empresas pueden usar la 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 debería hacer un seguimiento de la ubicación del dispositivo y verificar si incumplió un geovallado determinado.
Alcance
Este documento se enfoca en una implementación de geovallado del cliente . Esto significa que la app cliente debe tener lo siguiente:
- Los polígonos que debe verificar para detectar incumplimientos
- Ubicación en tiempo real del usuario
- Lógica para verificar si la ubicación actual está dentro o fuera de alguno de los polígonos.
Esta guía incluye ejemplos de Android, pero hay formas equivalentes de hacerlo en iOS. El servicio de ubicación de Android tiene una implementación integrada para el geovallado circular que puedes ver aquí. El código de referencia y la descripción que se muestran a continuación son un punto de partida para implementaciones más complejas.
SDK de Navigation
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 de tramos de ruta de la app que la 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 (ETA) sea mucho más precisa, además de otra información de FLP.
- Experiencia paso a paso que les permite a los conductores desplazarse de forma eficiente de un punto A al punto B teniendo en cuenta el tráfico en tiempo real y otras restricciones de la ruta.
- Activación de 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 mediante el proveedor RoadSnappedLocation.
- Eventos de redireccionamiento (el usuario no gira en U, gira 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 hora de llegada estimada (en función del tiempo) reciben notificaciones cuando el conductor está por llegar al destino (en función de los metros y cuando el conductor está por llegar al destino, en función del tiempo) disponibles a través de .RemainingTimeOrDistanceChangedListener
En esta guía, solo se usa el proveedor RoadSnappedLocation y su LocationListener.
La solución de geovallado del cliente
Ahora, veamos un paso para compilar 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 nuestro geovallado.
- Los geovallados se almacenan en BigQuery y se extraen de tu backend.
- El backend despliega periódicamente las geovallas en las apps de conducción.
- El conductor navega, y la app del conductor comprueba con regularidad el geovallado en busca de un activador.
- La app para conductores notifica al backend un evento activador para que pueda actuar.
A medida que el vehículo se mueve por la ruta, la app verifica periódicamente si se violó el polígono. Cuando la app detecta que cruzó un geovallado, se muestra un mensaje en la IU con el siguiente mensaje: Se violación de la geovalla.
Configura las dependencias de Android-Maps-Utils
Esta solución usa Android-Maps-Utils, una biblioteca de código abierto que contiene utilidades ú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 URL:
- 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 compilas, no a 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;
Define tus perímetros virtuales
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 suelen provenir de un extremo de backend y es probable que se recuperen de forma remota. Esto significa que la app deberá crear los polígonos en el momento.
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
}
Detecta actualizaciones de ubicación
Después de definir tus geovallas, solo debes crear un objeto de escucha de actualizaciones de ubicación para suscribirte al evento mencionado anteriormente 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 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 el geovallado, pero, en la práctica, es posible que tengas varios polígonos y se requiera un bucle.
Un enfoque alternativo
Este documento se enfoca en una aplicación para clientes que verifica si hay una violación de la seguridad de un geovallado (polígono) personalizada. Sin embargo, existen situaciones en las que quizás desees realizar esas verificaciones en tu backend.
Esto significa que la app informará las actualizaciones de ubicación a un backend, que luego verificará si ese vehículo ingresó a un polígono determinado, por lo que no dependerá de la app cliente para realizar la validación.
Una posible solución sería la siguiente:
[Entorno de ejecución] Arquitectura de geovallado del servidor
Arquitectura de ejemplo que demuestra un enfoque del servidor para el geovallado.
- La app para conductores, que usa el SDK para conductores, 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.
- Fleet Engine envía esas actualizaciones a Cloud Logging o Pub/Sub.
- El backend recopila esos indicadores de ubicación.
- Los geovallados se almacenan en BigQuery para que los analice el backend.
- Cuando se activa el geovallado, se envían alertas a la app para conductores.
En esta arquitectura, se usan 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 produce una actualización (o cada pocos segundos o minutos, sujeto a la importancia de la misma), el backend puede llamar a las funciones de BigQuery GIS para determinar si un vehículo determinado está dentro o fuera del perímetro virtual. En caso de que se haya vulnerado uno o más geovallados, el backend puede actuar y activar canalizaciones internas u otros flujos de trabajo relevantes.
Conclusión
El geovallado es una herramienta potente que se puede usar para varios fines. Las empresas pueden usar el geovallado para segmentar anuncios para usuarios finales con promociones y anuncios relevantes, brindar servicios basados en la ubicación y mejorar la seguridad y la protección.
El SDK de Navigation proporciona objetos de escucha de eventos útiles que pueden detectar muchos momentos importantes durante un viaje. 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
- Mira el seminario en línea Explora, aprende e inspírate con lo que se puede hacer con Google Maps Platform.
Lecturas adicionales sugeridas: