安卓百度地圖(七)地理圍欄的建立與使用

weixin_34007291發表於2018-01-15

其他文章:
安卓百度離線地圖的下載以及使用
安卓百度地圖(一)定位功能的實現、周邊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

相關文章