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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容