在用戶端中觸發地理圍欄,使用 Nav SDK 追蹤行動素材資源

本文件說明什麼是用戶端地理圍欄、使用時機,以及如何在行動應用程式中應用地理圍欄。以及如何使用 Google Navigation SDK 在 Android 上實作範例。

具備地理圍欄偵測功能的 Nav SDK
具備地理圍欄偵測功能的 Nav SDK

一般來說,公司需要知道行動裝置何時進入或離開特定區域。藉由維護虛擬地理界線 (即地理界線) 的方式,可讓軟體在裝置跨越邊界時觸發事件。

瞭解特定車輛何時穿越界線,有助瞭解在多種用途中,例如:

  • 客戶參與度:商家可以使用地理圍欄,向使用者傳送有關特價優惠、活動或新產品的推播通知。
  • 安全性和安全性:企業可以使用地理圍欄功能,在資料中心或倉庫等敏感區域周圍建立虛擬邊界,並在有人進入或離開該區域時通知保全人員。
  • 交通:商家可以使用地理圍欄追蹤車輛位置,找出最佳路線和時間表。

因此,請務必在用戶端設計的應用程式中表示這些區域 (多邊形)。這個應用程式應追蹤裝置位置,並確認其是否破壞了特定地理圍欄。

內容範圍

本文件著重在用戶端實作地理圍欄 。也就是說,用戶端應用程式必須符合下列條件:

  1. 檢查入侵時所需的多邊形;
  2. 使用者的即時位置資訊
  3. 邏輯檢查目前位置是否位於任何多邊形內。

本指南提供 Android 相關範例,但您也可以在 iOS 裝置上完成這項作業的相同方法。Android 定位服務內建針對循環地理圍欄的實作功能,詳情請參閱這個頁面。以下參考程式碼和說明是較複雜實作的起點。

Navigation SDK 是已新增至驅動程式應用程式的原生 Android / iOS 程式庫,應負責:

  • 從執行應用程式的應用程式取得道路對齊位置。這比 Android 的 FusedLocationProvider (FLP) 更加精確,因為這項工具會使用 Google 的路網,將位置對齊最近的路段,使預計到達時間更加準確,以及來自 FLP 的其他資訊。
  • 透過即時路線導航功能,駕駛路線可同時考量即時車流量和其他路線限制,有效規劃從 A 點到 B 點的行車效率。
  • 透過事件監聽器和已註冊的回呼觸發事件。

事件監聽器

Navigation SDK 有許多事件監聽器可供使用。例如:

  • 透過 RoadSnappedLocation 提供者取得位置變更。
  • 透過 ReroutingListener 重新規劃路線事件 (使用者錯過一次迴轉、左轉等,也偏離建議路線)。
  • 抵達事件 (使用者抵達預定目的地) 透過 ArrivalListener
  • 剩餘距離和預計到達時間事件 (在駕駛人即將抵達目的地時收到通知 - 根據儀表板,在司機即將抵達目的地時接收通知),兩種方法都可透過 .RemainingTimeOrDistanceChangedListener 取得

本指南僅使用 RoadSnappedLocationProvider 及其 LocationListener。

用戶端地理圍欄解決方案

現在逐步建立用戶端地理圍欄功能。在以下範例中,我們使用 Navigation SDK 在即時路線模式下運作,並在代表地理圍欄的路徑中定義多邊形。

功能圖表
功能圖表

  1. 地理圍欄會儲存在 BigQuery 中,並由後端提取。
  2. 後端會定期將地理圍欄推送到雲端硬碟應用程式。
  3. 駕駛人應用程式會進行導航,而駕駛應用程式會定期檢查觸發事件的地理圍欄。
  4. 駕駛應用程式會通知觸發事件的後端,讓其採取行動。

當車輛沿著路線移動時,應用程式會定期檢查多邊形是否遭到入侵。當應用程式偵測到應用程式跨越地理圍欄時,使用者介面會顯示訊息:「地理圍欄遭到入侵」

設定 Android-Maps-Utils 的依附元件

此解決方案採用 Android-Maps-Utils 這個開放原始碼程式庫,包含適用於各種使用 Google Maps Android API 的應用程式的公用程式。

這個程式庫是公開代管的程式庫,由 GitHub 代管,可在以下位置存取:

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

如要在 Android 應用程式中加入這個程式庫 (僅限本文的範圍),則應修改 build.gradle 檔案,加入程式庫。請注意,這個 build.gradle 檔案適用於您要建立的模組 (應用程式),而非專案層級。

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

將 Gradle 與最新的 build.gradle 檔案同步處理後,您就可以在 Java 檔案中匯入 com.google.maps.android.PolyUtil :

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

定義地理圍欄

請注意,系統正在匯入 PolygonOptions。原因是以下情況是用來代表多邊形:

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

如上所述,我們利用預先建立的座標 (經緯度) 組合來定義固定的多邊形。然而,在現實生活中,這些座標和多邊形定義,大多是來自後端端點,也可能是從遠端擷取。這表示必須由應用程式即時建立多邊形。

如要進一步瞭解可在 PolygonOptions 指明哪些內容,請參閱這篇文章

建立 Fragment 或 Activity 時,應定義多邊形。例如:

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
}

監聽位置更新

定義地理圍欄後,您只需建立位置更新事件監聽器,就能訂閱 Navigation SDK 中 (名為 RoadSnappedLocationProvider) 的事件,此事件會傳回裝置的最新位置。

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

有了 Android-Maps-Utils,您就可以使用 PolyUtil.containsLocation 檢查接收的位置是否位於預先定義的多邊形內。下方範例使用了代表地理圍欄的預先定義多邊形,但實際上您可能會有多個多邊形和一個迴圈。

替代做法

本文件著重說明用戶端適用的應用程式,用於檢查自訂地理圍欄 (多邊形) 資料侵害事件。在某些情況下,您可能會想在後端進行這類檢查。

也就是說,應用程式會向後端回報位置更新通知,這個後端會檢查車輛是否破壞特定多邊形,因此不受用戶端應用程式的影響。

可能的解決方法如下:

[執行環境] 伺服器端地理圍欄架構

以下架構範例:展示伺服器端地理圍欄的地理圍欄方法。

伺服器端解決方案
伺服器端解決方案

  1. 驅動程式應用程式使用驅動程式 SDK,將位置更新資訊傳送至 Fleet Engine。位置可透過 Navigation SDK 更新位置及在應用程式中導航。
  2. Fleet Engine 會將這些更新輸出至 Cloud Logging 或 Pub/Sub。
  3. 後端會收集這些位置信號。
  4. 地理圍欄會儲存在 BigQuery 中,供後端分析。
  5. 觸發地理圍欄時,快訊會傳送至駕駛應用程式。

在這個架構中,使用的是驅動程式 SDK 和 Fleet Engine。Fleet Engine 可以發出 PubSub 更新,並在 Cloud Logging 中產生記錄項目。在這兩種情況下,都可以擷取車輛位置資訊。

然後後端可以監控 PubSub 佇列或讀取記錄檔,以及觀察車輛更新。之後每當更新發生時 (或視重要性而定,每隔幾秒、幾分鐘內更新一次),後端就能呼叫 BigQuery GIS 函式,判斷特定車輛是否位於地理圍欄內。在一或多個地理圍欄遭到入侵時,後端可以執行並觸發內部管道或其他相關工作流程。

結論

地理圍欄是一項功能強大的工具,可以用於各種用途。商家可以使用地理圍欄來指定使用者,向他們顯示相關廣告和促銷活動、提供適地性服務,並提升安全性。

Navigation SDK 提供實用的事件監聽器,可以偵測旅程中的許多重要時刻。公司通常會針對特定用途要求自訂地理圍欄。雖然本文件說明瞭達成此目標的方法,但還有許多可能性。我們期待看到你的精彩創意。

後續行動

建議的延伸閱讀: