产品服务
解决方案
文档与支持
定价
地理围栏
下载开发文档
简介

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

Harmony鹰眼SDK提供了一系列与地理围栏相关的功能。通过 TraceClient类中createFenceManageService相应的接口发起请求。

Harmony鹰眼SDK中的地理围栏分为客户端地理围栏和服务端地理围栏,二者都支持创建、删除、修改、查询操作。使用Harmony鹰眼SDK,还可以查询指定终端实体与指定地理围栏的位置关系,查询指定终端实体的历史报警信息。当某终端实体的轨迹触发了地理围栏之后,报警信息会通过TraceListener.register(['TraceEventType.FENCE_ALARM_SERVICE'],callback)方法回调给开发者。

使用场景
鹰眼服务中,地理围栏主要有以下3种使用场景:

物流时效监控:司机APP集成鹰眼SDK持续追踪轨迹。车辆管理人员通过服务端为每个司机创建出发地和目的地站点围栏,一旦监控对象进出围栏,鹰眼支持向鹰眼SDK和开发者服务端推送报警信息。

路线偏离报警:鹰眼v3.0新增路线围栏,可设定车辆行驶路线和偏离距离,一旦车辆偏离超过设定的距离,鹰眼围栏将推送报警。

用车行业运营区域监控:利用鹰眼多边形地理围栏和行政区围栏功能,设置运营区域围栏,一旦判断车辆进/出运营区触发报警。

概念说明
围栏的种类

Harmony鹰眼SDK提供了两个端的地理围栏:客户端地理围栏和服务端地理围栏。
• 客户端地理围栏的管理、计算、报警触发均在客户端的Harmony鹰眼SDK内部完成,无需联网即可完成地理围栏的运算。
• 服务端地理围栏的管理、计算、报警触发都在鹰眼服务端完成,依赖于轨迹点及时上传至服务端才能完成围栏的各种操作。因此要想完整地使用服务端地理围栏的功能,使用SDK的设备必须时刻保持联网状态,否则将无法及时触发服务端地理围栏,报警信息也无法及时推送至客户端。与客户端地理围栏相比,服务端地理围栏支持将报警信息推送。
开发者可根据业务场景选择两类围栏中的一类,或两类同时使用,互为补充。

围栏的形状

目前Harmony鹰眼SDK的服务端地理围栏支持圆形、多边形、线形、行政区4种围栏形状,客户端地理围栏支持圆形围栏。四种形状的围栏报警行为如下:
• 圆形围栏:支持设置圆形围栏,一旦进出圆形范围则推送报警。
• 多边形围栏:支持设置多边形围栏,一旦进出多边形围栏则推送报警。
• 线形围栏:支持设置折线围栏,一旦偏离或回到设定路线则推送报警。
• 行政区围栏:支持通过传入行政区名称,创建以行政区边界为界的围栏。

围栏报警去噪的说明

无论是GPS定位还是网络定位都存在误差(也就是常说的定位漂移问题),噪点会造成围栏误报警。目前鹰眼围栏进行了去噪处理,同时开放了 denoiseAccuracy 去噪精度参数供开发者在创建围栏时设置,围栏运算时,一旦判断轨迹点的定位精度大于此去噪精度,则不参与围栏运算。比如设置 denoiseAccuracy = 30,则定位精度大于30米的轨迹点都不会参与围栏计算。

在此提供各定位模式的平均精度供开发者参考:
• 设备在空旷的室外时定位精度均值为5-10米。
• 设备在室内打开Wi-Fi开关的情况下,Wi-Fi定位的精度均值为8-10米。
• 设备在室内但关闭Wi-Fi开关的情况下,基站定位的精度均值为50-300米。

围栏
通过fence_type参数区分客户端(FenceType.LOCAL)、服务端围栏(FenceType.SERVER);目前客户端围栏只支持圆形。

使用Harmony鹰眼SDK可以创建、删除、更新、查询服务端地理围栏。SDK将轨迹上传至服务端时,服务端会进行相应的计算,若有围栏报警被触发,则通过长连接将报警信息推送至SDK;SDK还可以主动发起请求来查询指定监控对象的状态以及报警历史纪录等。需要注意的是:SDK中使用服务端地理围栏的功能时,必须要求网络畅通。若网络不畅,轨迹信息无法及时上传至服务端,围栏计算和推送均无法正常运行。

创建围栏

通过 createFenceManageService 类中的createFence方法创建服务端地理围栏。该方法中的请求对象为CreateFenceRequest类型,分别用于创建不同形状的地理围栏,其主要区别在于fence_shape参数的类型:
FenceShape.Circle
FenceShape.Polygon
FenceShape.Polyline FenceShape.District

下面的代码片段表示:

const res: Fence.CreateFenceResponse = await traceClient.createFenceManageService().createFence({
fence_shape: FenceShape.Circle, // 围栏类型
fence_name: 'server_circle_fence', // 围栏名称
radius: 10, // 围栏半径
coord_type: CoordType.BD09LL,
denoise: 20, // 去噪
latitude: 39.907083,
longitude: 116.326002,
monitored_person:'car_1', // 监控对象
fence_type: FenceType.SERVER, // 围栏类型,默认服务端
//...
})
删除围栏

