每天记录学习的新知识:高德地图历史轨迹和纠偏

历史轨迹代码参考自:官方demo:AMap3DDemo. (PolylineActivity)

高德地图纠偏地址:https://lbs.amap.com/api/android-sdk/guide/draw-on-map/track-sdk/

业务流程

取自TSP的GPS数据,在APP端要进行轨迹纠偏,纠偏后的坐标点,进行路线描画。

代码部分

1.首先,将TSP返回的点数据,进行类型转换,需要的详细如下,只有包含如下轨迹纠偏才更准确:

在这里插入图片描述

2.将多余的点去重

同样的坐标点会影响纠偏结果

3.时间点排序

以上三点可以保证纠偏的准确率

    private void trace(List<GpsBean> gpsBeanList) {

        if (DataUtil.isListNotEmpty(gpsBeanList)) {
            Observable.fromIterable(gpsBeanList)
                    .map(new Function<GpsBean, TraceLocation>() {
                        @Override
                        public TraceLocation apply(GpsBean gpsBean) throws Exception {

                            TraceLocation traceLocation = new TraceLocation();

                            if (gpsBean != null) {

                                if (RegexUtils.isDouble(gpsBean.getLon()) && RegexUtils.isDouble(gpsBean.getLat())) {
                                    double var1 = Double.valueOf(gpsBean.getLon());
                                    double var3 = Double.valueOf(gpsBean.getLat());
                                    traceLocation.setLongitude(var1);
                                    traceLocation.setLatitude(var3);
                                } else {
                                    traceLocation.setLongitude(0);
                                    traceLocation.setLatitude(0);
                                }

                                if (RegexUtils.isDouble(gpsBean.getSpeed())) {
                                    float var1 = Float.valueOf(gpsBean.getSpeed());
                                    traceLocation.setSpeed(var1);
                                } else {
                                    traceLocation.setSpeed(0);
                                }

                                if (RegexUtils.isDouble(gpsBean.getHead())) {
                                    float var1 = Float.valueOf(gpsBean.getHead());
                                    traceLocation.setBearing(var1);
                                } else {
                                    traceLocation.setBearing(0);
                                }

                                traceLocation.setTime(DateUtils.parseTimeMillis(gpsBean.getTime()));
                            }
                            return traceLocation;
                        }
                    }).observeOn(Schedulers.io())
                    .distinct(new Function<TraceLocation, String>() {
                        @Override
                        public String apply(TraceLocation traceLocation) throws Exception {
                            return String.valueOf(traceLocation.getTime()) +
                                    traceLocation.getLatitude() +
                                    traceLocation.getLongitude() +
                                    traceLocation.getSpeed() +
                                    traceLocation.getBearing();
                        }
                    })
                    .toSortedList(new Comparator<TraceLocation>() {
                        @Override
                        public int compare(TraceLocation o1, TraceLocation o2) {
                            if (o1.getTime() > o2.getTime()) {
                                return 1;
                            } else if (o1.getTime() < o2.getTime()) {
                                return -1;
                            } else {
                                return 0;
                            }
                        }
                    })
                    .subscribeOn(AndroidSchedulers.mainThread())
                    .subscribe(new SingleObserver<List<TraceLocation>>() {
                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        @Override
                        public void onSuccess(List<TraceLocation> traceLocations) {
                            LogUtils.i(TAG, "traceLocations ===" + new Gson().toJson(traceLocations));
                            LogUtils.i(TAG, "traceLocations ===" + traceLocations.size());
                            if (traceLocations.size() == 1) {
                                List<LatLng> latLngs = new ArrayList<>();
                                latLngs.add(new LatLng(traceLocations.get(0).getLatitude(), traceLocations.get(0).getLongitude()));
                                addPolylinesWithColors(latLngs);
                            } else {
                                mTraceClient.queryProcessedTrace(lineID, traceLocations, LBSTraceClient.TYPE_AMAP, HistoricalScoreDetailActivity.this);
                            }
                        }

                        @Override
                        public void onError(Throwable e) {

                        }
                    });
        } else {
            LogUtils.e(TAG, "列表是空");
        }
    }

4.轨迹纠偏的回调有如下,三个

	//轨迹纠偏失败回调。
   @Override
    public void onRequestFailed(int i, String s) {
        LogUtils.i(TAG, "onRequestFailed i ===" + i);
        if (lineID == i) {
			//当传入的轨迹点数据出现以下几种情况,会因为参数错误导致纠偏失败,进入 onRequestFailed 回调。
			//网络不连通。
			//原始轨迹数据只有1个点。
        }

    }

    @Override
    public void onTraceProcessing(int i, int i1, List<LatLng> list) {
        LogUtils.i(TAG, "onTraceProcessing i ===" + i);
        if (lineID == i) {

        }
    }

    @Override
    public void onFinished(int i, List<LatLng> list, int i1, int i2) {
        LogUtils.i(TAG, "onFinished i ===" + i);
        if (lineID == i) {
            addPolylinesWithColors(list);
        }
    }

5.在轨迹纠偏结束时,onFinished()方法会被调用,参考官方demo

    private void addPolylinesWithColors(List<LatLng> list) {

        LogUtils.i(TAG, "addPolylinesWithColors");

        if (!DataUtil.isListNotEmpty(list)) {
            LogUtils.e(TAG, "路线纠偏后,列表是null");
            return;
        }

        List<LatLng> markers = new ArrayList<>();

        markers.add(list.get(0));

        if (list.size() > 1) {
            markers.add(list.get(list.size() - 1));
        }

        //用一个数组来存放颜色,四个点对应三段颜色
        List<Integer> colorList = new ArrayList<Integer>();
        colorList.add(getResources().getColor(R.color.app_blue));

        PolylineOptions options = new PolylineOptions();
        options.width(10);//设置宽度
        options.addAll(list);
        //加入对应的颜色,使用colorValues 即表示使用多颜色,使用color表示使用单色线
        options.colorValues(colorList);

        aMap.addPolyline(options);

        markerModel.setMarker(markers);

        NaviTools.zoomToSpan2(aMap, list, 100);
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风徐来辽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值