利用vue+高德地图API 实现用户的运动轨迹

news2025/1/21 9:25:20

利用vue+高德地图API 实现用户的运动轨迹

高德地图网址:https://lbs.amap.com/api/jsapi-v2/guide/abc/prepare

任务一:实现地图显示

先完成准备工作,这一步是后面工作的基础。准备工作部分参考了:

https://blog.csdn.net/qq_59863007/article/details/125902045

http://t.zoukankan.com/fontomas-p-13253963.html

  1. 注册,拿到key

  2. 安装 :npm i @amap/amap-jsapi-loader --save

  3. 在 public/index.html 中加入:

    <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值&callback=init"></script>
    
  4. 在main.js页面中配置安全密钥

   window._AMapSecurityConfig = {
   	securityJsCode: '你的安全密钥' //*  安全密钥
   }

5 .创建地图组件,后续我调用组件实现
5.1 创建组件

<template>
  <div>
    <!-- 用来显示地图 -->
    <!-- 可以不写宽度,但一定要有高度 -->
  <div id="container"  ></div>
      <h2>{{fathermsg}}<>
  </div>
</template>
<script>
    export default {
        name: 'Map2 ',
        data() {
            return {
            }
        },
        props: {
            fathermsg:{}
        }
</script>
<style scoped>
  #container{
    width: 100%;
    height: 500px;

  }
</style>

注: props: {
fathermsg:{}
} 用来接收前端传来的值 ;

5.2 在 main.js中注册组件

// 高德地图组件
import Map2 from "@/components/Map2"
// 全局组件挂载
Vue.component('Map2', Map2)

5.3 调用组件

<template>
  <div>
    <Map2 :fathermsg="pmsg" ></Map2>
  </div>

</template>

<script>
  import Map2 from '../components/Map2/index.vue'
  export default {
    name: 'hw3',
    components:{
      Map2
    },
    data(){
      return{
        pmsg:"这是父组件"
      }
    }
  }
</script>

<style scoped>

</style>

注: <Map2> </Map2>是组件名称

想给组件传值的话,写成 <Map2 :fathermsg="pmsg" ></Map2>

pmsg会赋给 fathermsg 然后传过去,那边接受的值也是fathermsg 。

到这里:可以实现地图的显示,而且父组件的消息能够传到子组件才对


接下来的任务就不细分了,直接上代码,任务包括:

任务二:添加标记点

任务三:轨迹数据的相互传输

任务四:根据数据实现轨迹效果并沿着运动

任务五:轨迹删除,标记点删除

…/components/Map2/index.vue的代码

<template>
  <div>
    <!-- 用来显示地图 -->
    <!-- 可以不写宽度,但一定要有高度 -->
  <div id="container"  ></div>
    <el-button
      icon="el-icon"
      size="mini"
      @click="addTrack"
    >轨迹回放</el-button>

    <el-button
      icon="el-icon-delete"
      size="mini"
      @click="delTrack"
    >轨迹删除</el-button>
  </div>
</template>

<script>
  //引入高德地图
  //import AMap from '@amap/amap-jsapi-loader'
  export default {
    name: 'Map2 ',
    data() {
      return {
        map: null,
        marker: null,
        msg:"这是子组件",
        temp:[],
        polyline:[],
        passedPolyline:[],
        startMarker:null,
        // 用于测试的轨迹数据,父组件传来的polylinefather也是这种格式
        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]],
      }
    },
    props: {
      polylinefather:{
        type:[String,Number,Array],
      },
      pmsg:{}
    },
//mounted()负责初始化的工作包括:1.生成地图2.确定初始中心点3.生成初始标记点
    mounted() {
        //生成一个地图对象,确定初始中心点
      var map=new window.AMap.Map('container', { // eslint-disable-line no-unused-vars
        zoom:10,//级别
        center:[116.478935,39.997761],//中心点坐标
        viewMode:'2D'//使用2D视图
      });
      // 生成一个标记点marker:
      let lng=116.38;
      let lat=39.90;
      this.marker = new window.AMap.Marker({
        position: new window.AMap.LngLat( lng,lat),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
        title: '',
      });
    // 将创建的点标记添加到已有的地图实例:
      map.add(this.marker);
      this.map=map;
      console.log("marker添加成功");
    },
