其他文章:
安卓百度離線地圖的下載以及使用
安卓百度地圖(一)定位功能的實(shí)現(xiàn)、周邊POI的檢索
安卓百度地圖(二)地圖顯示以及離線地圖的下載使用
安卓百度地圖(三)繪制點(diǎn)、線等圖層信息
安卓百度地圖(四)城市,周邊,區(qū)域檢索
安卓百度地圖(五)百度地圖路線規(guī)劃
安卓百度地圖(六)鷹眼軌跡的上傳,歷史軌跡的顯示
一 簡單介紹
地理圍欄(Geo-fencing)是LBS的一種新應(yīng)用,就是用一個(gè)虛擬的柵欄圍出一個(gè)虛擬地理邊界。當(dāng)手機(jī)進(jìn)入、離開某個(gè)特定地理區(qū)域,或在該區(qū)域內(nèi)活動(dòng)時(shí),手機(jī)可以接收自動(dòng)通知和警告。有了地理圍欄技術(shù),位置社交網(wǎng)站就可以幫助用戶在進(jìn)入某一地區(qū)時(shí)自動(dòng)登記。
二 圍欄的使用
2.1 地理圍欄的創(chuàng)建
2.1.1 創(chuàng)建客戶端圍欄
目前客戶端圍欄僅支持圓形圍欄,以圓形圍欄為例介紹客戶端圍欄的創(chuàng)建
// 請求標(biāo)識
int tag = 3;
// 軌跡服務(wù)ID
long serviceId = 0;
// 圍欄名稱
String fenceName = "local_circle";
// 監(jiān)控對象
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;
// 坐標(biāo)類型
CoordType coordType = CoordType.bd09ll;
// 創(chuàng)建本地圓形圍欄請求實(shí)例
CreateFenceRequest localCircleFenceRequest = CreateFenceRequest.buildLocalCircleRequest(tag, serviceId,fenceName, monitoredPerson, center, radius, denoise, coordType);
// 創(chuàng)建本地圓形圍欄
mTraceClient.createFence(localCircleFenceRequest, mFenceListener);
2.1.2 創(chuàng)建服務(wù)端圍欄
- 以創(chuàng)建多邊形圍欄為例,圓形和線型圍欄與之類似
// 請求標(biāo)識
int tag = 11;
// 軌跡服務(wù)ID
long serviceId = 0;
// 圍欄名稱
String fenceName = "server_polygon_fence";
// 監(jiān)控對象
String monitoredPerson = "myTrace";
// 多邊形頂點(diǎn)集
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;
// 坐標(biāo)類型
CoordType coordType = CoordType.bd09ll;
// 創(chuàng)建服務(wù)端多邊形圍欄請求實(shí)例
CreateFenceRequest request = CreateFenceRequest.buildServerPolygonRequest(tag,
serviceId, fenceName, monitoredPerson, vertexes, denoise, coordType);
// 初始化圍欄監(jiān)聽器
OnFenceListener mFenceListener = new OnFenceListener() {
//參見客戶端圍欄
};
// 創(chuàng)建服務(wù)端多邊形圍欄
mTraceClient.createFence(request, mFenceListener);
2.1.3 創(chuàng)建行政區(qū)圍欄示例
// 請求標(biāo)識
int tag = 13;
// 軌跡服務(wù)ID
long serviceId = 0;
// 圍欄名稱
String fenceName = "server_district_fence";
// 監(jiān)控對象
String monitoredPerson = "myTrace";
// 行政區(qū)劃關(guān)鍵字
String keyword = "湖南省長沙市";
// 去噪精度
int denoise = 100;
// 創(chuàng)建服務(wù)端行政區(qū)劃圍欄請求實(shí)例
CreateFenceRequest request = CreateFenceRequest.buildServerDistrictRequest(tag,
serviceId, fenceName, monitoredPerson, keyword, denoise);
// 初始化圍欄監(jiān)聽器
OnFenceListener mFenceListener = new OnFenceListener() {
//參見創(chuàng)建客戶端圍欄
}
// 創(chuàng)建服務(wù)端行政區(qū)劃圍欄
mTraceClient.createFence(request, mFenceListener);
2.1.4 圍欄回調(diào)監(jiān)聽
// 初始化圍欄監(jiān)聽器
OnFenceListener mFenceListener = new OnFenceListener() {
// 創(chuàng)建圍欄回調(diào)
@Override
public void onCreateFenceCallback(CreateFenceResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "創(chuàng)建圍欄回調(diào)成功", Toast.LENGTH_SHORT).show();
}
}
// 更新圍欄回調(diào)
@Override
public void onUpdateFenceCallback(UpdateFenceResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "更新圍欄回調(diào)成功", Toast.LENGTH_SHORT).show();
}
}
// 刪除圍欄回調(diào)
@Override
public void onDeleteFenceCallback(DeleteFenceResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "刪除圍欄回調(diào)成功", Toast.LENGTH_SHORT).show();
}
}
// 圍欄列表回調(diào)
@Override
public void onFenceListCallback(FenceListResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "圍欄列表回調(diào)成功", Toast.LENGTH_SHORT).show();
}
//獲取圍欄列表響應(yīng)結(jié)果
response.getSize();//圍欄個(gè)數(shù)
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();//監(jiān)控設(shè)備的唯一標(biāo)識
//...獲取圓心和半徑就可以在地圖上畫圓形圖層
break;
case polygon://多邊形
PolygonFence polygonFence = fenceInfo.getPolygonFence();
//獲取多邊形頂點(diǎn)集合
List<com.baidu.trace.model.LatLng> polygonVertexes = polygonFence.getVertexes();
//...獲取頂點(diǎn)坐標(biāo)可以在地圖上畫多邊形圖層
break;
case polyline://線形
PolylineFence polylineFence = fenceInfo.getPolylineFence();
//獲取線形頂點(diǎn)集合
List<com.baidu.trace.model.LatLng> polylineVertexes = polylineFence.getVertexes();
//...
break;
case district:
DistrictFence districtFence = fenceInfo.getDistrictFence();
districtFence.getDistrict();//獲取行政區(qū)名稱
//...注:行政區(qū)圍欄并能像多邊形一樣返回定點(diǎn)集合,行政區(qū)范圍很大,點(diǎn)很多...,
//如果想獲取行政區(qū)的邊界點(diǎn)坐標(biāo)結(jié)合,請使用baidumapapi_search_v4_3_1.jar中DistrictSearch類
break;
}
}
}
// 監(jiān)控狀態(tài)回調(diào)
@Override
public void onMonitoredStatusCallback(MonitoredStatusResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "監(jiān)控狀態(tài)回調(diào)成功", Toast.LENGTH_SHORT).show();
}
//查詢監(jiān)控對象狀態(tài)響應(yīng)結(jié)果
List<MonitoredStatusInfo> monitoredStatusInfos = response.getMonitoredStatusInfos();
for (MonitoredStatusInfo monitoredStatusInfo : monitoredStatusInfos) {
monitoredStatusInfo.getFenceId();
MonitoredStatus status = monitoredStatusInfo.getMonitoredStatus();//獲取狀態(tài)
switch (status) {
case in:
//監(jiān)控的設(shè)備在圍欄內(nèi)
Toast.makeText(RailActivity.this, "監(jiān)控的設(shè)備在圍欄內(nèi)", Toast.LENGTH_SHORT).show();
break;
case out:
//監(jiān)控的設(shè)備在圍欄外
Toast.makeText(RailActivity.this, "監(jiān)控的設(shè)備在圍欄外", Toast.LENGTH_SHORT).show();
break;
case unknown:
//監(jiān)控的設(shè)備狀態(tài)未知
Toast.makeText(RailActivity.this, "監(jiān)控的設(shè)備狀態(tài)未知", Toast.LENGTH_SHORT).show();
break;
}
}
}
// 指定位置
@Override
public void onMonitoredStatusByLocationCallback(MonitoredStatusByLocationResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "指定位置查詢成功", Toast.LENGTH_SHORT).show();
}
}
// 歷史報(bào)警回調(diào)
@Override
public void onHistoryAlarmCallback(HistoryAlarmResponse response) {
if ("成功".equals(response.getMessage())) {
Toast.makeText(RailActivity.this, "歷史報(bào)警回調(diào)成功", Toast.LENGTH_SHORT).show();
}
}
};
2.2 圍欄報(bào)警推送
圍欄報(bào)警支持推送至鷹眼SDK,統(tǒng)一由OnTraceListener監(jiān)聽器中的onPushCallback()推送回調(diào)接口接收。 開發(fā)者可在報(bào)警回調(diào)中觸發(fā)自身業(yè)務(wù),如發(fā)送短信至其他監(jiān)控者、推送至開發(fā)者服務(wù)端等。
當(dāng)接收報(bào)警的手機(jī)斷網(wǎng)或網(wǎng)絡(luò)狀態(tài)不好時(shí),會(huì)導(dǎo)致報(bào)警推送失敗,鷹眼服務(wù)端將在后續(xù)的10分鐘之內(nèi)每隔15s推送一次,直至收到成功響應(yīng)。若10分鐘之后仍未成功,將不再推送,但報(bào)警記錄將存儲在鷹眼服務(wù)端。為避免因此造成報(bào)警漏接收,開發(fā)者可定期使用歷史報(bào)警查詢接口同步報(bào)警信息。關(guān)于這部分,查看安卓百度地圖(六)鷹眼軌跡的上傳,歷史軌跡的顯示中onPushCallback回調(diào)方法
2.3 查詢圍欄列表
/**
* 以查詢服務(wù)端圍欄為例
* fenceIds:服務(wù)端圍欄編號列表,List<Long>,如傳入null,表示查詢所有圍欄
*/
// 圍欄編號列表
List<Long> fenceIds = new ArrayList<Long>();
fenceIds.add(100L);
FenceListRequest request = FenceListRequest.buildServerRequest(tag,serviceId, entityName, null,CoordType.bd09ll);
//發(fā)起查詢圍欄請求
mTraceClient.queryFenceList(request, mFenceListener);
2.4 查詢歷史報(bào)警
不論圍欄是否被刪除,鷹眼將保留7天內(nèi)的所有圍欄報(bào)警信息,可通過queryFenceHistoryAlarmInfo方法并指定fenceId即可查詢。
/**
* 以查詢服務(wù)端為例
* startTime:開始時(shí)間
* endTime:結(jié)束時(shí)間
* fenceIds:服務(wù)端圍欄編號列表,List<Long>,如傳入null,表示查詢所有圍欄
*/
int tag = 8;// 請求標(biāo)識
long startTime = System.currentTimeMillis() / 1000 - 30 * 60;// 開始時(shí)間
long endTime = System.currentTimeMillis() / 1000; // 結(jié)束時(shí)間
CoordType coordType = CoordType.bd09ll; // 坐標(biāo)類型
List<Long> fenceIds = null;
HistoryAlarmRequest request = HistoryAlarmRequest.buildServerRequest(tag, serviceId, startTime,
endTime, entityName, fenceIds, coordType);
//發(fā)起查詢請求
mTraceClient.queryFenceHistoryAlarmInfo(request, mFenceListener);
2.5 查詢監(jiān)控者狀態(tài)
/**
* 查詢監(jiān)控對象是否在圍欄內(nèi),以查詢服務(wù)端為例
* fenceIds:服務(wù)端圍欄編號列表,List<Long> 傳入null指定查詢在所有圍欄中的信息
* entityName:監(jiān)控對象標(biāo)識
*/
int tag = 9; // 請求標(biāo)識
MonitoredStatusRequest request = MonitoredStatusRequest.buildServerRequest(tag, serviceId,entityName, null);
//發(fā)起查詢請求
mTraceClient.queryMonitoredStatus(request, mFenceListener);
}
// 查詢圍欄監(jiān)控者狀態(tài)
mTraceClient.queryMonitoredStatus(request, mFenceListener);
2.6 根據(jù)坐標(biāo)查詢監(jiān)控者狀態(tài)
當(dāng)軌跡點(diǎn)尚未上傳時(shí),無法通過queryMonitoredStatus()方法查詢到準(zhǔn)確的狀態(tài)。此時(shí),可通過queryMonitoredStatusByLocation()方法,傳入一個(gè)被追蹤者當(dāng)前的坐標(biāo),判斷被追蹤者是在圍欄內(nèi)還是圍欄外。
/**
* 查詢監(jiān)控對象在指定位置是否在圍欄內(nèi),以查詢服務(wù)端為例
* latLng:位置點(diǎn)
* fenceIds 服務(wù)端圍欄編號列表,List<Long>,如傳入null,表示查詢所有圍欄
*/
int tag = 10;// 請求標(biāo)識
List<Long> fenceIds = null; // 圍欄編號列表
com.baidu.trace.model.LatLng location = new com.baidu.trace.model.LatLng(40.0552720000, 116.307655000); // 位置坐標(biāo)
CoordType coordType = CoordType.bd09ll; // 坐標(biāo)類型
MonitoredStatusByLocationRequest request = MonitoredStatusByLocationRequest.buildServerRequest(tag, serviceId,
entityName, fenceIds, location, coordType);
//發(fā)起查詢請求
mTraceClient.queryMonitoredStatusByLocation(request, mFenceListener);
2.7 更新圍欄
/**
* 以更新服務(wù)端圓形圍欄為例,其他圍欄同理
* fenceId:圍欄id
* 更新圍欄傳入新的參數(shù)即可,如圓形圍欄傳入新的半徑和圓心坐標(biāo)
*/
UpdateFenceRequest updateRequest = UpdateFenceRequest.buildServerCircleRequest(tag, serviceId, fenceId,
fenceName, entityName, center, radius, denoise, coordType);
//發(fā)起更新圍欄請求
mClient.updateFence(updateRequest , fenceListener);
2.8 刪除圍欄
/**
* 以刪除服務(wù)端圍欄為例
* deleteFenceIds:要?jiǎng)h除的服務(wù)端圍欄編號列表,List<Long>
*/
DeleteFenceRequest deleteRequest = DeleteFenceRequest.buildServerRequest(tag,serviceId, entityName, deleteFenceIds);
//發(fā)起刪除圍欄請求
mClient.deleteFence(deleteRequest , fenceListener);
本文主要做于收集整理筆記使用,關(guān)于文章的源碼,請移步我的GitHub