Z tego dokumentu dowiesz się, czym jest geofencing po stronie klienta, kiedy go używać i jak stosować go w przypadku zastosowań w aplikacji mobilnej. Pokazuje też, jak wdrożyć przykład na Androidzie za pomocą pakietu Google Navigation SDK.
Firmy często potrzebują informacji o tym, kiedy urządzenie mobilne wchodzi na określony obszar lub go opuszcza. Osiąga się to dzięki utrzymywaniu wirtualnych granic geograficznych, czyli geofencingu, który umożliwia oprogramowaniu wywoływanie zdarzeń, gdy urządzenie przekroczy granicę.
Wiedza o tym, kiedy dany pojazd przekracza granicę, jest ważna w wielu przypadkach, takich jak:
- Zaangażowanie klientów: firmy mogą używać geofencingu do wysyłania użytkownikom powiadomień push o ofertach specjalnych, wydarzeniach lub nowych produktach.
- Bezpieczeństwo: firmy mogą używać geofencingu do tworzenia wirtualnych granic wokół obszarów wrażliwych, takich jak centra danych lub magazyny, i powiadamiać personel ochrony, gdy ktoś wchodzi na ten obszar lub go opuszcza.
- Transport: firmy mogą używać geofencingu do śledzenia lokalizacji pojazdów oraz optymalizowania tras i harmonogramów.
Dlatego ważne jest, aby wiedzieć, jak przedstawić te strefy (wielokąty) w aplikacji dla klientów. Aplikacja powinna śledzić lokalizację urządzenia i sprawdzać, czy nie narusza ono określonego obszaru geograficznego.
Zakres
Ten dokument dotyczy implementacji geofencingu po stronie klienta . Oznacza to, że aplikacja klienta musi mieć:
- wielokąty, z którymi należy porównać dane pod kątem naruszeń;
- bieżącą lokalizację użytkownika;
- Logika sprawdzająca, czy bieżąca lokalizacja znajduje się wewnątrz któregoś z wielokątów czy poza nim.
Ten przewodnik zawiera przykłady na Androida, ale na iOS można to zrobić w podobny sposób. Usługa lokalizacji w Androidzie ma wbudowaną implementację okrągłych geofence, którą można zobaczyć tutaj. Poniższy kod referencyjny i opis to punkt początkowy dla bardziej złożonych wdrożeń.
Navigation SDK
Pakiet Navigation SDK to natywna biblioteka na Androida lub iOS dodana do aplikacji dla kierowców. Odpowiada ona za:
- uzyskiwanie przyciągniętych do drogi lokalizacji z aplikacji, która je generuje; Jest to dokładniejsze niż FusedLocationProvider (FLP) na Androidzie, ponieważ korzysta z sieci dróg Google, aby przyciągać lokalizacje do najbliższego odcinka drogi, co znacznie zwiększa dokładność szacowanego czasu dotarcia na miejsce, oraz z innych informacji z FLP.
- Nawigacja krok po kroku, która umożliwia kierowcom efektywne dotarcie z punktu A do punktu B z uwzględnieniem informacji o ruchu w czasie rzeczywistym i innych ograniczeń na trasie.
- Wywoływanie zdarzeń za pomocą detektorów zdarzeń i zarejestrowanych wywołań zwrotnych.
Detektory
Pakiet Navigation SDK ma wiele detektorów, z których możesz korzystać. Oto kilka przykładów:
- Zmiany lokalizacji za pomocą dostawcy RoadSnappedLocation.
- Zmiana trasy (użytkownik nie wykonał nawrotu, skrętu w lewo itp. i zboczył z zalecanej trasy) za pomocą ReroutingListener.
- Zdarzenia przybycia (użytkownik dociera do zaplanowanego miejsca docelowego) za pomocą interfejsu ArrivalListener.
- Pozostała odległość i zdarzenia szacowanego czasu dotarcia na miejsce (powiadomienia o tym, że kierowca zbliża się do miejsca docelowego – na podstawie liczby metrów, powiadomienia o tym, że kierowca zbliża się do miejsca docelowego – na podstawie czasu) są dostępne w ramach .RemainingTimeOrDistanceChangedListener.
W tym przewodniku używamy tylko dostawcy RoadSnappedLocation i jego interfejsu LocationListener.
Rozwiązanie geofencingowe po stronie klienta
Teraz przejdźmy do tworzenia funkcji geofencingu po stronie klienta. W przykładzie poniżej pakiet Navigation SDK działa w trybie nawigacji krok po kroku, a wielokąt zdefiniowany na trasie reprezentuje nasz geofencing.
- Geofence są przechowywane w BigQuery i pobierane przez backend.
- Backend okresowo przesyła geofence do aplikacji dla kierowców.
- Kierowca korzysta z nawigacji, a aplikacja dla kierowców regularnie sprawdza, czy w geofencingu występuje wyzwalacz.
- Aplikacja dla kierowców powiadamia backend o zdarzeniu aktywującym, aby mógł on podjąć odpowiednie działania.
Gdy pojazd porusza się po trasie, aplikacja regularnie sprawdza, czy wielokąt został naruszony. Gdy aplikacja wykryje przekroczenie granicy strefy, w interfejsie użytkownika pojawi się komunikat: Przekroczono granicę strefy.
Konfigurowanie zależności w przypadku Android-Maps-Utils
To rozwiązanie korzysta z Android-Maps-Utils, biblioteki open source zawierającej narzędzia przydatne w wielu różnych aplikacjach korzystających z interfejsu Google Maps Android API.
Ta biblioteka jest publiczna i hostowana w GitHubie. Możesz uzyskać do niej dostęp pod adresem:
- Android https://github.com/googlemaps/android-maps-utils
- iOS https://github.com/googlemaps/google-maps-ios-utils
Aby uwzględnić tę bibliotekę w aplikacji na Androida (zakres tego dokumentu), zmodyfikuj plik build.gradle. Pamiętaj, że ten plik build.gradle dotyczy modułu (aplikacji), który tworzysz, a nie poziomu projektu.
dependencies {
...
// Utilities for Maps SDK for Android (requires Google Play Services)
implementation 'com.google.maps.android:android-maps-utils:2.3.0'
}
Następnie po zsynchronizowaniu Gradle z najnowszym plikiem build.gradle możesz zaimportować com.google.maps.android.PolyUtil w pliku Java:
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;
Określanie obszarów geograficznych
Zwróć uwagę, że w tym przypadku też importowany jest plik PolygonOptions. Dzieje się tak, ponieważ do reprezentowania wielokąta używane są te dane:
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);
Jak widać powyżej, definiujemy tutaj stały wielokąt z wcześniej ustalonymi współrzędnymi – parami (szerokość geograficzna, długość geograficzna). W rzeczywistych scenariuszach te współrzędne i definicje wielokątów pochodzą najczęściej z punktu końcowego backendu i są prawdopodobnie pobierane zdalnie. Oznacza to, że wielokąty będą musiały być tworzone na bieżąco przez aplikację.
Więcej informacji o tym, co można określić w PolygonOptions, znajdziesz tutaj.
Wielokąty należy zdefiniować podczas tworzenia fragmentu lub aktywności. Na przykład:
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
}
Nasłuchiwanie aktualizacji lokalizacji
Po zdefiniowaniu obszarów geograficznych wystarczy utworzyć detektor informacji o zmianie lokalizacji, aby zasubskrybować wspomniane zdarzenie w pakiecie SDK do nawigacji o nazwie RoadSnappedLocationProvider, które zwróci najnowszą lokalizację urządzenia.
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) {
}
};
Za pomocą Android-Maps-Utils możesz użyć funkcji PolyUtil.containsLocation, aby sprawdzić, czy otrzymana lokalizacja znajduje się w predefiniowanym wielokącie. W przykładzie poniżej użyto wstępnie zdefiniowanego wielokąta reprezentującego geofence, ale w praktyce możesz mieć wiele wielokątów i konieczne będzie użycie pętli.
Podejście alternatywne
Ten dokument koncentruje się na aplikacji dla klientów, która sprawdza naruszenie niestandardowego obszaru geograficznego (wielokąta). W niektórych przypadkach możesz jednak chcieć przeprowadzić takie weryfikacje na serwerze backendu.
Oznacza to, że aplikacja będzie przesyłać aktualizacje lokalizacji do backendu, który następnie sprawdzi, czy pojazd przekroczył określony wielokąt. Nie będzie więc zależeć od aplikacji klienckiej w zakresie weryfikacji.
Możliwe rozwiązanie:
[Środowisko wykonawcze] Architektura geofencingu po stronie serwera
Przykładowa architektura pokazująca podejście do geofencingu po stronie serwera.
- Aplikacja kierowcy, korzystająca z pakietu Driver SDK, wysyła aktualizacje lokalizacji do Fleet Engine. Aktualizacje lokalizacji i nawigacja w aplikacji odbywają się za pomocą pakietu Navigation SDK.
- Fleet Engine przesyła te aktualizacje do Cloud Logging lub Pub/Sub.
- Backend zbiera te sygnały lokalizacji.
- Geofence są przechowywane w BigQuery na potrzeby analizy przez backend.
- Po przekroczeniu granicy obszaru alerty są wysyłane do aplikacji kierowcy.
W tej architekturze używane są pakiet Driver SDK i Fleet Engine. Fleet Engine może wysyłać aktualizacje PubSub i generować wpisy w logach w Cloud Logging. W obu przypadkach można uzyskać lokalizację pojazdu.
Backend może monitorować kolejkę PubSub lub odczytywać logi i śledzić aktualizacje pojazdów. Następnie, gdy nastąpi aktualizacja (lub co kilka sekund lub minut, w zależności od jej znaczenia), backend może wywołać funkcje BigQuery GIS, aby określić, czy dany pojazd znajduje się w geofence, czy poza nim. Jeśli co najmniej 1 geofence zostanie naruszony, backend może podjąć działania i uruchomić wewnętrzne potoki lub inne odpowiednie przepływy pracy.
Podsumowanie
Geofencing to potężne narzędzie, które można wykorzystywać do różnych celów. Firmy mogą używać geofencingu do kierowania do użytkowników trafnych reklam i promocji, świadczenia usług opartych na lokalizacji oraz zwiększania bezpieczeństwa.
Pakiet Navigation SDK udostępnia przydatne odbiorniki zdarzeń, które mogą wykrywać wiele ważnych momentów podczas podróży. Firmy często wymagają niestandardowych geofence’ów w określonych przypadkach użycia. W tym dokumencie pokazaliśmy jeden ze sposobów na osiągnięcie tego celu, ale możliwości są nieograniczone. Chętnie zobaczymy, co wymyślisz.
Następne działania
- Obejrzyj webinar Poznaj, ucz się i twórz z użyciem Google Maps Platform.
Sugerowane dodatkowe materiały: