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 untuk kasus penggunaan di aplikasi seluler. Panduan 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 tersebut. Hal ini dicapai dengan mempertahankan batas geografis virtual, atau pembatasan wilayah, yang memungkinkan software memicu peristiwa saat perangkat melewati batas.

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

  • Customer engagement: 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 warehouse, dan memberi tahu staf keamanan jika seseorang memasuki atau meninggalkan area tersebut.
  • Transportasi: Bisnis dapat menggunakan pembatasan wilayah untuk melacak lokasi kendaraan dan mengoptimalkan rute dan jadwal.

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

Cakupan

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

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

Panduan ini menyertakan contoh di Android, tetapi ada cara yang setara untuk melakukannya di iOS. Layanan Lokasi Android memiliki implementasi bawaan untuk pembatasan wilayah melingkar yang dapat dilihat di sini. Kode dan deskripsi referensi di bawah adalah titik awal untuk implementasi yang lebih kompleks.

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

  • Mendapatkan lokasi jalan yang diikat dari aplikasi yang menjalankannya. Fitur ini lebih tepat daripada FusedLocationProvider (FLP) Android karena menggunakan jaringan jalan Google untuk memindahkan lokasi ke segmen jalan terdekat sehingga PWT jauh lebih akurat, dan informasi lain dari FLP.
  • Pengalaman belokan demi belokan yang memungkinkan pengemudi untuk berkendara secara efisien dari titik A ke titik B dengan memperhitungkan lalu lintas real-time dan pembatasan rute lainnya.
  • Memicu 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 melewatkan putar balik, belokan kiri, dll., dan menyimpang dari rute yang direkomendasikan) melalui ReroutingListener.
  • Peristiwa kedatangan (pengguna tiba di tujuan yang direncanakan) melalui ArrivalListener.
  • Peristiwa jarak yang tersisa dan perkiraan waktu tiba (diberi tahu saat pengemudi akan tiba di tujuan - berdasarkan meter, diberi tahu 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 bahas langkah-langkah untuk membuat 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. Pagar virtual disimpan di BigQuery dan diambil 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 agar dapat bertindak.

Saat kendaraan bergerak di sepanjang rute, aplikasi secara rutin 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, sebuah library open-source 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 di aplikasi Android (cakupan dokumen ini), Anda harus mengubah file build.gradle untuk menyertakannya. Perhatikan bahwa file build.gradle ini ditujukan untuk modul (aplikasi) yang Anda build, bukan di tingkat 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 PolygonOptions juga sedang diimpor. Alasannya adalah ini yang digunakan untuk merepresentasikan 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 kita mendefinisikan poligon tetap dengan pasangan koordinat - (lintang, bujur) yang telah ditetapkan sebelumnya. Namun dalam skenario nyata, koordinat dan definisi poligon tersebut sering kali berasal dari endpoint backend dan mungkin akan diambil dari jarak jauh. Ini berarti bahwa poligon harus dibuat dengan cepat oleh aplikasi.

Untuk mengetahui detail selengkapnya tentang hal yang dapat ditentukan di PolygonOptions, lihat 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 ke peristiwa yang disebutkan di atas di SDK Navigasi bernama 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 sebelumnya. Dalam contoh di bawah, poligon yang telah ditentukan sebelumnya, yang mewakili pembatasan wilayah, digunakan, tetapi dalam praktiknya Anda mungkin memiliki beberapa poligon dan loop akan diperlukan.

Pendekatan Alternatif

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

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

Kemungkinan solusinya adalah sebagai berikut:

[Execution Environment] Arsitektur pembatasan wilayah sisi server

Contoh arsitektur yang menunjukkan pendekatan sisi server untuk pembatasan wilayah.

Solusi sisi server
Solusi sisi server

  1. Aplikasi pengemudi, menggunakan Driver SDK, mengirimkan pembaruan lokasi ke Fleet Engine. Pembaruan lokasi dan navigasi dalam aplikasi dilakukan melalui Navigation SDK.
  2. Fleet Engine menghasilkan update tersebut ke Cloud Logging atau Pub/Sub.
  3. Backend mengumpulkan sinyal lokasi tersebut.
  4. Pagar virtual 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 membuat entri log di Cloud Logging. Dalam kedua kasus tersebut, lokasi kendaraan dapat diambil.

Backend kemudian dapat memantau antrean PubSub atau membaca log dan mengawasi 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 telah dilanggar, backend dapat bertindak dan memicu pipeline internal atau alur kerja relevan lainnya.

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 yang berguna dan dapat mendeteksi banyak momen penting selama perjalanan. Perusahaan sering kali memerlukan pembatasan wilayah kustom untuk kasus penggunaan tertentu. Dalam dokumen ini kami mendemonstrasikan cara untuk mencapainya, tetapi kemungkinannya tidak terbatas. Kami menantikan kreasi Anda.

Tindakan Berikutnya

Bacaan Lebih Lanjut yang Disarankan: