Android 使用百度鹰眼实现运动轨迹功能
鷹眼軌跡是百度開放平臺最新推出的一套高性能軌跡存儲和查詢服務。百度已做好如此強大的功能,我們豈能不用。
使用鷹眼軌跡,一種方法是完全集成百度鷹眼軌跡的SDK。此方法參考http://lbsyun.baidu.com/index.PHP?title=Android-yingyan 開發指南集成即可。
接下來要說的是第二種方式。通過自己的服務端進行交互的模式。使用該方式首先需要在百度開放平臺申請服務端的ak。
第二步:在鷹眼軌跡服務中軌跡管理臺創建自己的鷹眼服務。
通過這兩步我們就能得到調用鷹眼軌跡服務端接口的必要字段ak和service_id。
一般來說我們只需要調用兩個接口即可實現軌跡追蹤功能。一個是上傳定位位置,一個獲取歷史軌跡。
第一個接口:上傳定位位置
請求URI
URI:http://api.map.baidu.com/trace/v2/track/addpoint
HTTP請求方式
POST
請求參數
| ak | 用戶的ak,授權使用 | string | 必須 |
| service_id | servicede ID,作為其唯一標識 | int | 必選 |
| latitude | 緯度 | double(-90.0 , +90.0) | 必選 |
| longitude | 經度 | double(-180.0 , +180.0) | 必選 |
| coord_type | 坐標類型 | int(1-3) | 必選,1:GPS經緯度坐標2:國測局加密經緯度坐標 3:百度加密經緯度坐標。 |
| loc_time | 軌跡點采集的GPS時間 | Unix時間戳 | 必選。輸入的loc_time不能超過當前服務端時間10分鐘以上。 |
| entity_name | entity唯一標識 | string(0-128) | 必選 |
| <column-key> | 用戶自定義列的column_key | 此處值的類型須與用戶自定義的column值的類型一致。 | 在track/create接口中可以為用戶自定義的column賦值,當loc_time字段的值大于上一次時,如果輸入了自定義的column的值,則這些值也會被更新。 |
entity_name 自己定義個唯一的區分標示即可,cord_type 一般傳3,因為定位采用的百度api,返回的坐標就是百度經緯度坐標。
首先我們要在Android端集成百度定位的sdk。然后開啟定位服務,每隔一段時間調用該接口上傳坐標點。定位的核心方法如下。該方法建議在Service中實現。
private void initLocation(){mLocationClient = new LocationClient(getApplicationContext()); // 聲明LocationClient類
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 設置定位模式
option.setCoorType("bd09ll");// 返回的定位結果是百度經緯度,默認值gcj02
option.setScanSpan(10000);// 設置發起定位請求的間隔時間這里是10秒
option.setIsNeedAddress(true);// 返回的定位結果包含地址信息
option.setOpenGps(true);
mLocationClient.setLocOption(option);
// 注冊監聽函數
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(); // 該方法調用鷹眼軌跡上傳的接口。
} catch (Exception e) {
if (mLocationClient != null) {
mLocationClient.stop();
}
}
}
}); ? ? ? ? ? ? ? ? mLocationClient.start();?
}
第二個接口:獲取歷史軌跡
請求URI
http://api.map.baidu.com/trace/v2/track/gethistory
HTTP請求方式
GET
請求參數
| ak | 用戶的ak,授權使用 | string | 必須 |
| service_id | service唯一標識 | int | 必選 |
| start_time | 起始時間 | UNIX時間戳 | 必選 |
| end_time | 結束時間 | UNIX時間戳 | 必選。結束時間不超過當前時間,不能早于起始時間,且與起始時間差在24小時之內。 |
| entity_name | entity唯一標識 | string | 必選 |
| simple_return | 是否返回精簡的結果 | int | 可選,默認值是0,當設為1時,返回精簡結果。 |
| is_processed | 是否返回糾偏后軌跡 | int | 可選,默認值是0。0為返回原始軌跡,1為返回糾偏軌跡。注意:軌跡糾偏功能包括去噪、抽稀、綁路三個步驟,當is_processed=1時,默認僅進行去噪和抽稀處理,并不作綁路處理。若應用為車輛軌跡追蹤類型,需要開通綁路操作,可發郵件至:baiduyingyan@baidu.com,注明:ak、service_id和同時在線車輛數,申請開通。 |
| page_index | 分頁索引 | int(1到2^21-1)默認值為1 | 可選,與page_size一起計算從第幾條結果返回,代表返回第幾頁。 |
| page_size | 分頁大小 | int(1-5000)默認值為100 | 可選字段,返回結果最大個數與page_index一起計算從第幾條結果返回,代表返回結果中每頁有幾條記錄。 |
返回值
| status | 狀態碼 | ? | ? | |
| message | 響應信息 | string | 對status的中文描述 | |
| total | 忽略掉page_index,page_size后的軌跡點數量 | ? | 代表一共有多少條符合條件的track | |
| size | 返回的結果條數 | int | 代表本頁返回了多少條符合條件的軌跡點數量 | |
| distance | 此段軌跡的里程數,單位:米 | double | 符合條件的所有軌跡點的總里程。注意:是total個軌跡點的里程,和分頁及本頁顯示的size無關。 | |
| points | 歷史軌跡點列表 | ? | 當simple_return=0時,返回point全部字段信息; 當simple_return=1時,返回point信息將只包含 [longitude, latitude, loc_time,speed]字段; | |
| ? | location | 經緯度 | Array | 百度加密坐標 |
| ? | loc_time | 該track實時點的上傳時間 | UNIX時間戳 | 該時間為用戶上傳的時間 |
| ? | create_time | 創建時間 | 格式化時間 | 該時間為服務端時間 |
| ? | direction | 方向 | int | 范圍為[0,365],0度為正北方向,順時針 |
| ? | speed | 速度 | double | 單位:km/h |
| ? | radius | 定位精度 | double | 單位:m |
| ? | <column-key> | 自定義字段 | ? | 當用戶創建了track的自定義屬性,且在創該屬性賦有值,才會返回此字段。 |
該接口的entity_name就是你需要查詢的對象,page_size 默認是100,可以根據需要調大點。
start_time和end_time格式為UNIX時間戳,這要求將時間進行一下轉化,方法如下。
? ? /* 將字符串轉為時間戳 */
? ? 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且時間差不能超過24小時,否則請求會失敗,報參數錯誤。
接下來說下is_processed這個參數,如果不傳,默認的就是原始點記錄,如果傳1,百度會進行去燥,消除一些跑偏的點,使得軌跡看起來更加圓滑。
該接口的返回結果示例: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字段即可得到一個百度坐標點集合。然后調用如下兩個方法,即可畫出軌跡。
//劃線方法
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) {
}
}
}
//設置起點--終點
private void setMarkers(){
// mTrackList 坐標點集合
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]); // 經度
} catch (Exception e) {
// TODO: handle exception
}
// 添加起點 -- 百度糾偏后起點是最后一個點。
LatLng limit = new LatLng(mLatitude, mLongitude);
mBaiduMap.addOverlay(new MarkerOptions().position(limit)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.track_start)));// 起點的圖片
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
}
// 添加終點
LatLng limitstart = new LatLng(mLatitude, mLongitude);
mBaiduMap.addOverlay(new MarkerOptions().position(limitstart)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.track_finish)));// 終點的圖片
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(limitstart));
}
}
最后實現的效果圖:
總結
以上是生活随笔為你收集整理的Android 使用百度鹰眼实现运动轨迹功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用c语言if语句实现判断闰年
- 下一篇: 计算机学院创新基金项目题目,关于组织开展