高德地图之轨迹回放\巡航图(带进度条)

首先参考的是高德地图,两者均可实现。
轨迹回放
点标记的位移
巡航器移动
巡航器的位移
巡航器事件方法

巡航器的按钮方法

var navigBtnsConf = [{
            name: '开始巡航',
            action: 'start',
            enableExp: 'navgStatus === "stop" || navgStatus === "pause"'
        }, {
            name: '暂停',
            action: 'pause',
            enableExp: 'navgStatus === "moving"'
        }, {
            name: '恢复',
            action: 'resume',
            enableExp: 'navgStatus === "pause"'
        }, {
            name: '停止',
            action: 'stop',
            enableExp: 'navgStatus === "moving"'
        }, {
            name: '销毁',
            action: 'destroy',
            enableExp: 'navgExists'
        }];

问题:巡航器结束后,轨迹没有清空、巡航器没有回到初始位置。
解决:需要执行停止方法,清除路径。巡航器重新定位

this.navgControl('stop') // 停止
this.navg1.moveToPoint(0, 0); // 移动巡航器到初始位置0,0

问题:点击列表的点,对应巡航器到达指定经纬度,路线。
解决:列表显示的点,与生成的巡航器的节点一一对应,只要对应序号即可

问题:自定义巡航器图片失败
解决:

import imgUrl from '../../assets/daohang.png'
 let image = PathSimplifier.Render.Canvas.getImageContent(imgUrl, onload, onerror)

问题:进度条播放时间和总时间
解决:

// 总时间
      var dis = AMap.GeometryUtil.distanceOfLine(this.lineArr); // 总路程 米
      this.Times = parseInt((dis / 1000 / 200) * 60 * 60); // 计算总时间
      this.totalTime = this.secondToTimeStr(this.Times)
// 进度条变化,时间变化
          that.movedTime = parseInt(that.Times * (that.sliderVal / 100))
          that.passedTime = that.secondToTimeStr(that.movedTime)

问题:巡航器播放完成,进度条实际没有完全播放
问题:巡航器播放速度不是匀速,会出现个别点位移太快、太慢
问题:巡航器节点之间距离太短,对应进度条 移动过快。如下对比图:84、90。
分析:三个问题都是同一错误引起的。应该滑块赋值,其本身赋值为(idx+tail),只考虑百分比,没有考虑节点之间距离的问题,所以不能按照节点比例来计算。只能按照距离

that.sliderVal = (totalIdx / len) * 100

在这里插入图片描述
在这里插入图片描述

getMovedDistance()
// 返回巡航经过的距离(起始节点到当前位置),单位米;stop后会重置为0

使用巡航器位移的距离,可以做到对应。但这个得从开始到结束,点无法对应行驶的距离

// 开始到结束,中间没有暂停移动滑块
that.navg1._movedDist = this.getMovedDistance() - that.navg1._startDist; // 现在-开始

最后找到解决办法:

that.navg1._movedDist = this.getMovedDistance() // 巡航器移动距离
// 进度条实时展示tail
!that.isOnSlider && (that.sliderVal = (that.navg1._movedDist / dis) * 100); // 对应进度条滑块值

这里用到 this.getMovedDistance()只是记录:开始0——移动——结束才为0,所以在滑块改变方法中调用stop来清空this.getMovedDistance()。
通过打印能够清楚的看到滑块移动后执行的方法
在这里插入图片描述

// 滑块改变位置
    sliderChange (val) {
      if (this.beforeInit) {
        return
      }
      this.navgControl('stop')
      this.navgControl('start')
      this.navgControl('pause') // 此时清空this.getMovedDistance(),状态改为 暂停this.palyStatus = 1
      // 先改为播放状态
      if (this.palyStatus === 0) {
        this.navgControl('start')
        this.navgControl('pause')
      }
      // 滑块值改变,移动巡航器
      let newVal = typeof (newVal) === 'number' ? val : this.sliderVal // 判断滑块值,赋值
      // console.log(newVal, '滑块值')
      var dis = AMap.GeometryUtil.distanceOfLine(this.lineArr); // 总路程 米
      let num = (newVal / 100) * dis // 滑块移动的总距离
      // console.log(num, '移动滑块距离')
      this.navg1.moveByDistance(num) // 将巡航器移动指定的距离,单位米
      this.pathSimplifierIns.renderLater();
    },

问题:采用表格搜索的方式绘制巡航器、巡航线,前一个搜索条件的线无法清除,导致两个线叠加
解决:

this.pathSimplifierIns.setData() // 设定数据源数组,并触发重新绘制。data为空时将清除显示内容。 

在这里插入图片描述

到这里文章就结束了,其实是一个很简单的实现过程,认真看Api文档就能够实现,但是前前后后试了5、6种实现方法花了两周的时间。总结来说,整理好思路这个才是最重要的。
演示图:
在这里插入图片描述

在这里插入图片描述

参考代码:(ps:用的是节点定位,所以定位不适用)
https://blog.csdn.net/weixin_40579884/article/details/89675275?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.highlightwordscore&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.highlightwordscore

https://www.codetd.com/article/11454469

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于Vue 3和高德地图轨迹回放,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Vue 3和高德地图的相关依赖。你可以使用npm或yarn来安装这些依赖。例如,在你的Vue项目中,可以运行以下命令来安装高德地图的依赖: ``` npm install vue-amap ``` 2. 在你的Vue组件中,引入Vue AMap库并注册该组件: ```javascript import VueAMap from 'vue-amap'; export default { ... mounted() { Vue.use(VueAMap); VueAMap.initAMapApiLoader({ key: 'your_amap_key', plugin: ['AMap.Polyline'] }); }, ... } ``` 在上述代码中,你需要将`your_amap_key`替换成你自己的高德地图API密钥。 3. 在模板中添加地容器和控件: ```html <template> <div> <amap :zoom="13" :center="[lng, lat]"> <amap-polyline :path="path" :visible="true" :style="{ strokeColor: 'red', strokeWeight: 6 }"></amap-polyline> </amap> </div> </template> ``` 在上述代码中,`amap`是地容器组件,`amap-polyline`是轨迹回放的折线组件。你可以根据需要调整地的缩放级别和中心点位置,以及折线的样式。 4. 在组件的`data`属性中定义轨迹回放的经纬度数据: ```javascript data() { return { lng: 116.397428, lat: 39.90923, path: [ [116.405289, 39.904987], [116.406089, 39.904987], [116.406289, 39.905087], // 更多经纬度数据... ] }; } ``` 你需要根据实际情况提供正确的经纬度数据。 5. 最后,你可以根据需求实现轨迹回放的逻辑。例如,你可以使用定时器来逐步显示折线上的点,实现轨迹的动态回放效果。 这样,你就可以在Vue 3中使用高德地图实现轨迹回放了。记得根据你的实际需求进行相应的调整和扩展。希望这能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值