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