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

其他文章:
安卓百度離線地圖的下載以及使用
安卓百度地圖(一)定位功能的實現、周邊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閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容