本文說明用戶端地理圍欄,以及何時使用這項功能,並說明如何將這項功能套用至行動應用程式中的用途。此外,本文也會說明如何使用 Google Navigation SDK 在 Android 上實作範例。

公司通常需要瞭解行動裝置何時進入或離開特定區域。方法是維持虛擬地理邊界或地理圍欄,讓軟體在裝置跨越邊界時觸發事件。
瞭解特定車輛何時會穿越邊界,對於多種用途來說非常重要,例如:
- 提升顧客參與度:商家可以利用地理圍欄技術,向終端使用者傳送有關特惠、活動或新產品的推播通知。
- 安全與保障:商家可以利用地理圍欄,在資料中心或倉庫等敏感區域周圍建立虛擬邊界,並在有人進入或離開該區域時,向安全人員發出警報。
- 交通運輸:商家可使用地理圍欄追蹤車輛位置,並改善路線和時間表。
因此,您必須瞭解如何在面向用戶端的應用程式中表示這些區域 (多邊形)。這個應用程式應追蹤裝置位置,並檢查是否違反特定地理圍欄。
範圍
本文著重於地理圍欄的用戶端實作。也就是說,用戶端應用程式必須具備:
- 需要檢查是否違規的多邊形;
- 使用者的即時位置資訊
- 檢查目前位置是否位於任何多邊形內或外的邏輯。
本指南包含 Android 範例,但您也可以在 iOS 上以相同方式完成這項操作。Android 定位服務內建圓形地理圍欄的實作方式,詳情請參閱這篇文章。以下參考程式碼和說明是較複雜實作的起點。
Navigation SDK
Navigation SDK 是新增至駕駛人應用程式的原生 Android / iOS 程式庫,負責執行下列工作:
- 從執行該應用程式取得道路對應位置。這項服務比 Android 的 FusedLocationProvider (FLP) 更精確,因為它會使用 Google 的道路網路,將位置資訊對應到最近的路段,因此預計抵達時間會更準確,而且還會提供 FLP 的其他資訊。
- 提供詳細的導航資訊,讓駕駛人能考量即時交通狀況和其他路線限制,有效率地從 A 點抵達 B 點。
- 透過事件監聽器和已註冊的回呼觸發事件。
事件監聽器
Navigation SDK 提供許多可用的監聽器。例如:
- 透過 RoadSnappedLocation 提供者變更位置。
- 透過 ReroutingListener 重新規劃路線 (使用者錯過迴轉、左轉等,並偏離建議路線)。
- 透過 ArrivalListener 取得抵達事件 (使用者抵達預定目的地)。
- 剩餘距離和預計抵達時間事件 (在駕駛人即將抵達目的地時收到通知 - 根據公尺數,在駕駛人即將抵達目的地時收到通知 - 根據時間),兩者都可透過 .RemainingTimeOrDistanceChangedListener 取得。
本指南只會使用 RoadSnappedLocationProvider 及其 LocationListener。
用戶端地理圍欄解決方案
現在,我們來逐步建構用戶端地理圍欄功能。在下方範例中,Navigation SDK 處於逐向導航模式,且路線中定義的多邊形代表地理圍欄。
- 地理圍欄會儲存在 BigQuery 中,並由後端提取。
- 後端會定期將地理圍欄推送至行車應用程式。
- 司機會導覽,而司機應用程式會定期檢查地理圍欄是否觸發。
- 司機應用程式會將觸發事件通知後端,以便採取行動。
車輛沿路線行駛時,應用程式會定期檢查是否超出多邊形範圍。應用程式偵測到跨越地理圍欄時,使用者介面會顯示「地理圍欄遭突破」訊息。
設定 Android-Maps-Utils 的依附元件
這項解決方案會使用 Android-Maps-Utils,這是一個開放原始碼程式庫,內含各種公用程式,適用於使用 Google 地圖 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
中指定的內容,請參閱這篇文章。
您應在建立片段或活動時定義多邊形。例如:
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 中,以供分析。
- 觸發地理圍欄後,系統會將快訊傳送至司機應用程式。
在這個架構中,我們使用 Driver SDK 和 Fleet Engine。Fleet Engine 可以發出 PubSub 更新,並在 Cloud Logging 中產生記錄項目。在這兩種情況下,都可以擷取車輛位置。
後端接著可以監控 PubSub 佇列或讀取記錄,並監看車輛更新。接著,每當發生更新 (或每隔幾秒/幾分鐘,視重要性而定),後端可以呼叫 BigQuery GIS 函式,判斷特定車輛是否位於地理圍欄內。如果一或多個地理圍欄遭到入侵,後端可以採取行動,觸發內部管道或其他相關工作流程。
結論
地理圍欄是一項強大的工具,可用於多種用途。商家可以運用地理圍欄技術,向目標使用者放送相關廣告和促銷活動、提供以位置為準的服務,以及提升安全和保障。
Navigation SDK 提供實用的事件監聽器,可偵測行程中的許多重要時刻。公司通常會針對特定用途要求自訂地理圍欄。我們在這份文件中示範了其中一種做法,但其實有無限可能。期待看到你的作品!
後續動作
- 觀看「探索、學習及發掘 Google 地圖平台無限可能」網路研討會。
建議延伸閱讀: