Android 使用百度鹰眼实现运动轨迹功能
鷹眼軌跡是百度開放平臺(tái)最新推出的一套高性能軌跡存儲(chǔ)和查詢服務(wù)。百度已做好如此強(qiáng)大的功能,我們豈能不用。
使用鷹眼軌跡,一種方法是完全集成百度鷹眼軌跡的SDK。此方法參考http://lbsyun.baidu.com/index.PHP?title=Android-yingyan 開發(fā)指南集成即可。
接下來要說的是第二種方式。通過自己的服務(wù)端進(jìn)行交互的模式。使用該方式首先需要在百度開放平臺(tái)申請(qǐng)服務(wù)端的ak。
第二步:在鷹眼軌跡服務(wù)中軌跡管理臺(tái)創(chuàng)建自己的鷹眼服務(wù)。
通過這兩步我們就能得到調(diào)用鷹眼軌跡服務(wù)端接口的必要字段ak和service_id。
一般來說我們只需要調(diào)用兩個(gè)接口即可實(shí)現(xiàn)軌跡追蹤功能。一個(gè)是上傳定位位置,一個(gè)獲取歷史軌跡。
第一個(gè)接口:上傳定位位置
請(qǐng)求URI
URI:http://api.map.baidu.com/trace/v2/track/addpoint
HTTP請(qǐng)求方式
POST
請(qǐng)求參數(shù)
| ak | 用戶的ak,授權(quán)使用 | string | 必須 |
| service_id | servicede ID,作為其唯一標(biāo)識(shí) | int | 必選 |
| latitude | 緯度 | double(-90.0 , +90.0) | 必選 |
| longitude | 經(jīng)度 | double(-180.0 , +180.0) | 必選 |
| coord_type | 坐標(biāo)類型 | int(1-3) | 必選,1:GPS經(jīng)緯度坐標(biāo)2:國測局加密經(jīng)緯度坐標(biāo) 3:百度加密經(jīng)緯度坐標(biāo)。 |
| loc_time | 軌跡點(diǎn)采集的GPS時(shí)間 | Unix時(shí)間戳 | 必選。輸入的loc_time不能超過當(dāng)前服務(wù)端時(shí)間10分鐘以上。 |
| entity_name | entity唯一標(biāo)識(shí) | string(0-128) | 必選 |
| <column-key> | 用戶自定義列的column_key | 此處值的類型須與用戶自定義的column值的類型一致。 | 在track/create接口中可以為用戶自定義的column賦值,當(dāng)loc_time字段的值大于上一次時(shí),如果輸入了自定義的column的值,則這些值也會(huì)被更新。 |
entity_name 自己定義個(gè)唯一的區(qū)分標(biāo)示即可,cord_type 一般傳3,因?yàn)槎ㄎ徊捎玫陌俣萢pi,返回的坐標(biāo)就是百度經(jīng)緯度坐標(biāo)。
首先我們要在Android端集成百度定位的sdk。然后開啟定位服務(wù),每隔一段時(shí)間調(diào)用該接口上傳坐標(biāo)點(diǎn)。定位的核心方法如下。該方法建議在Service中實(shí)現(xiàn)。
private void initLocation(){mLocationClient = new LocationClient(getApplicationContext()); // 聲明LocationClient類
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 設(shè)置定位模式
option.setCoorType("bd09ll");// 返回的定位結(jié)果是百度經(jīng)緯度,默認(rèn)值gcj02
option.setScanSpan(10000);// 設(shè)置發(fā)起定位請(qǐng)求的間隔時(shí)間這里是10秒
option.setIsNeedAddress(true);// 返回的定位結(jié)果包含地址信息
option.setOpenGps(true);
mLocationClient.setLocOption(option);
// 注冊(cè)監(jiān)聽函數(shù)
mLocationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
try {
if (location == null) {
openLocation();
// mLocationClient.stop();
return;
}
/*
* 位置
*/
mlocation = location.getAddrStr();
lon = location.getLongitude();
lat = location.getLatitude();
mLat = Double.toString(lat);
mLon = Double.toString(lon);
sendTrack(); // 該方法調(diào)用鷹眼軌跡上傳的接口。
} catch (Exception e) {
if (mLocationClient != null) {
mLocationClient.stop();
}
}
}
}); ? ? ? ? ? ? ? ? mLocationClient.start();?
}
第二個(gè)接口:獲取歷史軌跡
請(qǐng)求URI
http://api.map.baidu.com/trace/v2/track/gethistory
HTTP請(qǐng)求方式
GET
請(qǐng)求參數(shù)
| ak | 用戶的ak,授權(quán)使用 | string | 必須 |
| service_id | service唯一標(biāo)識(shí) | int | 必選 |
| start_time | 起始時(shí)間 | UNIX時(shí)間戳 | 必選 |
| end_time | 結(jié)束時(shí)間 | UNIX時(shí)間戳 | 必選。結(jié)束時(shí)間不超過當(dāng)前時(shí)間,不能早于起始時(shí)間,且與起始時(shí)間差在24小時(shí)之內(nèi)。 |
| entity_name | entity唯一標(biāo)識(shí) | string | 必選 |
| simple_return | 是否返回精簡的結(jié)果 | int | 可選,默認(rèn)值是0,當(dāng)設(shè)為1時(shí),返回精簡結(jié)果。 |
| is_processed | 是否返回糾偏后軌跡 | int | 可選,默認(rèn)值是0。0為返回原始軌跡,1為返回糾偏軌跡。注意:軌跡糾偏功能包括去噪、抽稀、綁路三個(gè)步驟,當(dāng)is_processed=1時(shí),默認(rèn)僅進(jìn)行去噪和抽稀處理,并不作綁路處理。若應(yīng)用為車輛軌跡追蹤類型,需要開通綁路操作,可發(fā)郵件至:baiduyingyan@baidu.com,注明:ak、service_id和同時(shí)在線車輛數(shù),申請(qǐng)開通。 |
| page_index | 分頁索引 | int(1到2^21-1)默認(rèn)值為1 | 可選,與page_size一起計(jì)算從第幾條結(jié)果返回,代表返回第幾頁。 |
| page_size | 分頁大小 | int(1-5000)默認(rèn)值為100 | 可選字段,返回結(jié)果最大個(gè)數(shù)與page_index一起計(jì)算從第幾條結(jié)果返回,代表返回結(jié)果中每頁有幾條記錄。 |
返回值
| status | 狀態(tài)碼 | ? | ? | |
| message | 響應(yīng)信息 | string | 對(duì)status的中文描述 | |
| total | 忽略掉page_index,page_size后的軌跡點(diǎn)數(shù)量 | ? | 代表一共有多少條符合條件的track | |
| size | 返回的結(jié)果條數(shù) | int | 代表本頁返回了多少條符合條件的軌跡點(diǎn)數(shù)量 | |
| distance | 此段軌跡的里程數(shù),單位:米 | double | 符合條件的所有軌跡點(diǎn)的總里程。注意:是total個(gè)軌跡點(diǎn)的里程,和分頁及本頁顯示的size無關(guān)。 | |
| points | 歷史軌跡點(diǎn)列表 | ? | 當(dāng)simple_return=0時(shí),返回point全部字段信息; 當(dāng)simple_return=1時(shí),返回point信息將只包含 [longitude, latitude, loc_time,speed]字段; | |
| ? | location | 經(jīng)緯度 | Array | 百度加密坐標(biāo) |
| ? | loc_time | 該track實(shí)時(shí)點(diǎn)的上傳時(shí)間 | UNIX時(shí)間戳 | 該時(shí)間為用戶上傳的時(shí)間 |
| ? | create_time | 創(chuàng)建時(shí)間 | 格式化時(shí)間 | 該時(shí)間為服務(wù)端時(shí)間 |
| ? | direction | 方向 | int | 范圍為[0,365],0度為正北方向,順時(shí)針 |
| ? | speed | 速度 | double | 單位:km/h |
| ? | radius | 定位精度 | double | 單位:m |
| ? | <column-key> | 自定義字段 | ? | 當(dāng)用戶創(chuàng)建了track的自定義屬性,且在創(chuàng)該屬性賦有值,才會(huì)返回此字段。 |
該接口的entity_name就是你需要查詢的對(duì)象,page_size 默認(rèn)是100,可以根據(jù)需要調(diào)大點(diǎn)。
start_time和end_time格式為UNIX時(shí)間戳,這要求將時(shí)間進(jìn)行一下轉(zhuǎn)化,方法如下。
? ? /* 將字符串轉(zhuǎn)為時(shí)間戳 */
? ? public static String getTimeToStamp(String time) {
? ? ? ? SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd- HH:mm:ss");
? ? ? ? Date date = new Date();
? ? ? ? try {
? ? ? ? ? ? date = sdf.parse(time);
? ? ? ? } catch (ParseException e) {
? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? String tmptime = String.valueOf(date.getTime()).substring(0, 10);
? ? ? ? return tmptime;
? ? }
還需要注意的是end_time必須大于start_time且時(shí)間差不能超過24小時(shí),否則請(qǐng)求會(huì)失敗,報(bào)參數(shù)錯(cuò)誤。
接下來說下is_processed這個(gè)參數(shù),如果不傳,默認(rèn)的就是原始點(diǎn)記錄,如果傳1,百度會(huì)進(jìn)行去燥,消除一些跑偏的點(diǎn),使得軌跡看起來更加圓滑。
該接口的返回結(jié)果示例:JSON格式
{
"status": 0,"size": 2,"total": 2,"entity_name":"小明","distance":4190.69,"points": [{"location": [116.1556024,40.0820658,],"create_time": "2014-09-13 18:23:45","loc_time": "1442139825","direction": 240,"speed": 0.9,"radius": 5,"dispatch_state": “not”},{"location": [116.3579834,40.0280849,],"create_time": "2014-09-13 18:24:45","loc_time": 1442139885,"direction":240,"speed": 0.9,"radius": 5,"dispatch_state": “not”}],"message": "成功"}
解析該JSON中points字段即可得到一個(gè)百度坐標(biāo)點(diǎn)集合。然后調(diào)用如下兩個(gè)方法,即可畫出軌跡。
//劃線方法
private void addTracks(){
LatLng ll = null;
List<LatLng> points = new ArrayList<LatLng>();
? ? ? ? ? // 先清除
if ( mBaiduMap != null ){
mBaiduMap.clear();
}
// 添加折線
if (mTrackList.size() > 0){
try {
for (int i = 0 ;i < mTrackList.size(); i ++){
double mLon = Double.parseDouble(mTrackList.get(i).getLocation()[0]);
double mLat = Double.parseDouble(mTrackList.get(i).getLocation()[1]);
ll = new LatLng(mLat, mLon);
points.add(ll);
}
if ( points.size() >= 2 && points.size() <10000 ){
OverlayOptions ooPolyline = new PolylineOptions().width(10)
.color(getResources().getColor(R.color.map_line)).points(points);
mBaiduMap.addOverlay(ooPolyline);
}
} catch (Exception e) {
}
}
}
//設(shè)置起點(diǎn)--終點(diǎn)
private void setMarkers(){
// mTrackList 坐標(biāo)點(diǎn)集合
if (mTrackList != null && mTrackList.size() > 0){
try {
mLatitude = Double.parseDouble(mTrackList.get(mTrackList.size()-1).getLocation()[1]); // 緯度
mLongitude = Double.parseDouble(mTrackList.get(mTrackList.size()-1).getLocation()[0]); // 經(jīng)度
} catch (Exception e) {
// TODO: handle exception
}
// 添加起點(diǎn) -- 百度糾偏后起點(diǎn)是最后一個(gè)點(diǎn)。
LatLng limit = new LatLng(mLatitude, mLongitude);
mBaiduMap.addOverlay(new MarkerOptions().position(limit)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.track_start)));// 起點(diǎn)的圖片
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(limit));
try {
mLatitude = Double.parseDouble(mTrackList.get(0).getLocation()[1]);
mLongitude = Double.parseDouble(mTrackList.get(0).getLocation()[0]);
} catch (Exception e) {
// TODO: handle exception
}
// 添加終點(diǎn)
LatLng limitstart = new LatLng(mLatitude, mLongitude);
mBaiduMap.addOverlay(new MarkerOptions().position(limitstart)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.track_finish)));// 終點(diǎn)的圖片
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(limitstart));
}
}
最后實(shí)現(xiàn)的效果圖:
總結(jié)
以上是生活随笔為你收集整理的Android 使用百度鹰眼实现运动轨迹功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用c语言if语句实现判断闰年
- 下一篇: 计算机学院创新基金项目题目,关于组织开展