其他文章:
安卓百度离线地图的下载以及使用
安卓百度地图(一)定位功能的实现、周边POI的检索
安卓百度地图(二)地图显示以及离线地图的下载使用
安卓百度地图(三)绘制点、线等图层信息
安卓百度地图(四)城市,周边,区域检索
安卓百度地图(五)百度地图路线规划
安卓百度地图(六)鹰眼轨迹的上传,历史轨迹的显示
一 简单介绍
地理围栏(Geo-fencing)是LBS的一种新应用,就是用一个虚拟的栅栏围出一个虚拟地理边界。当手机进入、离开某个特定地理区域,或在该区域内活动时,手机可以接收自动通知和警告。有了地理围栏技术,位置社交网站就可以帮助用户在进入某一地区时自动登记。
二 围栏的使用
2.1 地理围栏的创建
2.1.1 创建客户端围栏
目前客户端围栏仅支持圆形围栏,以圆形围栏为例介绍客户端围栏的创建
// 请求标识
int tag = 3;
// 轨迹服务ID
long serviceId = 0;
// 围栏名称
String fenceName = "local_circle";
// 监控对象
String monitoredPerson = "myTrace";
// 围栏圆心
com.baidu.trace.model.LatLng center = new com.baidu.trace.model.LatLng(39.9151190000, 116.4039630000);
// 围栏半径(单位 : 米)
double radius = 2000;
// 去噪精度
int denoise = 200;
// 坐标类型
CoordType coordType = CoordType.bd09ll;
// 创建本地圆形围栏请求实例
CreateFenceRequest localCircleFenceRequest = CreateFenceRequest.buildLocalCircleRequest(tag, serviceId,fenceName, monitoredPerson, center, radius, denoise, coordType);
// 创建本地圆形围栏
mTraceClient.createFence(localCircleFenceRequest, mFenceListener);
2.1.2 创建服务端围栏
- 以创建多边形围栏为例,圆形和线型围栏与之类似
// 请求标识
int tag = 11;
// 轨迹服务ID
long serviceId = 0;
// 围栏名称
String fenceName = "server_polygon_fence";
// 监控对象
String monitoredPerson = "myTrace";
// 多边形顶点集
List<com.baidu.trace.model.LatLng> vertexes = new ArrayList<com.baidu.trace.model.LatLng>();
vertexes.add(new LatLng(40.0581750000, 116.3067370000));
vertexes.add(new LatLng(40.0583410000, 116.3079580000));
vertexes.add(new LatLng(40.0554970000, 116.3093600000));
vertexes.add(new LatLng(40.0554140000, 116.3078150000));
// 去噪精度
int denoise = 100;
// 坐标类型
CoordType coordType = CoordType.bd09ll;
// 创建服务端多边形围栏请求实例
CreateFenceRequest request = CreateFenceRequest.buildServerPolygonRequest(tag,
serviceId, fenceName, monitoredPerson, vertexes, denoise, coordType);
// 初始化围栏监听器
OnFenceListener mFenceListener = new OnFenceListener() {
//参见客户端围栏
};
// 创建服务端多边形围栏
mTraceClient.createFence(request, mFenceListener);
2.1.3 创建行政区围栏示例
// 请求标识
int tag = 13;
// 轨迹服务ID
long serviceId = 0;
// 围栏名称
String fenceName = "server_district_fence";
// 监控对象
String monitoredPerson = "myTrace";
// 行政区划关键字
String keyword = "湖南省长沙市";
// 去噪精度
int denoise = 100;
// 创建服务端行政区划围栏请求实例
CreateFenceRequest request = CreateFenceRequest.buildServerDistrictRequest(tag,
serviceId, fenceName, monitoredPerson, keyword, denoise);
// 初始化围栏监听器
OnFenceListener mFenceListener = new OnFenceListener() {
//参见创建客户端围栏
}
// 创建服务端行政区划围栏
mTraceClient.createFence(request, mFenceListener);
2.1.4 围栏回调监听
// 初始化围栏监听器
OnFenceListener mFenceListener = new OnFenceListener() {
// 创建围栏回调
@Override
public void onCreateFenceCallback(CreateFenceResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "创建围栏回调成功", Toast.LENGTH_SHORT).show();
}
}
// 更新围栏回调
@Override
public void onUpdateFenceCallback(UpdateFenceResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "更新围栏回调成功", Toast.LENGTH_SHORT).show();
}
}
// 删除围栏回调
@Override
public void onDeleteFenceCallback(DeleteFenceResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "删除围栏回调成功", Toast.LENGTH_SHORT).show();
}
}
// 围栏列表回调
@Override
public void onFenceListCallback(FenceListResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "围栏列表回调成功", Toast.LENGTH_SHORT).show();
}
//获取围栏列表响应结果
response.getSize();//围栏个数
List<FenceInfo> fenceInfos = response.getFenceInfos();//获取围栏信息列表
for (FenceInfo fenceInfo : fenceInfos) {
switch (fenceInfo.getFenceShape()) {//判断围栏形状
case circle://圆形
CircleFence circleFence = fenceInfo.getCircleFence();
circleFence.getFenceId();
circleFence.getCenter();
circleFence.getRadius();
circleFence.getDenoise();//去噪精度
circleFence.getMonitoredPerson();//监控设备的唯一标识
//...获取圆心和半径就可以在地图上画圆形图层
break;
case polygon://多边形
PolygonFence polygonFence = fenceInfo.getPolygonFence();
//获取多边形顶点集合
List<com.baidu.trace.model.LatLng> polygonVertexes = polygonFence.getVertexes();
//...获取顶点坐标可以在地图上画多边形图层
break;
case polyline://线形
PolylineFence polylineFence = fenceInfo.getPolylineFence();
//获取线形顶点集合
List<com.baidu.trace.model.LatLng> polylineVertexes = polylineFence.getVertexes();
//...
break;
case district:
DistrictFence districtFence = fenceInfo.getDistrictFence();
districtFence.getDistrict();//获取行政区名称
//...注:行政区围栏并能像多边形一样返回定点集合,行政区范围很大,点很多...,
//如果想获取行政区的边界点坐标结合,请使用baidumapapi_search_v4_3_1.jar中DistrictSearch类
break;
}
}
}
// 监控状态回调
@Override
public void onMonitoredStatusCallback(MonitoredStatusResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "监控状态回调成功", Toast.LENGTH_SHORT).show();
}
//查询监控对象状态响应结果
List<MonitoredStatusInfo> monitoredStatusInfos = response.getMonitoredStatusInfos();
for (MonitoredStatusInfo monitoredStatusInfo : monitoredStatusInfos) {
monitoredStatusInfo.getFenceId();
MonitoredStatus status = monitoredStatusInfo.getMonitoredStatus();//获取状态
switch (status) {
case in:
//监控的设备在围栏内
Toast.makeText(RailActivity.this, "监控的设备在围栏内", Toast.LENGTH_SHORT).show();
break;
case out:
//监控的设备在围栏外
Toast.makeText(RailActivity.this, "监控的设备在围栏外", Toast.LENGTH_SHORT).show();
break;
case unknown:
//监控的设备状态未知
Toast.makeText(RailActivity.this, "监控的设备状态未知", Toast.LENGTH_SHORT).show();
break;
}
}
}
// 指定位置
@Override
public void onMonitoredStatusByLocationCallback(MonitoredStatusByLocationResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "指定位置查询成功", Toast.LENGTH_SHORT).show();
}
}
// 历史报警回调
@Override
public void onHistoryAlarmCallback(HistoryAlarmResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "历史报警回调成功", Toast.LENGTH_SHORT).show();
}
}
};
2.2 围栏报警推送
围栏报警支持推送至鹰眼SDK,统一由OnTraceListener监听器中的onPushCallback()推送回调接口接收。 开发者可在报警回调中触发自身业务,如发送短信至其他监控者、推送至开发者服务端等。
当接收报警的手机断网或网络状态不好时,会导致报警推送失败,鹰眼服务端将在后续的10分钟之内每隔15s推送一次,直至收到成功响应。若10分钟之后仍未成功,将不再推送,但报警记录将存储在鹰眼服务端。为避免因此造成报警漏接收,开发者可定期使用历史报警查询接口同步报警信息。关于这部分,查看安卓百度地图(六)鹰眼轨迹的上传,历史轨迹的显示中onPushCallback回调方法
2.3 查询围栏列表
/**
* 以查询服务端围栏为例
* fenceIds:服务端围栏编号列表,List<Long>,如传入null,表示查询所有围栏
*/
// 围栏编号列表
List<Long> fenceIds = new ArrayList<Long>();
fenceIds.add(100L);
FenceListRequest request = FenceListRequest.buildServerRequest(tag,serviceId, entityName, null,CoordType.bd09ll);
//发起查询围栏请求
mTraceClient.queryFenceList(request, mFenceListener);
2.4 查询历史报警
不论围栏是否被删除,鹰眼将保留7天内的所有围栏报警信息,可通过queryFenceHistoryAlarmInfo方法并指定fenceId即可查询。
/**
* 以查询服务端为例
* startTime:开始时间
* endTime:结束时间
* fenceIds:服务端围栏编号列表,List<Long>,如传入null,表示查询所有围栏
*/
int tag = 8;// 请求标识
long startTime = System.currentTimeMillis() / 1000 - 30 * 60;// 开始时间
long endTime = System.currentTimeMillis() / 1000; // 结束时间
CoordType coordType = CoordType.bd09ll; // 坐标类型
List<Long> fenceIds = null;
HistoryAlarmRequest request = HistoryAlarmRequest.buildServerRequest(tag, serviceId, startTime,
endTime, entityName, fenceIds, coordType);
//发起查询请求
mTraceClient.queryFenceHistoryAlarmInfo(request, mFenceListener);
2.5 查询监控者状态
/**
* 查询监控对象是否在围栏内,以查询服务端为例
* fenceIds:服务端围栏编号列表,List<Long> 传入null指定查询在所有围栏中的信息
* entityName:监控对象标识
*/
int tag = 9; // 请求标识
MonitoredStatusRequest request = MonitoredStatusRequest.buildServerRequest(tag, serviceId,entityName, null);
//发起查询请求
mTraceClient.queryMonitoredStatus(request, mFenceListener);
}
// 查询围栏监控者状态
mTraceClient.queryMonitoredStatus(request, mFenceListener);
2.6 根据坐标查询监控者状态
当轨迹点尚未上传时,无法通过queryMonitoredStatus()方法查询到准确的状态。此时,可通过queryMonitoredStatusByLocation()方法,传入一个被追踪者当前的坐标,判断被追踪者是在围栏内还是围栏外。
/**
* 查询监控对象在指定位置是否在围栏内,以查询服务端为例
* latLng:位置点
* fenceIds 服务端围栏编号列表,List<Long>,如传入null,表示查询所有围栏
*/
int tag = 10;// 请求标识
List<Long> fenceIds = null; // 围栏编号列表
com.baidu.trace.model.LatLng location = new com.baidu.trace.model.LatLng(40.0552720000, 116.307655000); // 位置坐标
CoordType coordType = CoordType.bd09ll; // 坐标类型
MonitoredStatusByLocationRequest request = MonitoredStatusByLocationRequest.buildServerRequest(tag, serviceId,
entityName, fenceIds, location, coordType);
//发起查询请求
mTraceClient.queryMonitoredStatusByLocation(request, mFenceListener);
2.7 更新围栏
/**
* 以更新服务端圆形围栏为例,其他围栏同理
* fenceId:围栏id
* 更新围栏传入新的参数即可,如圆形围栏传入新的半径和圆心坐标
*/
UpdateFenceRequest updateRequest = UpdateFenceRequest.buildServerCircleRequest(tag, serviceId, fenceId,
fenceName, entityName, center, radius, denoise, coordType);
//发起更新围栏请求
mClient.updateFence(updateRequest , fenceListener);
2.8 删除围栏
/**
* 以删除服务端围栏为例
* deleteFenceIds:要删除的服务端围栏编号列表,List<Long>
*/
DeleteFenceRequest deleteRequest = DeleteFenceRequest.buildServerRequest(tag,serviceId, entityName, deleteFenceIds);
//发起删除围栏请求
mClient.deleteFence(deleteRequest , fenceListener);
本文主要做于收集整理笔记使用,关于文章的源码,请移步我的GitHub
网友评论