【出人意料】一种基于Vue2监听器(watch)和定时器(setInterval)的轨迹播放方法实现方案

news2024/11/20 9:16:48

1、需求

数据库中有设备的经纬度记录,前端需要实现从数据库中取到数据后在地图上显示轨迹,显示轨迹的方式就是一个一个点地有序显示。点与点之间用线段连接,最终构成一条轨迹线。

2、场景过程

  1. 前端定义一个播放暂停按钮;
  2. 点击播放时,定时器开启;
  3. 播放阶段,每隔1秒打一个坐标锚点,超过1个点时,点与点之间进行线段连接;
  4. 点击暂停时,停止打点和绘制线段;
  5. 再点击播放时,接着上述暂停时的锚点继续开始新的坐标锚点绘制和线段绘制;
  6. 播放完数据,停止打点和线段绘制。

在这里插入图片描述

3、实现思路

旧的实现思路,采用定时器的开启、暂停来实现,找了相关资料,未发现有很好的例子。

基于Vue2,考虑到其带有监听器的功能,如果监听打点数的数值发生变化,就往地图上赛锚点和线段。岂不是一种简约的实现方式。

4、实现代码

<template>

  <div style="width: 100%; height: 100%">
    <!-- 工具条   -->
    <div class="map_box">
      <el-form :inline="true" :model="form">
          <el-button @click="onStart" :type=" isStart ? 'success':'primary'" >
            <svg-icon :icon-class="isStart ? 'stop':'start'" />
          </el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 地图   -->
    <div class="amap-container">
      <el-amap view-mode="3D" :center="center" :zoom="zoom" map-style="amap://styles/d6bf8c1d69cea9f5c696185ad4ac4c86">

        <!--轨迹 -->
        <el-amap-polyline :editable="polyline.editable"
                          :visible="polyline.visible"
                          :stroke-weight="2"
                          :stroke-color="polyline.strokeColor"
                          :draggable="polyline.draggable"
                          :path="polyline.path"></el-amap-polyline>

        <!--标注 -->
        <el-amap-layer-labels>
          <el-amap-label-marker v-for="(marker, index) in markers"
                                :key="index"
                                :visible="true"
                                :position="marker.position"
                                :text="marker.text"
                                :icon="marker.icon"></el-amap-label-marker>
        </el-amap-layer-labels>

      </el-amap>
    </div>
  </div>

</template>

<script>

export default {
  data(){
    return{
      center: [105.602725,37.076636],
      zoom:5,
      pointData:[],
      markers:[],
      polyline:{
        editable: false,
        visible: false,
        draggable: false,
        path:[],
        strokeColor: "#f10303"
      },
      isStart: false,
      isPause: true,
      playTimer: null,
      playCount:1,
      playSpeed: 500
    }
  },
  created() {
  },
  methods:{
    getData(){
    //this.pointData数据源
    },
    //计时打点
    addMarker(){
      //只有一个点打点后结束
      if (this.isPause){
        let marker = this.pointData[this.playCount - 1]
        //锚点打点
        this.markers.push(marker)
        this.center = marker.position
        //轨迹打点
        this.polyline.path.push(marker.position)
        this.polyline.visible = true
        //缩放地图倍数
        this.zoom = 14
        this.isPause = false
      }

      if (this.pointData.length === 1){
        return false
      }
      //开启计时器
      if (this.pointData.length > 1){
        let that = this
        this.playTimer = setInterval(()=>{
          that.playCount++
        },this.playSpeed)
      }
    },
    onStart(){
      this.isStart = !this.isStart
      if (this.isStart){
      	//加载一次数据
        if (this.isPause){
          this.getData()
        }
        this.addMarker()
      }else {
        //清除计时器
        if (this.playCount <= this.pointData.length){
          clearInterval(this.playTimer)
          this.playTimer = null
          this.tableScroll()
        }
      }
    }
  },
  watch:{
    playCount: {
      handler(newValue, oldValue) {
      
        if (newValue > this.pointData.length) {
          clearInterval(this.playTimer)
          this.playTimer = null
          this.isPause = true
          
        } else {
          let position = this.pointData[newValue - 1].position
          this.markers.push(this.pointData[newValue - 1])
          this.polyline.path.push(position)
          this.center = position
        }
      }
    }
  }
}
</script>

<style  scoped>
/deep/ .amap-container{
  width: 100%;
  height: 100%;
  top: 0.5%;
  bottom: 0.5%;
  border-radius: 15px;
}
.map_box{
  position: absolute;
  top: 1.5%;
  right: 0.5%;
  z-index: 66666;
}

.table-class{
  position: absolute;
  top: 12%;
  right: 1%;
  z-index: 66666;
}

</style>


5、思考

  1. 做功能时,尽量使用已有的功能,借助基础力量达到四两拨千斤的作用;
  2. 多思考Vue2的框架的特点,结合特点进行使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flutter】【package】auto_size_text 文字自动适配大小

文章目录前言一、auto_size_text 是什么&#xff1f;二、使用1.简单的使用2.参数说明3.group4.rich text总结前言 auto_size_text &#xff1a;https://pub.flutter-io.cn/packages/auto_size_text 一、auto_size_text 是什么&#xff1f; 第三方的插件&#xff0c;能够自动适…

DDD的落地,需要基础设施的大力支持

1. 概览 对于复杂业务&#xff0c;DDD 绝对是一把神器&#xff0c;由于它过于复杂&#xff0c;很多人望而却步。因为太过严谨&#xff0c;形成了很多设计模式、规范化流程&#xff0c;这些爆炸的信息已经成为 DDD 落地的重大阻力。 但&#xff0c;如果我们将这些规范化的流程…

1.4_28 Axure RP 9 for mac 高保真原型图 - 案例27【中继器 - 后台管理系统5】功能-弹窗修改数据

相关链接 目录Axure中文学习网AxureShopAxureShop-QA 案例目标1. 了解使用中继器&#xff0c;弹窗修改数据的实现方式 一、成品效果 Axure Cloud 案例27【中继器 - 后台管理系统5】功能-弹窗修改数据 版本更新一、修改功能   1.1 点击修改按钮&#xff0c;标记该条数据&am…

国产软件Bigemap与国产在线地图源<星图地球数据云>推动国内新GIS应用

自星图地球数据云(GEOVIS Earth Datacloud)图源成为国产基础软件Bigemap的在线地图数据服务平台之一以来&#xff0c;其日均地图瓦片请求调用量目前已经超过2亿。 “星图地球数据云"是中科星图(股票代码[688568])旗下子公司——星图地球倾力打造的在线时空数据云服务平台…

基于约束的装配设计【CadQuery】

本教程介绍在CadQuery中如何使用装配约束功能来构建逼真的模型&#xff0c;我们将组装一个由 20x20 V 型槽型材制成的门组件。 1、定义参数 我们希望从定义模型参数开始&#xff0c;以便以后可以轻松更改尺寸&#xff1a; import cadquery as cq# Parameters H 400 W 200…

2.8 高收藏率小红书笔记怎么写?试一试这7类方法吧【玩赚小红书】

1、教程攻略类 ​ ​ ​ 打开任何一类的美妆产品&#xff0c;最常见的就是各类妆容教程和变美攻略。就拿教程最多的眼妆来说吧&#xff0c;很多女孩子都觉得眼妆很难画好。 如果是碰到网上流行的网红眼影&#xff0c;比如什么猫眼妆、截断式眼影、桃花眼影等等。 【 高收藏秘…

社区团购小程序制作有什么优势_ 社区团购小程序的作用

打造属于自身的独立小程序拥有更高的自主性&#xff0c;特别是基于得店小程序的创新产品力&#xff0c;从设计上彰显品牌理念&#xff0c;到功能上进行扩展拓宽营销方式&#xff0c;都完全自我掌控&#xff0c; ● 更重要的是&#xff0c;相比于平台上各种复杂的机制&#xff0…

点击化学接头BCN-endo-PEG15-NH2,endo-BCN-十五聚乙二醇-胺

&#xff08;本品应密封避光&#xff0c;储存于阴凉&#xff0c;干燥&#xff0c;通风处&#xff0c;取用一定要干燥&#xff0c;避免频繁的溶解和冻干&#xff09; 【产品理化指标】&#xff1a; CAS&#xff1a;N/A 化学式&#xff1a;C43H80N2O17&#xff0c;分子量&#xf…

Vue3+TS+Vite 搭建组件库记录

使用pnpm 安装 npm install pnpm -g初始化package.json pnpm init新建配置文件 .npmrc shamefully-hoist true这里简单说下为什么要配置shamefully-hoist。 如果某些工具仅在根目录的node_modules时才有效&#xff0c;可以将其设置为true来提升那些不在根目录的node_modu…

防火墙安全策略

目录 一、包过滤技术 包过滤 安全策略 安全策略的原理 安全策略分类 二、防火墙的转发原理&#xff08;重点&#xff09; 首包流程 会话表 状态检测机制 会话在转发流程中的位置 多通道协议技术 ASPF 端口识别对多通道协议的支持 分片缓存 三、防火墙的安全策略配…

万应案例精选|跨壁垒、辅决策,万应低代码助力国网电力内部培训数字化架构升级

万应案例精选&#xff5c;跨壁垒、辅决策&#xff0c;万应低代码助力国网电力内部培训数字化架构升级一、项目背景 国网某省电力有限公司&#xff08;下称“国网电力”&#xff09;&#xff0c;是国家电网有限公司的全资子公司&#xff0c;现设20个职能部门&#xff0c;下设16…

智慧法院解决方案-最新全套文件

智慧法院解决方案-最新全套文件一、建设背景二、架构思路三、建设方案四、获取 - 智慧法院全套最新解决方案合集一、建设背景 智慧法院是指充分运用互联网、云计算、大数据、人工智能等技术&#xff0c;促进审判体系与审判能力现代化&#xff0c;实现人民法院 高度智能化的运行…

Java基础—普通阻塞队列

普通阻塞队列 除了刚介绍的两个队列&#xff0c;其他队列都是阻塞队列&#xff0c;都实现了接口BlockingQueue&#xff0c;在入队/出队时可能等待&#xff0c;主要方法有&#xff1a; 入队&#xff0c;如果队列满&#xff0c;等待直到队列有空间 void put(E e) throws Inter…

计算机毕业设计Python+Django的银行取号排队系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

MySQL之短时间提高性能的措施

文章目录前言短连接风暴慢查询QPS&#xff08;每秒查询数&#xff09;突增总结前言 我们在使用数据库的时候&#xff0c;总会有那么一段时间&#xff0c;数据库的压力会特别大。比如&#xff0c;用户的使用的高峰期&#xff0c;或者活动上线的时候等等。那么为了应对突然暴增的…

Child Tuning: 反向传播版的Dropout

这篇文章主要是对EMNLP2021上的论文Raise a Child in Large Language Model: Towards Effective and Generalizable Fine-tuning进行讲解。论文标题有些抽象&#xff0c;但是用作者的话来说&#xff0c;这篇论文的思想可以归结为两个词&#xff1a;Child Tuning 虽然这篇文章主…

0-1背包问题

在将什么是0-1背包问题前&#xff0c;先来看下面一道例题&#xff1a; 题意概要&#xff1a;有 n 个物品和一个容量为 W 的背包&#xff0c;每个物品有重量w i和价值v i两种属性&#xff0c;要求 选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容…

京东一小伙一年输出20篇专利,其实你也可以

前言&#xff1a; ☆ 本文属于技术总结类干货分享&#xff0c;是实战但又不同于实战&#xff0c;所以不能保证每位同学读后都可以立马自己也输出一篇合格的专利&#xff1b; ☆ 但通过本文的总结分享&#xff0c;已经帮身边同学半年内输出大于100篇专利&#xff0c;所以如果你细…

【字母识别】基于matlab BP神经网络英文字母识别【含Matlab源码 2226期】

⛄一、BP神经网络英文字母识别 1 典型前向网络——BP神经网络 前向网络是目前研究最多的网络形式之一, 它包含输入层、隐层以及输出层, 其中隐层可以为一层或者多层 , 其结构如图1所示. 图1 BP神经网络模型 BP神经网络误差反向传播学习算法的基本思想如下:向网络提供训练例子…

智慧公路筑基者!天翼云打造全栈能力新底座

11月9日-11日&#xff0c;在第十七届中国智能交通年会&#xff08;ITSAC 2022&#xff09;暨2022中国智能交通大会上&#xff0c;中国电信作为本届大会特别支持单位&#xff0c;于11月10日成功举办了主题为“构建智慧公路全栈能力新底座”的运营商赋能智慧交通创新论坛。 交通运…