//方法调用,实现轨迹的生成和删除
    methods: {
      // 添加轨迹
      addTrack() {
        // 重新根据传来的值,选取第一个坐标,创建一个 标记点Marker实例和设置地图的中心点:
        var lng=this.polylinefather[0][0];
        var lat=this.polylinefather[0][1];
        // 1.重新设置地图中心点
        var position = new AMap.LngLat(lng, lat);  // 标准写法
         //2.重建一个标记点 marker
            // 2.1需要移除已创建的 marker
        this.map.remove(this.marker);
           // 2.2创建新的 marker
        this.marker = new window.AMap.Marker({
          position: new window.AMap.LngLat( lng,lat),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
          title: '',
        });
         // 2.3将创建的点标记添加到已有的地图实例:
        this.map.add(this.marker);
        // 用折线绘制轨迹
        this.polyline = new window.AMap.Polyline({
          map: this.map,
          path: this.polylinefather,
          // 添加dirImg可以自定义路线的箭头,支持Image和Canvas
          showDir: true,
          dirImg:'https://a.amap.com/jsapi_demos/static/images/mass0.png',
          strokeColor: "#28F", //线颜色
          // strokeOpacity: 1,     //线透明度
          strokeWeight: 10, //线宽
          strokeStyle: "solid"  //线样式
        });
        // 创建了一个车辆的点用于运动
        this.startMarker = new AMap.Marker({
          map: this.map,
          size: new window.AMap.Size(50, 52),
          // 第一个点为起点
          position: this.polylinefather[0],
          icon: "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png",
          offset: new AMap.Pixel(-35, -20),
        });
        console.log("轨迹绘制2");
        this.startAnimation();
        console.log("运动2");
      },
      // 开始运动
      startAnimation() {
        // 加载插件MoveAnimation
        window.AMap.plugin("AMap.MoveAnimation", () => {
          // 运动过的轨迹样式
          this.passedPolyline = new window.AMap.Polyline({
            map: this.map,
            strokeColor: "#AF5", //线颜色
            strokeWeight: 6, //线宽
          });
          // 绑定运动事件
          this.startMarker.on("moving", (e) => {
            this.passedPolyline.setPath(e.passedPath);
            this.map.setCenter(e.target.getPosition(), true);
          });
          // 开始运动
          this.startMarker.moveAlong(this.polylinefather, {
            // 每段动画持续时长, 单位:ms
            duration: 500,
            // 覆盖物是否沿路径旋转
            autoRotation: true,
          });
        });
      },
      // 删除轨迹
      delTrack() {
        // 移除已创建的 marker
        this.map.remove(this.marker);
        console.log("轨迹删除方法开始")
        // 起点删除
        if (this.startMarker) {
          this.startMarker.remove();
          this.startMarker = null;
        }
        // 折线删除
        if (this.polyline) {
          this.polyline.setMap(null);
          this.polyline = null;
        }
        // 走过的折线删除
        if (this.passedPolyline) {
          this.passedPolyline.setMap(null);
          this.passedPolyline = null;
        }
      }
    }
  }
</script>

<style scoped>
  #container{
    width: 100%;
    height: 500px;

  }
</style>

views/index.vue代码

<template>
  <div>
    <Map2 :pmsg="pmsg" :polylinefather="polyline04" ></Map2>
  </div>

</template>

<script>
  import Map2 from '../components/Map2/index.vue'
  export default {
    name: 'hw3',
    components:{
      Map2
    },
    data(){
      return{
        polyline04:[ [ 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 ] ]
        ,pmsg:"这是父组件"
      }
    }
  }
</script>

<style scoped>

</style>

最终效果:

轨迹回放,标记点为轨迹的第一个点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZS0DWnxl-1664959308957)(D:/GitCode/tuchuang/img/image-20221005163109129.png)]

轨迹删除,轨迹和标记点都删除了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VAU6VF9I-1664959308959)(D:/GitCode/tuchuang/img/image-20221005163125930.png)]

最后总结:

