高德地图AMapUI 轨迹展示组件PathSimplifier官方示例自己改的VUE版使用

362 阅读4分钟

前言

       由于AMapUI文档早已不更新了,官方文档示例中源码也是原生js版的,近期项目中要使用相关功能,改成vue版的,摸索了一下,将官方示例修改成了vue版本简单路径-轨迹展示-示例中心-JS API UI 组件示例 | 高德地图API

这里是提供一个改成vue版本的思路,其他示例按这个方案修改即可

准备工作

申请高德地图api key,npm加载Loader,具体参考官方文档,这里不再赘述

JS API 结合 Vue 使用-基础-进阶教程-地图 JS API 2.0 | 高德地图API

直接使用 AMapLoader.load 创建高德地图,同时加载 AMapUI,下面放完整代码,相关注意事项都在注释中

实现效果

跟官方文档效果图一致

转存失败,建议直接上传图片文件

完整代码

<template>
  <div id="map-container"></div>
</template>

<script>
let that;
import AMapLoader from '@amap/amap-jsapi-loader';
export default {
  name: 'Amap-container',
  components: {},
  props: {},
  data() {
    return {
      map: null,
    };
  },
  computed: {},
  watch: {},
  created() {
    that = this;
  },
  mounted() {
    this.initAMap();
  },
  beforeDestroy() {
    // this.map?.destroy();
  },
  methods: {
    initAMap() {
      let key = process.env.VUE_APP_AMAP_KEY; //你申请的高德地图AMapJS key
      AMapLoader.load({
        key: key, // 申请好的Web端开发者Key,首次调用 load 时必填
        version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        plugins: [], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
        AMapUI: {
            version: '1.1',
            plugins:['misc/PathSimplifier'] 
            //文档中用AMapUI.load加载使用的'ui/misc/PathSimplifier',但是这里用AMapLoader.load方式加载会默认带ui这一级
        }
      })
      .then((AMap) => {
        this.map = new AMap.Map("map-container", {
          // 设置地图容器id
          viewMode: "3D", // 是否为3D地图模式
          mapStyle: "", //设置地图的显示样式
          zoom: 4, // 初始化地图级别
          //center: [120.209758, 30.246809], // 初始化地图中心点位置,该坐标为杭州
        });

        this.map.plugin(["AMap.Scale","AMap.ToolBar"], function () { 
          //在回调函数中实例化插件,并使用插件功能
          let toolbar = new AMap.ToolBar(); //创建工具条插件实例
          that.map.addControl(toolbar); //添加工具条插件到页面
          that.map.addControl(new AMap.Scale());
        }); 

        //PathSimplifier依赖Canvas进行绘制,因此不支持IE9及以下浏览器。需要做判断
        if (!AMapUI.PathSimplifier.supportCanvas) {
            console.log('当前环境不支持 Canvas!');
            return;
        }else{
          this.initPathSimplifier();
        } 

      })
      .catch((e) => {
        console.log(e);
      });
      
    },

    initPathSimplifier() { 
      let pathSimplifierIns = new AMapUI.PathSimplifier({
        map: this.map, //所属的地图实例
        zIndex: 100, //绘制用图层的叠加顺序值。如果需要叠加在地图的最上层,可以设置一个较大的值,比如300
        //data:[] , //数据源数组,每个元素即为轨迹相关的信息
        //clickToSelectPath:false,  //点击轨迹节点或者轨迹节点间的连线时,选中该轨迹,默认true。
        //autoSetFitView:false, //是否在绘制后自动调整地图视野以适合全部轨迹,默认true。
        //onTopWhenSelected:false, //置顶选中的轨迹线;置顶的含义是,将该轨迹线的zIndex设置为现存最大值+1。默认true。

        /**
         * @param pathData 返回轨迹数据中的路径信息/节点坐标信息
         * @param  {*} pathData 轨迹数据项
         * @param  {number} pathIndex 轨迹索引
         * @return {Array.<AMap.LngLat|[number,number]>} 
         * 返回轨迹的节点坐标数组,数组元素可以是经纬度实例([AMap.LngLat, AMap.LngLat...])
         * 或者经纬度数字组成的数组([lng, lat]/[[lng|number,lat|number],...])
         */
        getPath: function(pathData, pathIndex) {
          return pathData.path; //[ [lng1, lat2], [lng2,lat2]......]
        },
        /**
         * 返回鼠标悬停时显示的Title内容
         * @param {*} pathData 轨迹数据项
         * @param {number} pathIndex 轨迹索引
         * @param {number} pointIndex 轨迹节点索引;如果悬停在节点之间的连线区域,该值为-1
         * @return {String} 返回Title内容,无内容时可以返回null
         */
        getHoverTitle: function(pathData, pathIndex, pointIndex) { //返回鼠标悬停时显示的信息
          if (pointIndex >= 0) {
              //鼠标悬停在某个轨迹节点上
              return pathData.name + ',点:' + pointIndex + '/' + pathData.path.length;
          }
          //鼠标悬停在节点之间的连线上
          return pathData.name + ',点数量' + pathData.path.length;
        },
        /**
         * 绘制引擎的构造参数
         * https://lbs.amap.com/api/amap-ui/reference-amap-ui/mass-data/pathsimplifier#t3
         */
        renderOptions: { //渲染选项
          renderAllPointsIfNumberBelow: 100, //绘制路线节点,如不需要可设置为-1
          pathLineStyle: {//轨迹线的样式
              strokeStyle: 'red',
              lineWidth: 6,
              dirArrowStyle: true
          }
        }
      })

      // window.pathSimplifierIns = pathSimplifierIns; //官方文档示例中有这段代码,我没懂什么意思,注释掉好像也没影响

      //设置数据,构建轨迹
      pathSimplifierIns.setData([{
          name: '路线0',
          path: [
              [116.405289, 39.904987],
              [113.964458, 40.54664],
              [111.47836, 41.135964],
              [108.949297, 41.670904],
              [106.380111, 42.149509],
              [103.774185, 42.56996],
              [101.135432, 42.930601],
              [98.46826, 43.229964],
              [95.777529, 43.466798],
              [93.068486, 43.64009],
              [90.34669, 43.749086],
              [87.61792, 43.793308]
          ]
      }]);
      /**
       * createPathNavigator 创建一个轨迹巡航器
       * @param {number} pathIndex 关联的轨迹索引
       * @param {Object} options 巡航器的配置选项,详见轨迹巡航器 PathNavigator https://lbs.amap.com/api/amap-ui/reference-amap-ui/mass-data/pathsimplifier#t4
       */
      let navg0 = pathSimplifierIns.createPathNavigator(0, {
          loop: true, //循环播放
          speed: 1000000 //巡航速度,单位千米/小时
      });

      navg0.start();
    },

  },
};
</script>
<style lang="scss" scoped>
#map-container {
  width: 100%;
  height: 800px;
}
</style>