安卓百度地图(七)地理围栏的建立与使用

其他文章:
安卓百度离线地图的下载以及使用
安卓百度地图(一)定位功能的实现、周边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 创建服务端围栏

  1. 以创建多边形围栏为例,圆形和线型围栏与之类似
// 请求标识
int tag = 11;
// 轨迹服务ID
long serviceId = 0;
// 围栏名称
String fenceName = "server_polygon_fence";
// 监控对象
String monitoredPerson = "myTrace";
// 多边形顶点集
List vertexes = new ArrayList();
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 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 polygonVertexes = polygonFence.getVertexes();
                        //...获取顶点坐标可以在地图上画多边形图层
                        break;
                    case polyline://线形
                        PolylineFence polylineFence = fenceInfo.getPolylineFence();
                        //获取线形顶点集合
                        List 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 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,如传入null,表示查询所有围栏
*/
// 围栏编号列表
List fenceIds = new ArrayList();
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,如传入null,表示查询所有围栏
*/
int tag = 8;// 请求标识
long startTime = System.currentTimeMillis() / 1000 - 30 * 60;// 开始时间
long endTime = System.currentTimeMillis() / 1000; // 结束时间
CoordType coordType = CoordType.bd09ll;  // 坐标类型
List fenceIds = null;
HistoryAlarmRequest request = HistoryAlarmRequest.buildServerRequest(tag, serviceId, startTime,
                endTime, entityName, fenceIds, coordType);
//发起查询请求
mTraceClient.queryFenceHistoryAlarmInfo(request, mFenceListener);

2.5 查询监控者状态

 /**
* 查询监控对象是否在围栏内,以查询服务端为例
* fenceIds:服务端围栏编号列表,List 传入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,如传入null,表示查询所有围栏
*/
int tag = 10;// 请求标识
List 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
*/
DeleteFenceRequest deleteRequest = DeleteFenceRequest.buildServerRequest(tag,serviceId, entityName, deleteFenceIds);
//发起删除围栏请求
mClient.deleteFence(deleteRequest , fenceListener);

本文主要做于收集整理笔记使用,关于文章的源码,请移步我的GitHub

你可能感兴趣的:(安卓百度地图(七)地理围栏的建立与使用)