刚开始用的百度地图的api,试了一下,发现传过去的值渲染有问题,最后才选了高德地图的api。

  1. 高德地图的api使用需要注意的点是Map对象生成这一步可能会存在问题,可能会报错
    如: ‘map’ is assigned a value but never used 和 ‘AMap’ is not defined
    解决方案见这位up主的评论区:
    https://www.bilibili.com/video/BV1EZ4y1z72F/?spm_id_from=333.999.0.0&vd_source=a56e9c2852c4b906ac796aa4c61964ec
  2. 还有一点就是this.map和map的使用 需要注意 这点我踩了很多坑
  3. 掌握前端的 debugger 手段
    https://blog.csdn.net/leaning_java/article/details/122828550
  4. 复习了下 vue 中 父子组件
    https://www.bilibili.com/video/BV1TW4y1r7vV/?spm_id_from=333.337.search-card.all.click&vd_source=a56e9c2852c4b906ac796aa4c61964ec
  5. 复习了 父子组件之间的 通信
    https://www.bilibili.com/video/BV1Zy4y1W7Xo/?spm_id_from=333.337.search-card.all.click&vd_source=a56e9c2852c4b906ac796aa4c61964ec
  6. 进阶知识,以后再看vue 利用高德地图的巡航轨迹, 做带进度条和倍速的轨迹回放_Jusme_wx的博客-CSDN博客_高德轨迹回放进度条

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

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

相关文章

vue3中vite的@路径别名与path中的resolve

使用路径引用 在vue3中&#xff0c;想用符号代替./…/这种相对路径引用使用&#xff0c; 前者相当于从根目录往后找&#xff0c;后者相当于从后往前找。 具体方法就是在vite.config.js中 import { resolve } from "path"export default defineConfig({plugins: [v…

Vue动态组件

等疫情结束了&#xff0c;要开始爬爬山、看看海&#xff0c;做些不会后悔的事情 一、概念 1. 示例 组件是可复用的 Vue 实例&#xff0c;且带有一个名字&#xff0c;这里实现一个最简单的组件&#xff1a; 父组件&#xff1a; <template><div><h1>Father…

【让CSDN的浪漫弥漫女神节】_Unity基础不动山不摇_回顾篇

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

promise 以及经典面试题

1.Promise 它是一个ES6提出一个新语法&#xff0c;用来优化异步代码的写法。promise&#xff1a;承诺 ● 生活中&#xff0c;它是用来表述 对将来要发生的事情的肯定。 例如 &#xff1a; 高中生说&#xff0c;老师&#xff0c;我会考上一所好大学的&#xff1b;销售员说&…

刷题日常计~JS④

作者 : SYFStrive 博客首页 : 点击跳转HomePage &#x1f4dc;&#xff1a; 初编程JavaScript之每天10&#x1f5e1;5题 &#x1f449; 从质变到量变&#x1f4aa; &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区…

Ajax 前后端数据交互

ajax 数据交互 今天又是奋斗的一天&#xff0c;行吧&#xff0c;来学习ajax ajax 数据交互什么是ajax&#xff1f;ajax的优势ajax的使用创建一个ajax对象配置这个对象发送请求接受返回过来的数据ajax状态码readystatechangeresponseTextajax请求方式封装一个属于自己的ajax什么…

2022年最新最详细在IDEA中配置Tomcat(含有详细图解过程)、建立使用IEDA建立一个Web项目的案例

1、首先已经成功安装过tomcat 如果没有成功安装&#xff0c;参考这篇tomcat安装教程(安装成功可忽略)&#xff1a;https://blog.csdn.net/weixin_43304253/article/details/117001797 2、在IDEA中配置tomcat的详细步骤 2.1、run ->Edit Confifurations 2.2 、点击加号 2.…

微信小程序自定义导航栏,实现不同用户角色登陆后显示不同的tabbar(避坑版)

在我们开发小程序的过程中&#xff0c;会遇到权限登录问题&#xff0c;不同的角色登录后显示的底部导航栏tabbar是不一样的。网上看到了很多的博客&#xff0c;多多少少会有些坑&#xff0c;会遇到问题。今天这篇博客就可以一次性解决。 了解概念 自定义tabbar 使用方法 app…

React修改Antd组件样式的方法

1.修改默认组件样式和写自己组件样式的区别 当我们写自己的样式时&#xff0c;在组件页面中定义class名称&#xff0c;再在less文件中对这个class定义样式。 //index.js import React,{useState} from react; import styles from ./index.less;const Index (props) >{ret…

36.一文讲透JavaScript日期对象Date,时间戳、1970、date方法、date计算

文章目录JavaScript日期和时间处理方法Date对象的创建new Date()new Date(milliseconds)1970年之前的时间&#xff1f;new Date(date_str)new Date(year, month, date, hours, minutes, sec, ms)Date对象的方法获取日期内容设置日期内容日期的自动校准日期转为数字、日期差值Da…

Node.js安装及环境配置之Windows篇

Node.js安装及环境配置之Windows篇Node.js安装及环境配置之Windows篇一、安装环境二、安装node.js步骤三、前期准备四、开始安装五、环境配置Node.js安装及环境配置之Windows篇 一、安装环境 1、本机系统&#xff1a;Windows 10&#xff08;64位&#xff09; 2、Node.js&…

纯js判断文件流格式类型:pdf,doc,docx,xls,xlsx,ppt,pptx一次搞定!

目录使用js判断文件类型的场景方法特点输入输出方法步骤1. 查看每种格式文件的16进制码&#xff0c;提取不同文件类型的“特征数”。2. 先判断大类型&#xff0c;在具体大类下判断小类型项目地址&#xff1a;纯前端基于react实现的多类型文件预览&#xff1a;通过arraybuffer判…

uniapp全局组件全局使用(不在每个页面template使用,仅支持H5),函数式调用全局组件方法

最简单的使用&#xff0c;在 main.js 编写如下代码&#xff0c;即可将 xxx 组件在每个页面显示 // main.js// 引入组件 import xxx from "/components/xxx.vue";// 将该组件挂载在document.body下 document.body.appendChild(new xxx().$mount().$el); 函数式调用全…

JS高级知识总结

文章目录1. this指向问题2. 对象进阶2.1 对象的定义和使用2.2 对象访问器2.2.1 Getter2.2.2 Setter2.3 对象构造器2.4 对象原型2.4.1 prototype属性2.4.2 \_\_proto\_\_ 属性2.4.3 constructor属性2.4.4 原型链2.5 Object对象2.5.1 管理对象2.5.2 保护对象3. 函数进阶3.1 函数的…

.Net Core中间件

目录 一、什么是中间件 二、中间件的用途 三、中间件的三个概念 四、自定义中间件 五、ASP.NET Core附带中间件组件 六、中间件和过滤器的区别 一、什么是中间件 在浏览网站或者使用手机App加载内容的时候&#xff0c;浏览器或者手机App其实在向Web服务器发送HTTP请求。服…

NodeJS安装(npm包管理器)

1、nodejs下载 windows下的NodeJS安装是比较方便的&#xff0c; 只需要登陆官网&#xff08;Node.js&#xff09;&#xff0c;直接点击64-bit下载安装 2、安装过程基本直接“NEXT”&#xff0c;NodeJS已经集成了npm&#xff0c;所以npm也一并安装好了 3、在cmd窗口输入node -…

React-DevTools开发者工具安装

React开发者工具最简单的安装方式自然是科学上网&#xff0c;通过Google Chrome浏览器访问应用商店安装了。以下介绍另一种安装方式&#xff1a;基于 react-devtools的GitHub项目源码编译进行插件安装。 目录 React-DevTools&#xff1a;GitHub项目地址 React-DevTools&#x…

修改elementUI中el-date-picker内置样式

一.编写背景 今天正在日常的需求编写和bug调试中&#xff0c;产品提出了这样一个需求。为了满足用户在新增数据时的便捷准确&#xff0c;时间选择格式为“年月日时”&#xff0c;即用户不需要选择分合秒&#xff0c;换句话说就是下图中红色框的两项不需要。 二.问题分析。 当时…

基于vscode开发vue3项目的详细步骤教程 3 前端路由vue-router

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAw…

如何使用 JavaScript 读取文件

您可以使用 JavaScript File API 加载选定文件的内容。本节介绍 File API 的基本用法。 现在让我们看看如何使用 File API。 使用 JavaScript 读取文件概述 选择带有输入元素的文件 在 HTML 中&#xff0c;您可以通过将 input 元素的 type 属性设置为 file 来选择文件。 &…