geo-fencing

简介

鹰眼的地理围栏服务,将根据轨迹判断终端是否进出围栏,并实时推送报警至观察者。


坐标系的说明

输入参数支持WGS84、GCJ02、bd09ll三种坐标系,可通过"coord_type"标明输入坐标类型。输出坐标仅支持百度经纬度坐标(bd09ll)。

围栏的应用场景

1. 物流司机发车和到达监控:司机APP集成鹰眼SDK持续追踪轨迹。车辆管理人员通过服务端为每个司机创建出发地和目的地围栏,监控对象和观察者都设为司机,并在SDK的围栏报警回调函数中向开发者服务端推送报警信息。一旦监控对象进出围栏,司机APP和开发者服务端将接收到实时报警。


2. 儿童老人监护:儿童或老人随身设备中集成鹰眼服务持续追踪轨迹,监护者APP(如:父母)集成鹰眼SDK并管理围栏,将观察者设为监护者,接收被监控者触发围栏的报警。

围栏的主要参数

1. 围栏的范围:可是一个圆形或多边形地理区域


2. 被监控对象:被追踪的对象(比如一辆车),必须是一个已存在的entity并上传轨迹。一旦该entity进出围栏,都将触发报警。


3. 观察者:接收该围栏报警的人(比如车辆管理者),必须是一个已存在的entity,但不需要上传轨迹。

创建围栏

可以随时为service内的任意entity创建围栏,不受创建者是谁影响。


配额:

- 一个围栏只能有一个被追踪者,1-5个观察者。

- 整个service无总围栏数限制,但每一个被监控对象(entity)最多被100个围栏监控。


示例:

① entity A 创建一个围栏,被监控者和观察者都是entity B。

如:车辆管理管理员(admin)为某个司机(car1)创建一个围栏,被监控者和观察者都是car1。一旦car1触发围栏,报警信息将推送给car1。司机APP可在接收到报警在onTracePushCallback()中触发自身业务。

// 轨迹服务ID
   long serviceId = 10000;
   // 创建者
   String creator = "admin";
   // 围栏名称
   String fenceName = "围栏名称";
   // 围栏描述
   String fenceDesc = "围栏描述";
   // 监控对象列表(多个entityName,以英文逗号"," 分割)
   String monitoredPersons = "car1";
   // 观察者列表(多个entityName,以英文逗号"," 分割)
   String observers = "car1";
   // 围栏圆心(圆心位置, 格式 : "经度,纬度")
   String center = 116.404046+ "," + 39.91339;
   // 坐标类型 (1:GPS经纬度,2:国测局经纬度,3:百度经纬度)
   int coordType = 3;
   // 围栏半径(单位 : 米)
   double radius = 100;
 
   //创建围栏
client.createCircularFence(serviceId, creator, fenceName, fenceDesc, monitoredPersons, observers,
null, 0, null, null, coordType, center, radius, 0, 0,geoFenceListener);

① entity A创建一个围栏,观察者是entity A,被监控者是entity B。

适用于报警接收者和被监控者不是同一人的场景,如:父母(mother1)监控小孩(child1)

注:这种情况下,由于父母不需要追踪自身轨迹,只需要接收报警,traceType可设置为1。此时将SDK将不采集轨迹,但可接收报警信息。

// 轨迹服务ID
   long serviceId = 10000;
   // 创建者
   String creator = "mother1";
   // 围栏名称
   String fenceName = "围栏名称";
   // 围栏描述
   String fenceDesc = "围栏描述";
   // 监控对象列表(多个entityName,以英文逗号"," 分割)
   String monitoredPersons = "child1";
   // 观察者列表(多个entityName,以英文逗号"," 分割)
   String observers = "mother1";
   // 围栏圆心(圆心位置, 格式 : "经度,纬度")
   String center = 116.404046+ "," + 39.91339;
   // 坐标类型 (1:GPS经纬度,2:国测局经纬度,3:百度经纬度)
   int coordType = 3;
   // 围栏半径(单位 : 米)
   double radius = 100;
 
   //创建围栏
client.createCircularFence(serviceId, creator, fenceName, fenceDesc, monitoredPersons, observers,
null, 0, null, null, coordType, center, radius, 0, 0,geoFenceListener);

围栏报警推送

围栏报警将推送至观察者,且只能推送到SDK,统一由OnStartTraceListener监听器中的onTracePushCallback()推送回调接口接收。

开发者可在报警回调中触发自身业务,如发送短信至监控者、推送至开发者服务端等。

当接收报警的手机断网或网络状态不好时,会导致报警推送失败,鹰眼将在后续的10分钟之内每隔15s推送一次,直至收到成功响应。若10分钟之后仍未成功,将不再推送,但报警记录将存储在鹰眼服务端。为避免因此造成报警漏接收,开发者可定期使用历史报警查询接口同步报警信息。

查询历史报警

不论围栏是否被删除,鹰眼将保留7天内的所有围栏报警信息,可通过queryFenceHistoryAlarmInfo方法并指定fenceId即可查询。

如:查询编号为1的围栏12小时内的报警信息。

 long serviceId = 10000;
 int fenceId = 1;
 String monitoredPersons = "";
 int beginTime = (int)(System.currentTimeMillis() / 1000 - 12 * 60 * 60);
 int endTime = (int)(System.currentTimeMillis() / 1000);
 
 client.queryFenceHistoryAlarmInfo(serviceId, fenceId, monitoredPersons, beginTime, endTime, listener);

围栏报警去噪

无论是GPS定位还是网络定位都存在误差(也就是常说的定位漂移问题),噪点会造成围栏误报警。

目前鹰眼提供了简单的围栏去噪处理,开发者可在创建围栏时设置过滤条件,定位精度radius大于设定值的轨迹点将进行围栏计算。比如设置围栏去噪精度为30米,则定位精度大于30米的轨迹点都不会参与围栏计算,只有定位精度不大于30米的轨迹点才会参与计算。

可参考各定位模式的平均精度:GPS定位精度均值为10米,WIFI定位精度均值为24米,基站定位精度均值为210米。

查询监控者状态

可通过queryMonitoredStatus()方法可以查询被监控者服务端存储的最新位置,是在围栏内或围栏外。

如:查询监控对象car1是在编号为1的围栏内还是外。

//围栏ID
int fenceId = <要查询的围栏ID>;
//监控对象列表(多个entityName,以英文逗号"," 分割)
String monitoredPersons = "car1";
//查询实时状态
client.queryMonitoredStatus(serviceId, fenceId, monitoredPersons, geoFenceListener);

根据坐标查询监控者状态

当轨迹点尚未上传时,无法通过queryMonitoredStatus()方法查询到准确的状态。此时,可通过queryMonitoredStatusByLocation()方法,传入一个被追踪者当前的坐标,判断被追踪者是在围栏内还是围栏外。

如:查询监控对象car1(指定位置:119.33,40.39,坐标类型为:百度经纬度)是在编号为1的围栏内还是外。

 long serviceId = 10000;
 int fenceId = 1;
 String monitoredPersons = "myTrace";
 String locations = "119.33,40.39,3";
 
 client.queryMonitoredStatusByLocation(serviceId, fenceId, monitoredPersons, locations, listener);