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 do lado do cliente, quando usá-la e como aplicá-la a casos de uso em um aplicativo para dispositivos móveis. Também mostra como implementar um exemplo no Android usando o SDK do Navigation do Google.

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

As empresas muitas vezes precisam saber quando um dispositivo móvel entra ou sai de um determinado área Isso é feito mantendo 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: as empresas podem usar a fronteira virtual para criar perímetros virtuais em áreas sensíveis, como data centers ou armazéns, e alertar o pessoal 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 rotas e horários.

Portanto, é importante que você saiba como representar essas zonas (polígonos) dentro de um aplicativo voltado para o cliente. Este 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 do 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 do usuário em tempo real
  3. Lógica para verificar se o local atual está dentro ou fora de qualquer um dos polígonos.

Este guia inclui exemplos no Android, mas há formas equivalentes de fazer isso no iOS. O Serviço de localização do Android tem uma implementação integrada para fronteiras geográficas virtuais circulares, que pode ser conferida 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 Android / iOS nativa adicionada ao app do motorista. Ele é responsável por:

  • Receber locais de ajuste de vias do app que está sendo executado. Esse método é mais preciso do que o FusedLocationProvider (FLP) do Android, porque usa a rede de estradas do Google para posicionar locais no trecho de via mais próximo, o que torna o HEC muito mais preciso e outras informações do FLP.
  • Experiência passo a passo que permite aos motoristas chegar do ponto A ao B de forma eficiente, considerando o tráfego em tempo real e outras restrições de rota.
  • Acionar eventos usando listeners de eventos e callbacks registrados.

Listeners

O SDK do Navigation tem muitos listeners que você pode usar. Para citar alguns:

  • Mudanças de local pelo provedor RoadSnappedLocation.
  • Eventos de mudança de rota (o usuário perde a entrada, a curva à esquerda etc. e se desvia da rota recomendada) usando ReroutingListener.
  • Eventos de chegada (o usuário chega ao destino planejado) pelo ArrivalListener.
  • Eventos de distância restante e ETA (receba uma notificação quando o motorista estiver prestes a chegar ao destino com base em metros ou em tempo) disponíveis em .RemainingTimeOrDistanceChangedListener

Neste guia, apenas o RoadSnappedLocationProvider e o LocationListener são usados.

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

Agora vamos criar um recurso de delimitação geográfica do lado do cliente. No exemplo abaixo, o SDK de navegação opera no modo turn-by-turn e um polígono é definido na rota que representa nossa fronteira geográfica.

Diagrama funcional
Diagrama funcional

  1. As cercas geográficas são armazenadas no BigQuery e extraídas pelo back-end.
  2. O back-end envia periodicamente as cercas geográficas para os apps de direção.
  3. O motorista navega e o app de motorista verifica regularmente as fronteiras geográficas em busca de um gatilho.
  4. O app do motorista 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, a mensagem fronteira geográfica violada é exibida na interface.

Configurar dependências para o Android-Maps-Utils

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

Essa biblioteca é pública e hospedada no GitHub e 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 é destinado ao módulo (app) que você está criando, não ao 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, você pode importar com.google.maps.android.PolyUtil no arquivo Java:

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

Definir as fronteiras geográficas virtuais

Observe que aqui também PolygonOptions está sendo importado. O motivo é que o que está sendo usado para representar o polígono é o seguinte:

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 pré-estabelecidas - (latitude, longitude). No entanto, em cenários reais, essas coordenadas e definições de polígono, na maioria das vezes, virão de um ponto de extremidade de back-end e provavelmente serão buscadas remotamente. Isso significa que os polígonos precisam ser criados em tempo real pelo app.

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

Defina 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 local

Depois de definir suas fronteiras geográficas virtuais, você só precisa criar um listener de atualização de localização para se inscrever no evento mencionado acima 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, o polígono predefinido, que representa a fronteira geotérmica, é usado, mas, na prática, você pode ter vários polígonos e um loop será necessário.

Uma abordagem alternativa

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

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

Uma possível solução seria a seguinte:

[Execution Environment] Server side geofencing architecture

Um exemplo de arquitetura que demonstra uma abordagem do lado do servidor para a fronteira geográfica.

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

  1. O app do motorista, usando o SDK do motorista, envia atualizações de local para o Fleet Engine. As atualizações de local e a navegação no app acontecem pelo 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 local.
  4. As cercas geográficas são armazenadas no BigQuery para análise pelo back-end.
  5. Ao acionar a fronteira geográfica virtual, alertas são enviados para o aplicativo do motorista.

Nesta arquitetura, o SDK do driver e o Fleet Engine são usados. O Fleet Engine pode emitir atualizações do Pub/Sub e gerar entradas de registro no Cloud Logging. Em ambos os casos, o local do veículo pode ser recuperado.

O back-end pode então monitorar a fila do Pub/Sub ou ler registros e observar atualizações do veículo. Assim, sempre que ocorre uma atualização (ou a cada poucos segundos, minutos, dependendo da importância dela), o back-end pode chamar as 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 tenham sido violadas, o back-end pode agir e acionar pipelines internos ou outros fluxos de trabalho relevantes.

Conclusão

A fronteira geográfica virtual é uma ferramenta eficiente que pode ser usada para várias finalidades. As empresas podem usar a fronteira geográfica virtual para segmentar 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 Navigation oferece listeners de eventos úteis que podem detectar muitos momentos importantes durante uma viagem. As empresas geralmente precisam de cercas 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 criar.

Próximas ações

Leitura adicional sugerida: