Z tego dokumentu dowiesz się, czym jest geofencing po stronie klienta, kiedy go używać i jak stosować go w przypadkach użycia w aplikacji mobilnej. Dowiesz się też, jak zaimplementować przykład na Androidzie za pomocą pakietu Navigation SDK Google.
Firmy często muszą wiedzieć, kiedy urządzenie mobilne wchodzi na określony obszar lub go opuszcza. W tym celu utrzymują wirtualne granice geograficzne, czyli strefy, które umożliwiają oprogramowaniu wywoływanie zdarzeń, gdy urządzenie przekroczy granicę.
Wiedza o tym, kiedy dany pojazd przekracza granicę, jest ważna w wielu przypadkach użycia, takich jak:
- Zaangażowanie klientów: firmy mogą używać geofencingu do wysyłania powiadomień push do użytkowników końcowych o ofertach specjalnych, wydarzeniach lub nowych produktach.
- Bezpieczeństwo: firmy mogą używać geofencingu do tworzenia wirtualnych obwodów wokół obszarów wrażliwych, takich jak centra danych lub magazyny, i ostrzegać personel ochrony, jeśli ktoś wejdzie na ten obszar lub go opuści.
- 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. Ta aplikacja powinna śledzić lokalizację urządzenia i sprawdzać, czy przekroczyło ono określoną strefę.
Zakres
Ten dokument koncentruje się na implementacji geofencingu po stronie klienta . Oznacza to, że aplikacja klienta musi mieć:
- wielokąty, które należy sprawdzić pod kątem naruszeń;
- bieżąca lokalizacja użytkownika
- logikę sprawdzania, czy bieżąca lokalizacja znajduje się wewnątrz lub na zewnątrz któregokolwiek z wielokątów.
Ten przewodnik zawiera przykłady na Androida, ale istnieją równoważne sposoby na iOS. Usługa lokalizacji Androida ma wbudowaną implementację okrągłych stref, którą można zobaczyć tutaj. Poniższy kod referencyjny i opis to punkt początkowy do bardziej złożonych implementacji.
Navigation SDK
Navigation SDK to natywna biblioteka Androida / iOS dodana do aplikacji sterownika. Odpowiada ona za:
- uzyskiwanie lokalizacji przyciąganych do drogi z aplikacji, która ją uruchamia. Jest to dokładniejsze niż FusedLocationProvider (FLP) Androida, ponieważ używa sieci dróg Google do przyciągania lokalizacji do najbliższego odcinka drogi, co sprawia, że szacowany czas dotarcia na miejsce jest znacznie dokładniejszy, a także inne informacje z FLP.
- nawigację krok po kroku, która umożliwia kierowcom efektywne dotarcie z punktu A do punktu B z uwzględnieniem ruchu w czasie rzeczywistym i innych ograniczeń trasy.
- wywoływanie zdarzeń za pomocą detektorów zdarzeń i zarejestrowanych wywołań zwrotnych.
Detektory
Navigation SDK ma wiele detektorów, których możesz używać. Oto kilka przykładów:
- Zmiany lokalizacji za pomocą dostawcy RoadSnappedLocation.
- Zdarzenia zmiany trasy (użytkownik nie skręca w lewo, nie zawraca itp. i odbiega od zalecanej trasy) za pomocą ReroutingListener.
- Zdarzenia przybycia (użytkownik dociera do zaplanowanego miejsca docelowego) za pomocą ArrivalListener.
- Zdarzenia dotyczące pozostałej odległości i szacowanego czasu dotarcia na miejsce (otrzymuj powiadomienia, gdy kierowca zbliża się do miejsca docelowego – na podstawie metrów, otrzymuj powiadomienia, gdy kierowca zbliża się do miejsca docelowego – na podstawie czasu) dostępne za pomocą .RemainingTimeOrDistanceChangedListener
W tym przewodniku używamy tylko RoadSnappedLocationProvider i jego LocationListener.
Rozwiązanie geofencingu po stronie klienta
Teraz omówimy, jak utworzyć funkcję geofencingu po stronie klienta. W przykładzie poniżej mamy Navigation SDK działający w trybie nawigacji krok po kroku oraz wielokąt zdefiniowany na trasie, który reprezentuje naszą strefę.
- Strefy są przechowywane w BigQuery i pobierane przez backend.
- Backend okresowo wysyła strefy do aplikacji sterownika.
- Kierowca nawiguje, a aplikacja sterownika regularnie sprawdza, czy strefy nie zostały naruszone.
- Aplikacja sterownika powiadamia backend o zdarzeniu wywołują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, że przekroczyła strefę, w interfejsie wyświetla się komunikat: Strefa naruszona.
Konfigurowanie zależności dla Android-Maps-Utils
To rozwiązanie korzysta z Android-Maps-Utils, biblioteki open source zawierającej narzędzia przydatne w wielu aplikacjach korzystających z interfejsu Google Maps Android API.
Ta biblioteka jest publiczna i hostowana w GitHubie. Można 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), musisz zmodyfikować plik build.gradle. Pamiętaj, że ten plik build.gradle dotyczy modułu (aplikacji), który tworzysz, a nie 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 do pliku Java:
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;
Definiowanie stref
Pamiętaj, że tutaj importowany jest też PolygonOptions. Dzieje się tak, ponieważ służy on do reprezentowania wielokąta:
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 ze wstępnie ustalonymi współrzędnymi – parami (szerokość geograficzna, długość geograficzna). W rzeczywistych scenariuszach te współrzędne i definicje wielokątów będą jednak najczęściej pochodzić z punktu końcowego backendu i prawdopodobnie będą 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 geofence wystarczy utworzyć detektor informacji o zmianie lokalizacji, aby zasubskrybować wspomniane zdarzenie w Navigation SDK o nazwie RoadSnappedLocationProvider, które będzie zwracać 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ć PolyUtil.containsLocation, aby sprawdzić, czy otrzymana lokalizacja znajduje się wewnątrz predefiniowanego wielokąta. W przykładzie poniżej używany jest predefiniowany wielokąt reprezentujący strefę, ale w praktyce możesz mieć wiele wielokątów i będzie potrzebna pętla.
Podejście alternatywne
Ten dokument koncentruje się na aplikacji dla klientów, która sprawdza naruszenie niestandardowej strefy (wielokąta). Istnieją jednak scenariusze, w których możesz chcieć przeprowadzać takie kontrole w backendzie.
Oznacza to, że aplikacja będzie zgłaszać aktualizacje lokalizacji do backendu, a ten będzie sprawdzać, czy pojazd przekroczył określony wielokąt, nie polegając na aplikacji klienta 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 sterownika, korzystająca z pakietu Driver SDK, wysyła aktualizacje lokalizacji do Fleet Engine. Aktualizacje lokalizacji i nawigacja w aplikacji odbywają się za pomocą Navigation SDK.
- Fleet Engine wysyła te aktualizacje do Cloud Logging lub Pub/Sub.
- Backend zbiera te sygnały lokalizacji.
- Strefy są przechowywane w BigQuery na potrzeby analizy przez backend.
- Po wywołaniu strefy do aplikacji sterownika wysyłane są alerty.
W tej architekturze używane są Driver SDK i Fleet Engine. Fleet Engine może emitować aktualizacje PubSub i generować wpisy w dzienniku w Cloud Logging. W obu przypadkach można pobrać lokalizację pojazdu.
Backend może wtedy monitorować kolejkę PubSub lub odczytywać logi i śledzić aktualizacje pojazdu. Następnie, gdy nastąpi aktualizacja (lub co kilka sekund, minut, w zależności od jej krytyczności), backend może wywołać funkcje BigQuery GIS, aby określić, czy dany pojazd znajduje się wewnątrz strefy, czy poza nią. Jeśli jedna lub więcej stref zostało naruszonych, backend może podjąć działania i wywołać wewnętrzne potoki lub inne odpowiednie procesy.
Podsumowanie
Geofencing to potężne narzędzie, które można wykorzystać do różnych celów. Firmy mogą używać geofencingu do kierowania do użytkowników końcowych odpowiednich reklam i promocji, świadczenia usług opartych na lokalizacji oraz zwiększania bezpieczeństwa.
Navigation SDK udostępnia przydatne detektory zdarzeń, które mogą wykrywać wiele ważnych momentów podczas podróży. Firmy często wymagają niestandardowych stref w określonych przypadkach użycia. W tym dokumencie pokazaliśmy, jak to osiągnąć, ale możliwości są nieograniczone. Czekamy na Twoje pomysły.
Następne kroki
- Obejrzyj webinar Odkrywaj, ucz się i inspiruj się możliwościami Google Maps Platform.
Sugerowane dodatkowe materiały: