android-百度地图:鹰眼轨迹的实时绘制

一、SDK准备

智能穿戴、外卖路径……随着网络应用在生活的方方面面,人们需要实时了解自己的位置和行进路线等信息。百度鹰眼是一套轨迹追踪开放服务,开发者在终端集成鹰眼SDK 后,可同时管理并追踪数千万终端设备的轨迹,适用于车队管理、共享出行、外勤人员管理、智能穿戴等领域。在百度鹰眼之前,大家一直使用百度定位和百度定位的绘制覆盖物,示例代码如下:

 private void drawTrackLine(BDLocation location) {
        TrackLine trackLine = new TrackLine();
        dot = new LatLng(location.getLatitude(), location.getLongitude());
        if (startTrack == true) {
            line.add(dot);
            if (line.size() == 1) {
                // 这里绘制起点
                drawStart(line);
                if (isPause != true) {
                    ToastUtils.showToastCentre(ClubTrackActivity.this,"轨迹已开启");
                }

            } else if (line.size() > 3) {
                points_tem = line.subList(line.size() - 2, line.size());
                dis = getDistance(line.get(line.size() - 1).longitude, line.get(line.size() - 1).latitude,
                        line.get(line.size() - 3).longitude, line.get(line.size() - 3).latitude);
                allDis += (dis / 3);

                if (line.size() % 5 == 0) {
                    saveTrackLine(trackLine);
                }
                options = new PolylineOptions().color(0xfe12b7f5).width(10)
                        .points(points_tem);
                mBaiduMap.addOverlay(options);
            }
        }
    }

当然现在不会使用这种方法来实现轨迹的绘制,百度鹰眼地图已经把相关需求集成到SDK,开发者直接调用API就可以实现相关功能。
注意:使用百度鹰眼功能需要良好的网络环境并且在轨迹绘制过程中要保持网络连接,如果网络中断,绘制过程也会中断。而第一种方式可以做本地缓存,没有连网也可以绘制轨迹,但是实现方式以及优化比较困难。如果需要的话可以去我以前的博客看一下:百度地图:定位,轨迹,白板,加载崩溃,定位到非洲

1.1 鹰眼地图简介

现在鹰眼地图提供的功能如下,具体简介可以查看官网简介:
android-百度地图:鹰眼轨迹的实时绘制_第1张图片

1.2 SDK下载

鹰眼地图提供了sdk以及demo,sdk下载地址:鹰眼SDK传送门。sdk解压以后直接放到libs中就可以使用了,但是demo的编译环境为eclipse。如果需要studio环境的可以在文章尾部下载。

1.3 AK申请

使用鹰眼地图sdk需要申请新的AK,申请流程和百度地图定位sdk的情况差不多。AK申请跳转链接: 传送门
申请页面如下:
android-百度地图:鹰眼轨迹的实时绘制_第2张图片
我们在申请AK界面看到:
应用类型选择 Android SDK
启用服务可以 根据自己的需要进行勾选
而发布版SHA1和开发版SHA1需要 在控制台输入指令得到

1.3.1 获取SHA1

先在桌面打开控制台,如下图所示:
android-百度地图:鹰眼轨迹的实时绘制_第3张图片

  • 在控制台输入括号中的指令 [cd .android]找到.android,效果如下图所示
    android-百度地图:鹰眼轨迹的实时绘制_第4张图片

  • 在控制台输入括号中的指令 [keytool -list -v -keystore debug.keystore]获取开发版SHA1(系统默认秘钥:android),效果如下图所示
    android-百度地图:鹰眼轨迹的实时绘制_第5张图片

    注:debug.keystore为studio默认的keystore

  • 在控制台输入括号中的指令 [keytool -list -v -keystore keystore的路径]获取发布版SHA1,效果如下图所示
    android-百度地图:鹰眼轨迹的实时绘制_第6张图片

    注:keystore为你的App打包发布keystore。所以再生成发布版SHA1前需要先生成keystore。关于studio生成keystore.jks,不懂得自行百度,这里就不说了。

注:1.生成开发版SHA1和发布版SHA1是需要输入密钥,直接回车键就可以了。
2.生成发布版SHA1时直接将keystore.jks拖入控制台就可以了,不需要在手动输入路径,效果图如下:

android-百度地图:鹰眼轨迹的实时绘制_第7张图片

  • 在申请AK界面输入SHA1,提交后直接生成AK,效果如下:
    android-百度地图:鹰眼轨迹的实时绘制_第8张图片

1.3.2 相关bug

bug现象:如果你的Demo编译到手机,但是百度地图只展示网格而且没有其他问题。
bug原因:可能你的AK值输入的不对
解决方法:重新输入AK值或者重新申请AK值。

1.4 创建鹰眼服务

使用鹰眼sdk不仅需要AK,还需要创建鹰眼服务用于轨迹记录和分析。创建鹰眼服务的链接:传送门。
这里写图片描述

二、配置SDK

  • 在build.gradle中配置SO文件的使用,如下所示:
sourceSets {
    main {
        jniLibs.srcDir 'libs'
    }
} 

注意:鹰眼SDK的JAR包和SO文件版本号保持一致,如JAR包名称是BaiduTraceSDK_v3_0_1.jar,则SO文件名称是libBaiduTraceSDK_red|v3_0_1.so, 因此,如果更新了JAR包,则需要一并更新SO文件。

  • 声明SERVICE组件
    在Application标签中声明SERVICE组件,每个APP拥有自己独立的鹰眼追踪service:
<service 
      android:name="com.baidu.trace.LBSTraceService" 
      android:enabled="true"
      android:process=":remote"> 
service>
  • 声明使用权限
 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">uses-permission> 
 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">uses-permission> 

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">uses-permission> 
 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">uses-permission> 

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE">uses-permission>
 
<uses-permission android:name="android.permission.READ_PHONE_STATE">uses-permission> 
 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">uses-permission>

<uses-permission android:name="android.permission.INTERNET">uses-permission> 

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">uses-permission>

<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS">uses-permission>

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS">uses-permission>
  • 设置AccessKey
    在Mainfest.xml正确设置AccessKey(AK):
"com.baidu.lbsapi.API_KEY"             
android:value="AK" />       //key:开发者申请的Key
  • 设置轨迹服务ID
    在TrackApplication中设置轨迹服务ID:
/**
 * 轨迹服务ID
 */
public long serviceId = id;//这里是申请的鹰眼服务id

三、轨迹的实时绘制

- **方案一:在位置监听接口实时绘制轨迹**
            @Override
            public void onLatestPointCallback(LatestPointResponse response) {
                //经过服务端纠偏后的最新的一个位置点,回调
                try {
                    if (StatusCodes.SUCCESS != response.getStatus()) {
                        return;
                    }

                    LatestPoint point = response.getLatestPoint();
                    if (null == point || CommonUtil.isZeroPoint(point.getLocation().getLatitude(), point.getLocation()
                            .getLongitude())) {
                        return;
                    }

                    LatLng currentLatLng = mapUtil.convertTrace2Map(point.getLocation());
                    if (null == currentLatLng) {
                        return;
                    }

                    if (firstLocate) {
                        firstLocate = false;
                        Toast.makeText(TracingActivity.this, "起点获取中,请稍后...", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    //当前经纬度
                    CurrentLocation.locTime = point.getLocTime();
                    CurrentLocation.latitude = currentLatLng.latitude;
                    CurrentLocation.longitude = currentLatLng.longitude;

                    if (trackPoints == null) {
                        return;
                    }
                    trackPoints.add(currentLatLng);
//                    endTime = CommonUtil.getCurrentTime();
//                    ToastUtils.showToastBottom(TracingActivity.this, "差值:" + (endTime - startTime));
//                    queryHistoryTrack();
                    mapUtil.drawHistoryTrack(trackPoints, false, mCurrentDirection);//时时动态的画出运动轨迹
                } catch (Exception x) {

                }
            }

可以实时绘制,但是问题是绘制的轨迹会由于定位问题轨迹不美观而且误差较大。

  • 方案二:在定位监听接口查询历史轨迹,通过历史轨迹绘制
            @Override
            public void onLatestPointCallback(LatestPointResponse response) {
                //经过服务端纠偏后的最新的一个位置点,回调
                try {
                    if (StatusCodes.SUCCESS != response.getStatus()) {
                        return;
                    }

                    LatestPoint point = response.getLatestPoint();
                    if (null == point || CommonUtil.isZeroPoint(point.getLocation().getLatitude(), point.getLocation()
                            .getLongitude())) {
                        return;
                    }

                    LatLng currentLatLng = mapUtil.convertTrace2Map(point.getLocation());
                    if (null == currentLatLng) {
                        return;
                    }

                    if (firstLocate) {
                        firstLocate = false;
                        Toast.makeText(TracingActivity.this, "起点获取中,请稍后...", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    //当前经纬度
                    CurrentLocation.locTime = point.getLocTime();
                    CurrentLocation.latitude = currentLatLng.latitude;
                    CurrentLocation.longitude = currentLatLng.longitude;

                    if (trackPoints == null) {
                        return;
                    }
                    trackPoints.add(currentLatLng);
                    endTime = CommonUtil.getCurrentTime();
                    ToastUtils.showToastBottom(TracingActivity.this, "差值:" + (endTime - startTime));
                    queryHistoryTrack();
//                    mapUtil.drawHistoryTrack(trackPoints, false, mCurrentDirection);//时时动态的画出运动轨迹
                } catch (Exception x) {

                }
            }

可以通过查询历史轨迹筛选有价值的轨迹点进行绘制。

/**
     * 查询历史轨迹
     */
    private void queryHistoryTrack() {

        historyTrackRequest = new HistoryTrackRequest();
        ProcessOption processOption = new ProcessOption();//纠偏选项
        processOption.setRadiusThreshold(50);//精度过滤
        processOption.setTransportMode(TransportMode.walking);//交通方式,默认为驾车
        processOption.setNeedDenoise(true);//去噪处理,默认为false,不处理
        processOption.setNeedVacuate(true);//设置抽稀,仅在查询历史轨迹时有效,默认需要false
        processOption.setNeedMapMatch(true);//绑路处理,将点移到路径上,默认不需要false
        historyTrackRequest.setProcessOption(processOption);
        trackApp.initRequest(historyTrackRequest);
        /**
         * 设置里程补偿方式,当轨迹中断5分钟以上,会被认为是一段中断轨迹,默认不补充
         * 比如某些原因造成两点之间的距离过大,相距100米,那么在这两点之间的轨迹如何补偿
         * SupplementMode.driving:补偿轨迹为两点之间最短驾车路线
         * SupplementMode.riding:补偿轨迹为两点之间最短骑车路线
         * SupplementMode.walking:补偿轨迹为两点之间最短步行路线
         * SupplementMode.straight:补偿轨迹为两点之间直线
         */
        historyTrackRequest.setSupplementMode(SupplementMode.no_supplement);
        historyTrackRequest.setSortType(SortType.asc);//设置返回结果的排序规则,默认升序排序;升序:集合中index=0代表起始点;降序:结合中index=0代表终点。
        historyTrackRequest.setCoordTypeOutput(CoordType.bd09ll);//设置返回结果的坐标类型,默认为百度经纬度

        /**
         * 设置是否返回纠偏后轨迹,默认不纠偏
         * true:打开轨迹纠偏,返回纠偏后轨迹;
         * false:关闭轨迹纠偏,返回原始轨迹。
         * 打开纠偏时,请求时间段内轨迹点数量不能超过2万,否则将返回错误。
         */
        historyTrackRequest.setProcessed(true);

        historyTrackRequest.setServiceId(trackApp.serviceId);//设置轨迹服务id,Trace中的id
        historyTrackRequest.setEntityName(trackApp.entityName);//Trace中的entityName

        /**
         * 设置startTime和endTime,会请求这段时间内的轨迹数据;
         * 这里查询采集开始到采集结束之间的轨迹数据
         */
        historyTrackRequest.setStartTime(startTime);
        historyTrackRequest.setEndTime(endTime);
        historyTrackRequest.setPageIndex(pageIndex);
        historyTrackRequest.setPageSize(Constants.PAGE_SIZE);
        trackApp.mClient.queryHistoryTrack(historyTrackRequest, trackListener);//发起请求,设置回调监听

    }

暂时分享鹰眼轨迹实时绘制,至于实现方案要综合考量。希望可以帮你解决问题。
如果需要demo,可以点击传送门:eagleDemo

你可能感兴趣的:(android-第三方框架,android开发利器)