通过 createFenceManageService 类中的deleteFence方法删除服务端地理围栏。
以下代码片段表示:

const res: Fence.DeleteFenceResponse = await traceClient.createFenceManageService().deleteFence({
fence_ids: ['1], // 围栏 id集合
fence_type: FenceType.LOCAL, // 围栏类型,默认服务端 可选
//...
});
更新围栏

通过 createFenceManageService 类中queryFenceList方法查询服务端地理围栏。该方法可以根据指定的监控对象或围栏ID,列出满足条件的地理围栏。
以下代码片段表示:

const res: Fence.FenceListResponse = await traceClient.createFenceManageService().queryFenceList({
monitored_person: 'car_1', // 监控对象,可选
fence_ids: '1', // 围栏,围栏 id
coord_type_output: CoordType.BD09LL, // 输出数据坐标类型
page_index: 1,
page_size: 10,
fence_type: FenceType.LOCAL, // 围栏类型,默认服务端 可选
//...
});
BMLog.info(`查询围栏列表: ${JSON.stringify(res)}`)
实时状态查询
Harmony鹰眼SDK支持查询指定监控对象的状态。监控对象即某个终端实体,监控对象的状态是指其相对其上的地理围栏的位置关系:是在圆形或多边形围栏的内部还是外部,是否偏离了线形围栏等。SDK提供了2个方法用于查询监控对象的状态:

使用 createFenceAlarmService类的queryStatus方法,查询被监控对象的状态时,被监控对象的位置以其上传至服务端的最新轨迹点为准。

await traceClient.createFenceAlarmService().queryStatus({
monitored_person: 'entity_1',
fence_ids: '1,2',
page_index: 1,
page_size: 10,
fence_type: CoordType.BD09LL,
fence_type: FenceType.LOCAL, // 围栏类型,默认服务端 可选
//...
})

使用 createFenceAlarmService类的queryStatusByLocation方法,根据坐标查询监控对象状态。可以假设被监控对象处于某自定义的位置坐标时,其和地理围栏的位置关系

await traceClient.createFenceAlarmService().queryStatusByLocation({
monitored_person: 'entity_1', // 监控对象
fence_ids: '1', // 围栏 ID
latitude: 39.907083,
longitude: 116.326002,
coord_type: CoordType.BD09LL, // 坐标类型
page_index: 1,
page_size: 10,
fence_type: FenceType.LOCAL, // 围栏类型,默认服务端 可选
//...
});
历史报警查询
支持查询指定时间段内,服务端地理围栏的历史报警记录。SDK提供了以下2个方法:

使用createFenceAlarmService类的historyAlarm方法,查询某监控对象的历史报警信息。

await traceClient.createFenceAlarmService().historyAlarm({
monitored_person: 'entity_1',
fence_ids: '1',
start_time: Math.floor(Date.now() / 1000), // 单位 s
end_time: Math.floor(Date.now() / 1000), // 单位 s
coord_type_output: CoordType.BD09L,
fence_type: FenceType.LOCAL, // 围栏类型,默认服务端 可选
//...
});

使用createFenceAlarmService类的batchHistoryAlarm方法,所有的终端实体上的所有服务端地理围栏,在过去12小时内的报警历史纪录。

await traceClient.createFenceAlarmService().batchHistoryAlarm({
start_time: Math.floor(Date.now() / 1000), // 单位 s
end_time: Math.floor(Date.now() / 1000), // 单位 s
coord_type_output: CoordType.BD09L
page_index: 1,
page_size: 10
fence_type: FenceType.LOCAL, // 围栏类型,默认服务端 可选
//...
});
报警推送

当服务端围栏被触发之后,会通过长连接将报警信息推送给SDK,SDK会通过 TraceListener.register(['TraceEventType.FENCE_ALARM_SERVICE'],callback)方法将报警信息推送给开发者。因此服务端围栏的报警推送要求网络畅通。当接收报警的手机断网或网络状态不好时,会导致报警推送失败,鹰眼服务端将在后续的10分钟之内每隔15s推送一次,直至收到成功响应。若10分钟之后仍未成功,将不再推送,但报警记录将存储在鹰眼服务端。为避免因此造成报警漏接收,开发者可定期使用历史报警查询接口同步报警信息。

客户端地理围栏不依赖网络,因此每个采集到的轨迹点,都会在第一时间参与客户端围栏的计算,若触发报警,则和服务端报警一样

TraceListener.register(['TraceEventType.FENCE_ALARM_SERVICE'], (status?: number, message?: string, data?: string | TraceEventData) => {
console.log(`【监听器管理】事件类型: ${status}, 消息: ${message}${data ? ', 数据: ' + JSON.stringify(data) : ''}`);
// 您于${time} ` + (currentAction == 1 ? `进入围栏${parsedMessage.fence}` : `离开围栏${parsedMessage.fence}`
});

上一篇

轨迹分析

下一篇

运营商网络

本篇文章对您是否有帮助?