本文档介绍了什么是客户端地理围栏、何时使用它以及如何将其应用于移动应用中的用例。此外,还展示了如何使用 Google Navigation SDK 在 Android 上实现示例。
公司通常需要了解移动设备何时进入或离开特定区域。这是通过维护虚拟地理边界(也称为地理围栏)实现的,使软件能够在设备跨越边界时触发事件。
了解特定车辆何时穿越边界对于多种应用场景非常重要,例如:
- 客户互动:商家可以使用地理围栏向最终用户发送有关特别优惠、活动或新产品的推送通知。
- 安全和安全:商家可以使用地理围栏围绕敏感区域(例如数据中心或仓库)创建虚拟边界,并在有人进入或离开敏感区域时向安全人员发出警报。
- 交通:商家可以使用地理围栏来跟踪车辆的位置,并优化路线和时刻表。
因此,务必了解如何在面向客户的应用内表示这些可用区(多边形)。该应用应跟踪设备位置,并检查其是否突破了特定地理围栏。
范围
本文档重点介绍地理围栏的客户端实现。这意味着客户端应用必须具有:
- 需要检查是否存在违规的多边形;
- 用户的实时位置信息
- 用于检查当前位置是在多边形内部还是外部的逻辑。
本指南包含一些 Android 示例,但还有同样适用于 iOS 的实现方法。Android 位置信息服务具有圆形地理围栏的内置实现,详见此处。以下参考代码和说明适用于更复杂的实现。
Navigation SDK
Navigation SDK 是添加到驱动程序应用的原生 Android / iOS 库。它负责:
- 从运行道路的应用获取道路贴靠位置。这比 Android 的 FusedLocationProvider (FLP) 更精确,因为它使用 Google 的道路网将位置与最近的路段对应,使预计到达时间更加准确,以及 FLP 中的其他信息。
- 精细导航体验,在考虑实时路况及其他路线限制的情况下,驾驶员能够高效从一个地点前往另一个地点。
- 通过事件监听器和注册的回调触发事件。
监听器
Navigation SDK 有许多可供您使用的监听器。下面列举了一些:
- 通过 RoadSnappedLocation 提供程序更改位置信息。
- 通过 ReroutingListener 重新路由事件(用户错过掉头、左转弯等,并偏离建议的路线)。
- 通过 ArrivalListener 接收的到达事件(用户抵达计划的目的地)。
- 剩余距离和预计到达事件(在司机即将到达目的地时收到通知 - 基于米,在司机即将到达目的地时通知,基于时间)均可通过 .RemainingTimeOrDistanceChangedListener 获取
在本指南中,我们仅使用了 RoadSnappedLocationProvider 及其 LocationListener。
客户端地理围栏解决方案
现在,我们来逐步构建客户端地理围栏功能。在以下示例中,我们有 Navigation SDK 在精细模式下运行,并在表示地理围栏的路线中定义了一个多边形。
- 地理围栏存储在 BigQuery 中,并由您的后端拉取。
- 后端会定期将地理围栏推出到云端硬盘应用。
- 驾驶员导航,驾驶员应用定期检查地理围栏,看看有没有触发器。
- 驱动程序应用会通知后端触发事件,以便其采取行动。
当车辆沿路线行驶时,应用会定期检查多边形是否已遭突破。当应用检测到它越过地理围栏时,界面中会显示一条消息,显示“地理围栏已损坏”。
配置 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
检查接收的位置是否在预定义的多边形内。在下面的示例中,我们使用了表示地理围栏的预定义多边形,但在实践中,您可能会有多个多边形,并且需要一个环路。
替代方法
本文档重点介绍一款面向客户端的应用,该应用可检查是否存在自定义地理围栏(多边形)漏洞。但在某些情况下,您可能需要对后端进行此类检查。
这意味着应用会向后端报告位置更新,然后此后端会检查车辆是否突破了特定多边形,因此不会依赖客户端应用进行验证。
可能的解决方法如下:
[执行环境] 服务器端地理围栏架构
示例架构,演示服务器端的地理围栏方法。
- 使用驱动程序 SDK 的驱动程序应用向 Fleet Engine 发送位置信息更新。位置信息更新和应用内导航通过 Navigation SDK 进行。
- Fleet Engine 会将这些更新输出到 Cloud Logging 或 Pub/Sub。
- 后端会收集这些位置信号。
- 地理围栏存储在 BigQuery 中,以供后端分析。
- 触发地理围栏后,系统会向驾驶员应用发送提醒。
此架构使用驱动程序 SDK 和舰队引擎。Fleet Engine 可以发出 PubSub 更新并在 Cloud Logging 中生成日志条目。在这两种情况下,都能检索车辆位置。
然后,后端可以监控 PubSub 队列或读取日志并监控车辆更新。然后,每当发生更新时(或者每几秒或几分钟更新一次,具体取决于更新的重要程度),后端可以调用 BigQuery GIS 函数来确定指定车辆是否在地理围栏之内。如果一个或多个地理围栏遭到破坏,后端可以采取行动并触发内部管道或其他相关工作流。
总结
地理围栏是一种可用于多种用途的强大工具。商家可以使用地理围栏向最终用户投放相关广告和宣传内容、提供基于地理位置的服务,以及提高安全性和安全性。
Navigation SDK 提供了实用的事件监听器,可用于检测行程中的许多重要时刻。公司通常需要针对特定用例自定义地理围栏。在本文档中,我们展示了实现这一目标的方法,但其可能性是无穷无尽的。我们期待看到您的创意。
后续操作
建议的深入阅读: