VUE3+TS+element UI +高德地图实现轨迹回放带进度条

这篇具有很好参考价值的文章主要介绍了VUE3+TS+element UI +高德地图实现轨迹回放带进度条。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录一下,由于项目需要做车辆的历史轨迹回放,查了很多资料,在高德地图里有这几种解决方案。

所用技术:vue3 + TS +element UI plus +高德地图

 这是相关的Demo借鉴

高德地图的轨迹回放demo

轨迹巡航器控制

高德地图Amap UI

下面是效果图:

1,这是高德地图提供的轨迹回放demo

VUE3+TS+element UI +高德地图实现轨迹回放带进度条

 2,这是使用的高德地图AMap UI的巡航器

VUE3+TS+element UI +高德地图实现轨迹回放带进度条

 讲一下实现方法

1,轨迹回放的有两种写法,第一个是初始化加载的时候就把监听事件放进去


const initMap = () => {
  AMapLoader.load({
    key: "key", // 申请好的Web端开发者Key,首次调用 load 时必填
    version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
    plugins: ["AMap.moveAnimation"], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    AMapUI: {
      // 是否加载 AMapUI,缺省不加载
      version: "1.1", // AMapUI 版本
      plugins: [], // 需要加载的 AMapUI ui插件
    },
  })
    .then((AMap) => {
      const map = new AMap.Map("container", {
        //设置地图容器id
        viewMode: "3D", //是否为3D地图模式
        zoom: 13, //初始化地图级别
        center: current_position.value, //初始化地图中心点位置
        mapStyle: "amap://styles/fresh",
      })
      // 添加插件
      AMap.plugin(
        [
          "AMap.ToolBar",
          "AMap.Scale",
          "AMap.HawkEye",
          "AMap.Geolocation",
          "AMap.MapType",
          "AMap.MouseTool",
          "AMap.Polyline",
        ],
        function () {
          //异步同时加载多个插件
          // 添加地图插件
          // map.addControl(new AMap.ToolBar()) // 工具条控件;范围选择控件
          map.addControl(new AMap.Scale()) // 显示当前地图中心的比例尺
          // map.addControl(new AMap.HawkEye()) // 显示缩略图
          // map.addControl(new AMap.Geolocation()) // 定位当前位置
          // map.addControl(new AMap.MapType()) // 实现默认图层与卫星图,实时交通图层之间切换

          // 以下是鼠标工具插件
          const mouseTool = new AMap.MouseTool(map)
          // mouseTool.rule();// 用户手动绘制折线图,测量距离
          // mouseTool.measureArea() // 测量面积
        }
      )
      // 实例化点标记
      const marker = new AMap.Marker({
        icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
        position: current_position.value, // 这里我们通过上面的点击获取经纬度坐标,实时添加标记
        // 通过设置 offset 来添加偏移量
        offset: new AMap.Pixel(-26, -54),
      })
//这里监听标注点的点击事件,触发实现动画效果
      marker.on("click", function () {
        animationMove()
      })
      marker.setMap(map)
      
      // 历史轨迹动画
      function animationMove() {
        AMap.plugin("AMap.MoveAnimation", function () {
          var marker,
            lineArr = [
              [116.478935, 39.997761],
              [116.478939, 39.997825],
              [116.478912, 39.998549],
              [116.478912, 39.998549],
              [116.478998, 39.998555],
              [116.478998, 39.998555],
              [116.479282, 39.99856],
              [116.479658, 39.998528],
              [116.480151, 39.998453],
              [116.480784, 39.998302],
              [116.480784, 39.998302],
              [116.481149, 39.998184],
              [116.481573, 39.997997],
              [116.481863, 39.997846],
              [116.482072, 39.997718],
              [116.482362, 39.997718],
              [116.483633, 39.998935],
              [116.48367, 39.998968],
              [116.484648, 39.999861],
            ]

          var map = new AMap.Map("container", {
            resizeEnable: true,
            center: [116.397428, 39.90923],
            zoom: 17,
          })

          marker = new AMap.Marker({
            map: map,
            position: [116.478935, 39.997761],
            icon: "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png",
            offset: new AMap.Pixel(-13, -26),
          })

          // 绘制轨迹
          var polyline = new AMap.Polyline({
            map: map,
            path: lineArr,
            showDir: true,
            strokeColor: "#28F", //线颜色
            // strokeOpacity: 1,     //线透明度
            strokeWeight: 6, //线宽
            // strokeStyle: "solid"  //线样式
          })

          var passedPolyline = new AMap.Polyline({
            map: map,
            strokeColor: "#AF5", //线颜色
            strokeWeight: 6, //线宽
          })

          marker.on("moving", function (e: any) {
            passedPolyline.setPath(e.passedPath)
            map.setCenter(e.target.getPosition(), true)
          })

          map.setFitView()
          marker.moveAlong(lineArr, {
            // 每一段的时长
            duration: 500, //可根据实际采集时间间隔设置
            // JSAPI2.0 是否延道路自动设置角度在 moveAlong 里设置
            autoRotation: true,
          })
        })
      }
    })
    .catch((e) => {
      console.log(e)
    })
}
initMap()

2,轨迹回放的第二种写法,比较灵活一点

const listPath = async () => {
  //获取历史轨迹点
  list_Position.value = []
  //请求接口获取轨迹点数据
  const res: any = await getHistoryLocus(listSearch)
  //轨迹起点坐标
  start_position.value = changePosition(
    res.result[0].gLatitude,
    res.result[0].gLongitude
  ) as any

  lineList.value = res.result

  res.result.forEach((item: any) => {
    list_Position.push(changePosition(item.gLatitude, item.gLongitude))
  })
  console.log(list_Position, `打印list_Positionlist_Position`)
//加载地图
  let marker: any,
    map = new AMap.Map("container", {
      resizeEnable: true,
      center: start_position.value,
      zoom: 13,
    })
  marker = new AMap.Marker({
    icon: "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png",
    position: start_position.value,
    offset: new AMap.Pixel(-13, -30),
  })

  marker.on("click", function () {
   
    ;(AMap as any).plugin("AMap.MoveAnimation", function () {
      marker.moveAlong(list_Position, {
        // 每一段的时长
        duration: 500, //可根据实际采集时间间隔设置
        // JSAPI2.0 是否延道路自动设置角度在 moveAlong 里设置
        autoRotation: true,
      })
    })
  })
  marker.setMap(map)
  // 绘制轨迹
  var polyline = new AMap.Polyline({
    map: map,
    path: list_Position,
    showDir: true,
    strokeColor: "#28F", //线颜色
    // strokeOpacity: 1,     //线透明度
    strokeWeight: 6, //线宽
    // strokeStyle: "solid"  //线样式
  })

  var passedPolyline = new AMap.Polyline({
    map: map,
    strokeColor: "#AF5", //线颜色
    strokeWeight: 6, //线宽
  })

  marker.on("moving", function (e: any) {
    passedPolyline.setPath(e.passedPath)
    map.setCenter(e.target.getPosition())
  })
  ;(map as any).setFitView()
}

 3,使用AMap UI的轨迹巡航器来实现,配合进度条,这样写会有个BUG就是点击开始的时候,直接拖动进度条会报错

const listPath = async () => {
  //获取历史轨迹点
  list_Position.value = []
  //请求接口获取轨迹点数据
  const res: any = await getHistoryLocus(listSearch)
  //轨迹起点坐标
  start_position.value = changePosition(
    res.result[0].gLatitude,
    res.result[0].gLongitude
  ) as any

  lineList.value = res.result

  res.result.forEach((item: any) => {
    list_Position.push(changePosition(item.gLatitude, item.gLongitude))
  })
  console.log(list_Position, `打印list_Positionlist_Position`)

  
  // -----------------轨迹巡航器--------------------------------------
  //@ts-ignore  单行忽略   解决TS语法提示 AMap UI 不存在
  AMapUI.load(
    ["ui/misc/PathSimplifier", "lib/$", "ui/overlay/SimpleMarker"],
    function (PathSimplifier: any, $: any, SimpleMarker: any) {
      if (!PathSimplifier.supportCanvas) {
        alert("当前环境不支持 Canvas!")
        return
      }
      // $.SimpleMarker

      let pathSimplifierIns: any = new PathSimplifier({
        zIndex: 100,
        SimpleMarker: SimpleMarker,
        //autoSetFitView:false,
        map: map, //所属的地图实例

        getPath: function (pathData: any, pathIndex: any) {
          return pathData.path
        },
        getHoverTitle: function (
          pathData: any,
          pathIndex: any,
          pointIndex: any
        ) {
          if (pointIndex >= 0) {
            //point
            return (
              pathData.name + ",点:" + pointIndex + "/" + pathData.path.length
            )
          }

          return pathData.name + ",定位点数量" + pathData.path.length
        },
       
        renderOptions: {
          pathLineStyle: {
            dirArrowStyle: true,
          },
          getPathStyle: function (pathItem: any, zoom: any) {
            let lineWidth = Math.round(4 * Math.pow(1.1, zoom - 3))

            return {
              pathLineStyle: {
                strokeStyle: "#28F",
                lineWidth: 6,
              },
              pathLineSelectedStyle: {
                lineWidth: 6,
              },
              pathNavigatorStyle: {
                fillStyle: "#AF5",
              },
            }
          },
        },
      })

      //设置数据
      pathSimplifierIns.setData([
        {
          name: "路线1",
          path: list_Position,
        },
      ])
      // 巡航器的样式
      let pathNavigatorStyles = [
        {
          width: 16,
          height: 32,
          //使用图片
          content: PathSimplifier.Render.Canvas.getImageContent(
            "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png",
            pathSimplifierIns.renderLater()
          ),
        },
      ]
      //对第一条线路(即索引 0)创建一个巡航器
      var navg1 = pathSimplifierIns.createPathNavigator(0, {
        loop: false, //循环播放
        speed: times.value, //巡航速度,单位千米/小时
        pathNavigatorStyle: pathNavigatorStyles[0],
      })
      navgtr.value = navg1
     
      navg1.on("move", function () {
        let idx = navgtr.value.getCursor().idx //走到了第几个点
        let tail = navgtr.value.getCursor().tail //至下一个节点的比例位置
        let totalIdx = idx + tail
        // 进度条实时展示tail
        !isOnSlider.value && (currentIndex.value = totalIdx)
        //地图中心跟随变化
        map.setCenter(list_Position[idx])

        // 已经播放时间
        // 如果到头了,回到初始状态
        console.log(
          navgtr.value.isCursorAtPathEnd(),
          `打印navgtr.value.isCursorAtPathEnd()`
        )

        if (navgtr.value.isCursorAtPathEnd()) {
          currentIndex.value = list_Position.length
        }
      })
      pathSimplifier.value = pathSimplifierIns
    }
  )
  gmap.value = map
  console.log(res, `打印getHistoryLocusresres`)
}
// 开始按钮
const startBtn = () => {
  navgtr.value.start()
}
// 暂停按钮
const stopBtn = () => {
  
  navgtr.value.pause()
 
}
// 快进
const changeSpeed = () => {
  times.value = times.value + 200
  navgtr.value.setSpeed(times.value)
  console.log(times.value, `打印times.valuetimes.value`)
}
// 慢放
const slowSpeed = () => {
  if (times.value > 400) {
    times.value = times.value - 200
  }
  navgtr.value.setSpeed(times.value)
  console.log(times.value, `打印times.valuetimes.value`)
}
//继续
const puseSpeed = () => {
  navgtr.value.resume()
 
}

const stopMove = () => {
  console.log(`打印sahdjlahdasb;`)

  navgtr.value.pause()
}
//进度条带动巡航器变化
const changeSliderValue = () => {
  navgtr.value.pause()
  navgtr.value.moveToPoint(currentIndex.value, 0)
  pathSimplifier.value.renderLater()
  gmap.value.setCenter(list_Position[currentIndex.value])
}
// 滑块的提示信息 
const handlDelta = (e: any) => {
  e = e.toFixed(0)
  let nowtime: any = ""
  let dayMile: any = 0
  let totalMile: any = 0
  let str = ""
  if (lineList.value) {
    lineList.value.forEach((item: any, index: any) => {
      nowtime =
        item.gReportTime.split("T")[0] +
        " " +
        item.gReportTime.split("T")[1].split("+")[0]
      dayMile = item.sDayMileage.toFixed(2)
      totalMile = Number(totalMile) + Number(dayMile)
      if (index == e) {
        str =
          nowtime +
          " 今日:" +
          dayMile +
          " km 累计:" +
          totalMile.toFixed(2) +
          " km"
      }
    })
  }
  return str
  
}

这是dom的结构文章来源地址https://www.toymoban.com/news/detail-510545.html

 <div class="fix_bottom_close">
        <el-tabs type="border-card">
          <el-tab-pane label="时间轴">
            <el-button-group>
              <el-button type="primary" @click="slowSpeed">慢放</el-button>
              <el-button type="primary" @click="startBtn"> 开始 </el-button>
              <el-button type="primary" @click="stopBtn"> 暂停 </el-button>
              <el-button type="primary" @click="puseSpeed"> 继续 </el-button>
              <el-button type="primary" @click="changeSpeed"> 快进 </el-button>
            </el-button-group>
            <div class="fix_bottom_slider">
              <el-slider
                ref="timeSlider"
                v-model="currentIndex"
                show-stops
                :max="list_Position.length"
                :format-tooltip="handlDelta"
                @change="changeSliderValue"
              />
            </div>
          </el-tab-pane>
          <el-tab-pane label="速度曲线">Config</el-tab-pane>
          <el-tab-pane label="行程数据">Role</el-tab-pane>
          <el-tab-pane label="详细数据">Task</el-tab-pane>
        </el-tabs>
      </div>

到了这里,关于VUE3+TS+element UI +高德地图实现轨迹回放带进度条的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3+element-ui + TS封装全局分页组件

    本文介绍了如何使用Vue3、element-ui和TypeScript封装一个全局分页组件。 在开始之前,你需要安装以下环境: Vue3 element-ui TypeScript 这个分页组件提供以下功能: 支持自定义每页显示条数 支持自定义跳转到指定页码 支持显示总页数和总条数 支持自定义样式 分页组件结构 分页组

    2024年02月12日
    浏览(59)
  • vue实现轨迹回放(很详细)

        时间搜索查询轨迹并生成(默认是当前的一天的时间) 图标能跟随路径方向移动 删除了百度logo和版权信息(业务需要,不建议删除) Vue Baidu Map

    2023年04月09日
    浏览(28)
  • vue3高德地图点击标点

      1.首先如果没有key的话需要在高德开发平台申请key。 2.安装 3.容器: 4.容器样式: 5.在组件中引入所需的 API。 6.创建一个 Marker 实例。 7.定义样式:  显示地图层级与中心点信息: 获取经纬度坐标:   整体代码:  

    2024年02月11日
    浏览(49)
  • 基于Vue3 + ts + echarts(版本5.X)实现中国地图下钻、地图打点、地图热力图功能

    写在前面: 实现效果图   1.比较重要的部分用 红字 标出  2.安装echats:         3.由于echarts5版本的已经没有自带地图数据了,所以地图数据需要到专门的GEO数据网站中下载。这里提供一个阿里的下载地址:DataV.GeoAtlas地理小工具系列 对于这个工具网站,有一个重点需要说一

    2024年02月09日
    浏览(49)
  • 在vue3项目中使用新版高德地图

    高德开发平台 : 高德开放平台 | 高德地图API (amap.com) 1. 首先你要注册好账号登录 2. 获取key和密钥    自2021年12月02日升级,升级之后所申请的 key 必须配备安全密钥  jscode  一起使用         按 NPM 方式安装使用 Loader :         在页面中通过NPM 方式安装的使用 :    

    2023年04月19日
    浏览(66)
  • Vue3 + TS + Element-Plus —— 项目系统中封装表格+搜索表单 十分钟写五个UI不在是问题

    前期回顾 纯前端 —— 200行JS代码、实现导出Excel、支持DIY样式,纵横合并-CSDN博客 https://blog.csdn.net/m0_57904695/article/details/135537511?spm=1001.2014.3001.5501 目录 一、🛠️  newTable.vue 封装Table 二、🚩 newForm.vue 封装搜索表单  三、📝 TS类型 srctypesglobal.d.ts 四、♻️ 页面使用功能

    2024年01月24日
    浏览(59)
  • Vue3使用高德地图、搜索、地图选点、以及省市区三级联动

    1、准备工作 需要在 高德开发平台 申请自己的 key 和 密钥 这里的 Key 名称大家可以随意填写 申请完之后我们得到 key 和 密钥 vue中使用需要安装**@amap/amap-jsapi-loader --save** 官方文档 2、代码实现 首先我们需要三个文件,一个 index.vue 一个用来存放省市区的 index.js 文件 一个 ma

    2024年02月05日
    浏览(72)
  • Vue3+Vite连接高德地图JS API——地图显示、输入搜索

    1、进入高德地图API官网(https://lbs.amap.com/): 2、注册登录。 3、进入控制台。 4、点击“应用管理”,点击“我的应用”,创建新应用。 5、添加Key,服务平台选择“Web端(JS API)”,白名单不要填写,勾选阅读并同意。 点击提交后,就能看到Key已经生成,记住这里的Key和安

    2024年01月17日
    浏览(44)
  • 前端系列19集-vue3引入高德地图,响应式,自适应

    npm i @amap/amap-jsapi-loader --save 要在Vue 3中引入高德地图,你可以按照以下步骤进行操作: 在项目目录中使用npm或yarn安装高德地图的JavaScript API库。你可以使用以下命令之一: npm install @amap/amap-jsapi-loader yarn add @amap/amap-jsapi-loader 在Vue组件中引入并使用高德地图。 在你的Vue组件中

    2024年02月07日
    浏览(44)
  • 高德地图系列(三):vue项目利用高德地图实现地址搜索功能

    目录 第一章 效果图 第二章 源代码 高德地图为我们提供了搜索联想,以及搜索结果标记,该案例已将基础功能打通,后续我们肯定还会对功能有所修改,想实现自己想要的效果,基本上看高德地图文档对着改就好了(跟我们用别的工具一样做即可)  代码描述如下:  注意事

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包