关闭

Android 使用百度鹰眼实现运动轨迹功能

1995人阅读 评论(1) 收藏 举报
分类:

鹰眼轨迹是百度开放平台最新推出的一套高性能轨迹存储和查询服务。百度已做好如此强大的功能,我们岂能不用。

使用鹰眼轨迹,一种方法是完全集成百度鹰眼轨迹的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));
}
}

最后实现的效果图:

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49307次
    • 积分:1974
    • 等级:
    • 排名:千里之外
    • 原创:83篇
    • 转载:29篇
    • 译文:66篇
    • 评论:6条
    文章分类
    最新评论