Este documento descreve o que é o geofencing do lado do cliente, quando usá-lo e como aplicá-lo a casos de uso em um aplicativo para dispositivos móveis. Ele também mostra como implementar um exemplo no Android usando o SDK Navigation do Google.
As empresas geralmente precisam saber quando um dispositivo móvel entra ou sai de uma área específica. Isso é feito mantendo limites geográficos virtuais, ou geofences, permitindo que o software acione eventos quando um dispositivo cruza um limite.
Entender quando um determinado veículo atravessa um limite é importante para vários casos de uso, como:
- Engajamento do cliente: as empresas podem usar o geofencing para enviar notificações push aos usuários finais sobre ofertas especiais, eventos ou novos produtos.
- Segurança: as empresas podem usar o geofencing para criar perímetros virtuais em torno de á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 o geofencing para rastrear a localização de veículos e otimizar rotas e horários.
Portanto, é importante saber como representar essas zonas (polígonos) em um app voltado para o cliente. Esse app precisa rastrear a localização do dispositivo e verificar se ele violou um determinado geofence.
Escopo
Este documento se concentra em uma implementação de geofencing do lado do cliente . Isso significa que o app cliente precisa ter:
- Os polígonos que ele precisa verificar para violações;
- Localização em tempo real do usuário
- Lógica para verificar se a localização atual está dentro ou fora de algum 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 geofences circulares, que pode ser vista aqui. O código de referência e a descrição abaixo são um ponto de partida para implementações mais complexas.
SDK Navigation
O SDK Navigation é uma biblioteca nativa do Android / iOS adicionada ao app do motorista. Ele é responsável por:
- Receber locais ajustados à estrada do app em execução. Isso é mais preciso do que o FusedLocationProvider (FLP) do Android, porque usa a rede rodoviária do Google para ajustar os locais ao segmento de estrada mais próximo, o que torna o tempo estimado de chegada muito mais preciso, além de outras informações do FLP.
- Experiência de navegação guiada que permite que os motoristas cheguem com eficiência do ponto A ao ponto B, considerando o trânsito em tempo real e outras restrições de rota.
- Acionar eventos por listeners de eventos e callbacks registrados.
Listeners
O SDK Navigation tem muitos listeners que podem ser usados. Para citar alguns:
- Mudanças de localização pelo provedor RoadSnappedLocation.
- Eventos de traçar novo trajeto (o usuário perde a conversão em U, a conversão à esquerda etc. e se desvia da rota recomendada) pelo ReroutingListener.
- Eventos de chegada (o usuário chega ao destino planejado) pelo ArrivalListener.
- Eventos de distância restante e tempo estimado de chegada (receba uma notificação quando o motorista estiver prestes a chegar ao destino com base em metros, receba uma notificação quando o motorista estiver prestes a chegar ao destino com base no tempo), ambos disponíveis pelo .RemainingTimeOrDistanceChangedListener
Neste guia, apenas o RoadSnappedLocationProvider e o LocationListener são usados.
A solução de geofencing do lado do cliente
Agora vamos criar um recurso de geofencing do lado do cliente. No exemplo abaixo, temos o SDK Navigation operando no modo navegação guiada e um polígono definido na rota que representa nossa fronteira geográfica virtual.
- Os geofences são armazenados no BigQuery e extraídos pelo back-end.
- O back-end envia periodicamente os geofences para os apps de direção.
- O motorista navega e o app do motorista verifica regularmente os geofences em busca de um acionador.
- O app do motorista notifica o back-end de um evento de acionamento para que ele possa agir.
À medida que o veículo se move ao longo da rota, o app verifica regularmente se o polígono foi violado. Quando o app detecta que cruzou um geofence, uma mensagem é exibida na interface do usuário dizendo: Geofence violado.
Configurar dependências para Android-Maps-Utils
Essa solução usa o Android-Maps-Utils, uma biblioteca de código aberto que contém utilitários úteis para uma ampla variedade de aplicativos que usam a API Google Maps para Android.
Essa biblioteca é pública e 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. Esse arquivo build.gradle é para o módulo (app) que você está criando, não no 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ê poderá importar com.google.maps.android.PolyUtil no seu arquivo Java:
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;
Definir seus geofences
Observe que PolygonOptions também está sendo importado. O motivo é que ele é 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, estamos definindo um polígono fixo com coordenadas pré-estabelecidas: pares (latitude, longitude). No entanto, em cenários reais, essas coordenadas e definições de polígonos geralmente vêm de um endpoint de back-end e provavelmente serão buscadas remotamente. Isso significa que os polígonos terão que ser criados dinamicamente pelo app.
Para mais detalhes sobre o que pode ser especificado em PolygonOptions, consulte esta página.
Defina os polígonos durante a criação do fragmento ou da atividade. Por 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 do local para se inscrever no evento mencionado acima no SDK Navigation chamado RoadSnappedLocationProvider, que vai retornar a localização 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 a localização recebida está dentro do polígono predefinido. No exemplo abaixo, o polígono predefinido, que representa o geofence, é usado, mas, na prática, você pode ter vários polígonos e um loop seria necessário.
Uma abordagem alternativa
Este documento se concentra em um aplicativo voltado para o cliente que verifica uma violação de geofence (polígono) personalizado. No entanto, há cenários em que você pode querer fazer essas verificações no back-end.
Isso significa que o app vai informar atualizações de localização a um back-end, e esse back-end vai verificar 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:
[Ambiente de execução] Arquitetura de geofencing do lado do servidor
Um exemplo de arquitetura que demonstra uma abordagem de geofencing do lado do servidor.
- O app do motorista, usando o SDK do Driver, envia atualizações de localização para o Fleet Engine. As atualizações de localização e a navegação no app acontecem pelo SDK Navigation.
- O Fleet Engine gera essas atualizações para o Cloud Logging ou o Pub/Sub.
- O back-end coleta esses sinais de localização.
- Os geofences são armazenados no BigQuery para análise pelo back-end.
- Ao acionar o geofence, alertas são enviados ao app do motorista.
Nessa 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, a localização do veículo pode ser recuperada.
O back-end pode monitorar a fila do Pub/Sub ou ler registros e observar as atualizações do veículo. Em seguida, sempre que uma atualização ocorrer (ou a cada poucos segundos, minutos, dependendo da criticidade), o back-end poderá chamar as funções GIS do BigQuery para determinar se um determinado veículo está dentro ou fora dos geofences. Caso um ou mais geofences tenham sido violados, o back-end poderá agir e acionar pipelines internos ou outros fluxos de trabalho relevantes.
Conclusão
O geofencing é uma ferramenta poderosa que pode ser usada para várias finalidades. As empresas podem usar o geofencing para segmentar usuários finais com anúncios relevantes e promoções, 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 exigem geofences personalizados 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
- Assista ao webinar "Explore, aprenda e inspire-se com o que é possível com a Plataforma Google Maps".
Leitura complementar sugerida: