Memicu pembatasan sisi sisi klien untuk melacak aset seluler dengan Nav SDK

Dokumen ini menjelaskan apa yang dimaksud dengan pembatasan wilayah sisi klien, kapan harus menggunakannya, dan cara menerapkannya pada kasus penggunaan di aplikasi seluler. Contoh ini juga menunjukkan cara menerapkan contoh di Android menggunakan Google Navigation SDK.

Nav SDK dengan deteksi pembatasan wilayah
Nav SDK dengan deteksi pembatasan wilayah

Perusahaan sering kali perlu mengetahui kapan perangkat seluler memasuki atau meninggalkan area tertentu. Hal ini dilakukan dengan mempertahankan batas geografis virtual, atau pembatasan wilayah, yang memungkinkan software memicu peristiwa saat perangkat melintasi batas.

Memahami kapan kendaraan tertentu melintasi batas adalah hal penting untuk beberapa kasus penggunaan seperti:

  • Engagement pelanggan: Bisnis dapat menggunakan pembatasan wilayah untuk mengirim notifikasi push kepada pengguna akhir tentang penawaran spesial, acara, atau produk baru.
  • Keamanan dan keselamatan: Bisnis dapat menggunakan pembatasan wilayah untuk membuat perimeter virtual di sekitar area sensitif, seperti pusat data atau gudang, serta memberi tahu staf keamanan jika seseorang memasuki atau meninggalkan area tersebut.
  • Transportasi: Bisnis dapat menggunakan pembatasan wilayah untuk melacak lokasi kendaraan serta mengoptimalkan rute dan jadwal.

Oleh karena itu, penting bagi Anda untuk mengetahui cara merepresentasikan zona (poligon) tersebut di dalam aplikasi yang berinteraksi dengan klien. Aplikasi ini harus melacak lokasi perangkat dan memeriksa apakah itu melanggar pembatasan wilayah tertentu.

Cakupan

Dokumen ini berfokus pada implementasi pembatasan wilayah dari sisi klien . Artinya, aplikasi klien harus memiliki:

  1. Poligon yang perlu diperiksa untuk menemukan pelanggaran;
  2. Lokasi real-time pengguna
  3. Logika untuk memeriksa apakah lokasi saat ini berada di dalam atau di luar poligon.

Panduan ini mencakup contoh di Android, tetapi ada cara yang sama untuk melakukannya di iOS. Android Location Service memiliki implementasi bawaan untuk pembatasan wilayah melingkar yang bisa dilihat di sini. Kode referensi dan deskripsi di bawah adalah titik awal untuk penerapan yang lebih kompleks.

Navigation SDK adalah library Android / iOS native yang ditambahkan ke aplikasi pengemudi. SDK ini bertanggung jawab untuk:

  • Mendapatkan lokasi jalan yang diambil dari aplikasi yang menjalankannya. Cara ini lebih akurat daripada FusedLocationProvider (FLP) Android karena menggunakan jaringan jalan Google untuk mengambil lokasi ke segmen jalan terdekat yang membuat PWT jauh lebih akurat, dan informasi lainnya dari FLP.
  • Pengalaman belokan demi belokan yang memungkinkan pengemudi berkendara secara efisien dari titik A ke titik B dengan mempertimbangkan lalu lintas real-time dan batasan rute lainnya.
  • Mengaktifkan peristiwa melalui pemroses peristiwa dan callback terdaftar.

Pemroses

Navigation SDK memiliki banyak pemroses yang dapat Anda gunakan. Di antaranya:

  • Perubahan lokasi melalui penyedia RoadSnappedLocation.
  • Mengubah rute peristiwa (pengguna salah putar balik, belokan kiri, dll., dan menyimpang dari rute yang direkomendasikan) melalui ReroutingListener.
  • Peristiwa kedatangan (pengguna tiba di tujuan yang direncanakan) melalui ArrivalListener.
  • Sisa peristiwa jarak dan PWT (dapatkan notifikasi saat pengemudi akan tiba di tujuan - berdasarkan meter, dapatkan notifikasi saat pengemudi akan tiba di tujuan - berdasarkan waktu) keduanya tersedia melalui .RemainingTimeOrDistanceChangedListener

Dalam panduan ini, hanya Penyedia RoadSnappedLocation dan LocationListener-nya yang digunakan.

Solusi Pembatasan Wilayah Sisi Klien

Sekarang, mari kita lanjutkan membangun kemampuan pembatasan wilayah sisi klien. Pada contoh di bawah, kita memiliki Navigation SDK yang beroperasi dalam mode belokan demi belokan dan poligon yang ditentukan dalam rute yang mewakili pembatasan wilayah kita.

Diagram fungsional
Diagram fungsional

  1. Pembatasan wilayah disimpan di BigQuery dan ditarik oleh backend Anda.
  2. Backend secara berkala mendorong pembatasan wilayah ke aplikasi drive.
  3. Pengemudi menavigasi dan aplikasi pengemudi secara rutin memeriksa pembatasan wilayah untuk menemukan pemicu.
  4. Aplikasi Pengemudi memberi tahu backend tentang peristiwa pemicu sehingga aplikasi tersebut dapat bertindak.

Saat kendaraan bergerak di sepanjang rute, aplikasi secara berkala memeriksa apakah poligon telah dilanggar. Saat aplikasi mendeteksi bahwa aplikasi telah melewati pembatasan wilayah, pesan akan ditampilkan di UI yang bertuliskan: Pembatasan wilayah dilanggar.

Mengonfigurasi Dependensi untuk Android-Maps-Utils

Solusi ini menggunakan Android-Maps-Utils, pustaka sumber terbuka yang berisi utilitas yang berguna untuk berbagai aplikasi yang menggunakan Google Maps Android API.

Library ini bersifat publik dan dihosting di GitHub serta dapat diakses di:

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

Untuk menyertakan library ini dalam aplikasi Android (cakupan dokumen ini), Anda harus memodifikasi file build.gradle untuk menyertakannya. Perhatikan bahwa file build.gradle ini adalah untuk modul (aplikasi) yang Anda bangun, bukan untuk level project.

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

Kemudian, setelah menyinkronkan Gradle dengan file build.gradle terbaru, Anda dapat mengimpor com.google.maps.android.PolyUtil di file Java:

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

Menentukan Pembatasan Wilayah Anda

Perhatikan bahwa di sini juga PolygonOptions sedang diimpor. Alasannya adalah karena hal inilah yang digunakan untuk mewakili poligon:

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);

Seperti yang dapat Anda lihat di atas, di sini kami mendefinisikan poligon tetap dengan koordinat yang telah ditetapkan sebelumnya - (lintang, bujur). Namun dalam skenario nyata, koordinat dan definisi poligon tersebut sering kali akan berasal dari endpoint backend dan mungkin akan diambil dari jarak jauh. Artinya, poligon harus dibuat dengan cepat oleh aplikasi.

Untuk detail selengkapnya tentang apa saja yang dapat ditentukan di PolygonOptions, periksa di sini.

Anda harus menentukan poligon selama pembuatan Fragmen atau Aktivitas. Contoh:

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
}

Memproses Pembaruan Lokasi

Setelah menentukan pembatasan wilayah, Anda hanya perlu membuat pemroses pembaruan lokasi untuk berlangganan peristiwa yang disebutkan di atas di Navigation SDK yang disebut RoadSnappedLocationProvider, yang akan menampilkan lokasi terbaru perangkat.

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) {
   }
};

Dengan Android-Maps-Utils, Anda dapat menggunakan PolyUtil.containsLocation untuk memeriksa apakah lokasi yang diterima berada di dalam poligon yang telah ditentukan. Dalam contoh di bawah poligon yang telah ditetapkan, yang mewakili pembatasan wilayah, digunakan namun dalam praktiknya Anda mungkin memiliki beberapa poligon dan sebuah loop akan diperlukan.

Pendekatan Alternatif

Dokumen ini berfokus pada aplikasi yang menangani klien yang memeriksa pelanggaran pembatasan wilayah (poligon) kustom. Namun, ada beberapa skenario yang mengharuskan Anda melakukan pemeriksaan tersebut pada backend.

Ini berarti aplikasi akan melaporkan pembaruan lokasi ke backend dan backend ini kemudian akan memeriksa apakah kendaraan itu melanggar poligon tertentu, sehingga tidak bergantung pada aplikasi klien untuk melakukan validasi.

Solusi yang mungkin adalah sebagai berikut:

[Lingkungan Eksekusi] Arsitektur pembatasan wilayah sisi server

Contoh arsitektur yang menunjukkan pendekatan sisi server untuk pembatasan wilayah.

Solusi sisi server
Solusi sisi server

  1. Aplikasi pengemudi, yang menggunakan Driver SDK, mengirimkan pembaruan lokasi ke Fleet Engine. Update lokasi dan navigasi dalam aplikasi dilakukan melalui Navigation SDK.
  2. Fleet Engine menghasilkan output pembaruan tersebut ke Cloud Logging atau Pub/Sub.
  3. Backend mengumpulkan sinyal lokasi tersebut.
  4. Pembatasan wilayah disimpan di BigQuery untuk dianalisis oleh backend.
  5. Setelah memicu pembatasan wilayah, notifikasi akan dikirim ke Aplikasi Pengemudi.

Dalam arsitektur ini, Driver SDK dan Fleet Engine digunakan. Fleet Engine dapat memunculkan update PubSub dan menghasilkan entri log di Cloud Logging. Dalam kedua kasus tersebut, lokasi kendaraan dapat diambil.

Backend kemudian dapat memantau antrean PubSub atau membaca log dan memantau update kendaraan. Kemudian, setiap kali update terjadi (atau setiap beberapa detik, menit, bergantung pada kekritisannya), backend dapat memanggil fungsi GIS BigQuery untuk menentukan apakah kendaraan tertentu berada di dalam atau di luar pembatasan wilayah. Jika satu atau beberapa pembatasan wilayah dilanggar, backend dapat bertindak dan memicu pipeline internal atau alur kerja lain yang relevan.

Kesimpulan

Pembatasan wilayah adalah alat canggih yang dapat digunakan untuk berbagai tujuan. Bisnis dapat menggunakan pembatasan wilayah untuk menargetkan pengguna akhir dengan iklan dan promosi yang relevan, menyediakan layanan berdasarkan lokasi, serta meningkatkan keamanan dan keselamatan.

Navigation SDK menyediakan pemroses peristiwa berguna yang dapat mendeteksi banyak momen penting selama perjalanan. Perusahaan sering kali mewajibkan pembatasan wilayah kustom untuk kasus penggunaan tertentu. Dalam dokumen ini, kami menunjukkan cara untuk mencapai hal tersebut, tetapi kemungkinannya tidak terbatas. Kami menantikan masukan Anda.

Tindakan Berikutnya

Disarankan Bacaan Lebih Lanjut: