本文件說明什麼是用戶端地理圍欄、何時使用,以及如何應用在行動應用程式中。並示範如何使用 Google Navigation SDK 在 Android 上實作範例。
公司通常需要知道行動裝置進入或離開特定區域的時間。方法是維持虛擬地理界線 (即地理圍欄),讓軟體在裝置跨越邊界時觸發事件。
瞭解特定車輛何時穿越界線,對於多種用途十分重要,例如:
- 客戶參與度:商家可以利用地理圍欄傳送推播通知給使用者,接收特價優惠、活動或新產品的相關資訊。
- 安全與保全:商家可以使用地理圍欄功能,在資料中心或倉庫等敏感區域建立虛擬範圍,並在有人到或離開該區域時通知保全人員。
- 交通運輸:商家可以使用地理圍欄追蹤車輛位置,並規劃最佳路線和時刻表。
因此,請務必瞭解如何在用戶端應用程式內表示這些區域 (多邊形)。該應用程式應追蹤裝置位置,並檢查其是否違反特定地理圍欄。
範圍
本文件著重在用戶端實作地理圍欄。這表示用戶端應用程式必須具備:
- 需要檢查的多邊形是否有破壞情形;
- 使用者的即時位置
- 邏輯會檢查目前位置是否在任何多邊形的內部或外部。
本指南包含 Android 上的範例,但在 iOS 上也有其他做法可達成相同目的。Android 定位服務內建了循環地理圍欄實作,詳情請參閱這裡。您可以參考下方的參考程式碼和說明,瞭解如何進行更複雜的導入作業。
Navigation SDK
Navigation SDK 是新增至驅動程式應用程式的原生 Android / iOS 程式庫,其用途如下:
- 從執行道路的應用程式取得道路對齊的地點。這比 Android 的 FusedLocationProvider (FLP) 更加精確,因為這項工具會使用 Google 的道路網路,將位置與最近的路段比對,提供更準確的預計到達時間,以及來自 FLP 的其他資訊。
- 即時路線導航功能,協助駕駛人有效率地從 A 點抵達 B 點,同時將即時路況和其他路線限制納入考量。
- 透過事件監聽器和已註冊的回呼觸發事件。
事件監聽器
Navigation SDK 有許多事件監聽器可供使用。例如:
- 透過 RoadSnappedLocation 供應商變更位置。
- 透過 ReroutingListener 重新轉送事件 (使用者錯過 u-turn、左轉,以及偏離建議的路線)。
- 透過 ArrivalListener 抵達的抵達事件 (使用者抵達預定目的地)。
- 剩餘距離和預計到達時間事件 (駕駛人即將抵達目的地時接收通知 - 根據公尺類型,在駕駛人即將抵達目的地時接收通知 (根據時間)),兩者皆可透過 .RemainingTimeOrDistanceChangedListener
在本指南中,系統只會使用 RoadSnappedLocationProvider 及其 LocationListener。
用戶端地理圍欄解決方案
接著說明如何建立用戶端地理圍欄功能。在下方範例中,Navigation SDK 採用即時路線模式,且路徑中定義的多邊形 (代表我們的地理圍欄)。
- 地理圍欄會儲存在 BigQuery 中,並由後端提取。
- 後端會定期將地理圍欄傳送至雲端硬碟應用程式。
- Google Driver 會行駛,駕駛應用程式會定期檢查觸發事件的地理圍欄。
- 驅動程式應用程式會通知觸發事件的後端,以便其採取行動。
車輛沿著路線行駛時,應用程式會定期檢查多邊形是否受損。當應用程式偵測到其跨越地理圍欄時,UI 上就會顯示「地理圍欄資料洩漏」訊息。
設定 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
檢查接收的位置是否位於預先定義的多邊形內。在下方的範例中,系統會使用預先定義的多邊形 (代表地理圍欄),但實際上您可以使用多個多邊形和一個迴圈。
替代方法
本文件重點放在檢查自訂地理圍欄 (多邊形) 入侵的用戶端應用程式。但在某些情況下,您可能會想在後端進行這類檢查。
這表示應用程式會向後端回報位置更新,而這個後端會檢查車輛是否違反特定多邊形,因此不會取決於用戶端應用程式進行驗證。
可能的解決方法如下:
[執行環境] 伺服器端地理圍欄架構
示範伺服器端地理圍欄的架構範例。
- 驅動程式應用程式使用 Driver SDK 將位置更新資訊傳送至 Fleet Engine。位置資訊更新和應用程式內導航會透過 Navigation SDK 進行。
- Fleet Engine 會將這些更新輸出至 Cloud Logging 或 Pub/Sub。
- 後端會收集這些位置信號。
- 地理圍欄會儲存在 BigQuery 中,供後端進行分析。
- 觸發地理圍欄時,系統會將快訊傳送至驅動程式應用程式。
在這個架構中,會使用驅動程式 SDK 和 Fleet Engine。Fleet Engine 可發出 PubSub 更新,並在 Cloud Logging 中產生記錄項目。在這兩種情況下,都可以擷取車輛位置。
後端可能會監控 Pub/Sub 佇列或讀取記錄,並監控車輛更新。接著,每當發生更新時 (或每隔幾秒、幾分鐘就會完成更新),後端可呼叫 BigQuery GIS 函式,判斷特定車輛是否在地理圍欄內。如果一或多個地理圍欄遭到入侵,後端可能會採取行動,並觸發內部管道或其他相關工作流程。
結論
地理圍欄是一項強大工具,可用於多種用途。商家可以利用地理圍欄功能,向使用者放送相關廣告和促銷活動、提供適地性服務,以及提升安全性和安全性。
Navigation SDK 提供實用的事件監聽器,可以偵測旅程中的許多重要時刻。公司通常會針對特定用途要求自訂地理圍欄。本文件展示了達成這個目標的方法,但可能實現了無窮的可能性。我們期待看到您的成果。
下一步
- 歡迎觀看「探索、學習及汲取 Google 地圖平台方面的建議」網路研討會影片。
延伸閱讀: