Acionar fronteiras geográficas virtuais com o cliente para rastrear recursos de dispositivos móveis com o SDK do Nav

Este documento descreve o que é a fronteira geográfica virtual do lado do cliente, quando usá-la e como aplicá-la a casos de uso em um aplicativo para dispositivos móveis. Ele também mostra como implementar um exemplo no Android usando o SDK do Google Navigation.

SDK do Nav com detecção de fronteira geográfica virtual
SDK de navegação com detecção de fronteira geográfica virtual

As empresas geralmente precisam saber quando um dispositivo móvel entra ou sai de uma área específica. Isso é feito mantendo os limites geográficos virtuais, ou fronteiras geográficas virtuais, permitindo que o software acione eventos quando um dispositivo ultrapassa um limite.

Saber quando um determinado veículo atravessa um limite é importante para vários casos de uso, como:

  • Engajamento do cliente: as empresas podem usar a fronteira geográfica virtual para enviar notificações push aos usuários finais sobre ofertas especiais, eventos ou novos produtos.
  • Segurança e proteção: as empresas podem usar a fronteira geográfica virtual para criar perímetros virtuais em torno de áreas sensíveis, como data centers ou armazéns, e alertar a equipe de segurança se alguém entrar ou sair da área.
  • Transporte: as empresas podem usar a fronteira geográfica virtual para rastrear a localização de veículos e otimizar trajetos e horários.

Portanto, é importante que você saiba como representar essas zonas (polígonos) dentro de um app voltado para o cliente. Esse app precisa rastrear a localização do dispositivo e verificar se ele violou uma determinada fronteira geográfica virtual.

Escopo

Este documento se concentra em uma implementação de fronteira geográfica virtual no lado do cliente . Isso significa que o app cliente precisa ter:

  1. os polígonos que ele precisa verificar em busca de violações;
  2. Localização em tempo real do usuário
  3. Lógica para verificar se a localização atual está dentro ou fora de qualquer um dos polígonos.

Este guia inclui exemplos no Android, mas há maneiras equivalentes de fazer isso no iOS. O Serviço de localização do Android tem uma implementação integrada para fronteiras geográficas virtuais, que podem ser vistas aqui. O código de referência e a descrição abaixo são um ponto de partida para implementações mais complexas.

O SDK do Navigation é uma biblioteca nativa do Android / iOS adicionada ao app do motorista. Ele é responsável por:

  • Obter locais registrados de vias no app que o executa. Esse recurso é mais preciso do que o FusedLocationProvider (FLP) do Android, porque usa a rede de estradas do Google para ajustar locais ao trecho de via mais próximo, o que torna o HEC muito mais preciso e outras informações do FLP.
  • Experiência de navegação guiada que permite aos motoristas chegar de forma eficiente do ponto A ao ponto B, considerando o trânsito em tempo real e outras restrições de trajeto.
  • Disparar eventos por meio de listeners de eventos e callbacks registrados.

Listeners

O SDK do Navigation tem muitos listeners que podem ser usados. Para citar alguns:

  • Mudanças de local pelo provedor RoadSnappedLocation.
  • Redirecionar eventos (o usuário perde o retorno, virada à esquerda etc. e desvia do trajeto recomendado) usando ReroutingListener.
  • Eventos de chegada (o usuário chega ao destino planejado) via ArrivalListener.
  • Os eventos de distância restante e HEC (recebo uma notificação quando o motorista estiver prestes a chegar ao destino — com base em metros — e quando ele estiver prestes a chegar ao destino — com base no horário) ambos disponibilizados por .RemainingTimeOrDistanceChangedListener

Neste guia, apenas o provedor RoadSnappedLocation e o LocationListener dele são usados.

A solução de fronteira geográfica virtual do lado do cliente

Agora vamos conferir a criação de um recurso de fronteira geográfica virtual do lado do cliente. No exemplo abaixo, temos o SDK de navegação operando no modo de navegação guiada e um polígono definido na rota que representa nossa fronteira geográfica virtual.

Diagrama funcional
Diagrama funcional

  1. As fronteiras geográficas virtuais são armazenadas no BigQuery e extraídas pelo back-end.
  2. O back-end envia periodicamente as fronteiras geográficas virtuais para os aplicativos do Drive.
  3. O motorista navega e o app dele verifica regularmente as fronteiras geográficas virtuais para encontrar um gatilho.
  4. O app do driver notifica o back-end sobre um evento acionador para que ele possa agir.

À medida que o veículo se move ao longo do trajeto, o app verifica regularmente se o polígono foi violado. Quando o app detecta que passou por uma fronteira geográfica virtual, aparece uma mensagem na interface que diz: Geofence violada.

Configurar dependências para Android-Maps-Utils

Essa solução usa Android-Maps-Utils, uma biblioteca de código aberto que contém utilitários úteis para diversos aplicativos que usam a API Google Maps Android.

Essa biblioteca é pública e está hospedada no GitHub. Ela pode ser acessada em:

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

Para incluir essa biblioteca no seu app Android (escopo deste documento), modifique o arquivo build.gradle para incluí-la. Observe que esse arquivo build.gradle é para o módulo (app) que você está criando, não para o nível do projeto.

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

Em seguida, depois de sincronizar o Gradle com o arquivo build.gradle mais recente, importe com.google.maps.android.PolyUtil para o arquivo Java:

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

Defina suas fronteiras geográficas virtuais

Observe que PolygonOptions também está sendo importado. Isso porque isso é usado para representar o 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 você pode ver acima, aqui estamos definindo um polígono fixo com pares de coordenadas - (latitude, longitude) pré-estabelecidos. No entanto, em cenários reais, essas definições de coordenadas e polígonos virão, na maioria das vezes, de um endpoint de back-end e, provavelmente, serão buscadas remotamente. Isso significa que os polígonos precisarão ser criados rapidamente pelo app.

Para mais detalhes sobre o que pode ser especificado em PolygonOptions, clique aqui.

Você precisa definir os polígonos durante a criação do fragmento ou da atividade. Exemplo:

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
}

Detectar atualizações de localização

Depois de definir suas fronteiras geográficas virtuais, basta criar um listener de atualização de localização para se inscrever no evento mencionado no SDK do Navigation chamado RoadSnappedLocationProvider, que retornará o local mais recente do 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) {
   }
};

Com o Android-Maps-Utils, você pode usar PolyUtil.containsLocation para verificar se o local recebido está dentro do polígono predefinido. No exemplo abaixo, é usado o polígono predefinido, que representa a fronteira geográfica virtual, mas, na prática, pode haver vários polígonos e um loop é necessário.

Uma abordagem alternativa

Este documento se concentra em um aplicativo voltado para o cliente que verifica se há uma violação de fronteira geográfica virtual (polígono) personalizada. No entanto, há cenários em que convém fazer essas verificações no back-end.

Isso significa que o app estaria informando atualizações de localização para um back-end, que então verificaria se o veículo violou um determinado polígono, sem depender do app cliente para fazer a validação.

Uma solução possível seria esta:

[Ambiente de execução] Arquitetura de fronteira geográfica virtual do lado do servidor

Exemplo de arquitetura que demonstra uma abordagem do lado do servidor para fronteira geográfica virtual.

Solução do lado do servidor
Solução do lado do servidor

  1. O app do driver, usando o SDK do Driver, envia atualizações de localização ao Fleet Engine. As atualizações de localização e a navegação no app acontecem usando o SDK do Navigation.
  2. O Fleet Engine gera essas atualizações no Cloud Logging ou no Pub/Sub.
  3. O back-end coleta esses indicadores de localização.
  4. As fronteiras geográficas virtuais são armazenadas no BigQuery para análise pelo back-end.
  5. Ao acionar a fronteira geográfica virtual, os alertas são enviados ao app do motorista.

Nesta arquitetura, são usados o Driver SDK e o Fleet Engine. O Fleet Engine pode emitir atualizações do Pub/Sub e gerar entradas de registro no Cloud Logging. Em ambos os casos, é possível recuperar a localização do veículo.

O back-end poderia, então, monitorar a fila do Pub/Sub ou ler registros e observar atualizações do veículo. Depois, sempre que ocorre uma atualização (ou a cada poucos segundos, minutos, sujeito à criticidade), o back-end pode chamar funções do BigQuery GIS para determinar se um determinado veículo está dentro ou fora das fronteiras geográficas virtuais. Caso uma ou mais fronteiras geográficas virtuais sejam violadas, o back-end pode atuar e acionar pipelines internos ou outros fluxos de trabalho relevantes.

Conclusão

A fronteira geográfica virtual é uma ferramenta poderosa que pode ser usada para várias finalidades. As empresas podem usar a fronteira geográfica virtual para segmentar os usuários finais com anúncios e promoções relevantes, fornecer serviços com base na localização e melhorar a segurança.

O SDK do Navigation oferece listeners de eventos úteis que podem detectar vários momentos importantes durante uma jornada. As empresas geralmente exigem fronteiras geográficas virtuais personalizadas para casos de uso específicos. Neste documento, demonstramos uma maneira de fazer isso, mas as possibilidades são infinitas. Estamos ansiosos para ver o que você vai inventar.

Próximas ações

Leitura adicional sugerida: