vue项目在el-dialog中循环生成高德地图组件并生成路线规划

项目场景:vue项目在el-dialog中循环生成高德地图组件

提示:这里简述项目相关背景:
项目需要在弹窗中展示不同数据源的多个路线规划信息,在实践中发现很多网上搜索不到的错误,特此记录一下


问题描述

仅展示最精简并符合我所需要的步骤
首先需要安装vue-amap插件:

npm i @amap/amap-jsapi-loader --save

其次需要在public文件夹下的index.html文件中增加高德地图静态资源以及配置安全密钥

<link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
...
<div id="app"></div>
<script type="text/javascript">
    window._AMapSecurityConfig = {
      securityJsCode:'在高德开放平台申请的安全密钥',  
    }
</script>
<script type="text/javascript" src="https://webapi.amap.com/loader.js"></script> 

然后就可以创建组件使用了

<template>
    <div class="home_div">
        <div :id="ComponmapId" class="container"></div>
        <div id="panel"></div>
    </div>
</template>
<script>
//导入插件
import AMapLoader from '@amap/amap-jsapi-loader';
//初始化
props: ['mapId','visible'],
data(){
    return{
        map: null,
    } 
},   
mounted() {
    this.initAMap() // 获取初始化数据
},
methods:{
        initAMap(){
            let _this = this
            if (this.visible) {
	            AMapLoader.load({
	                 key:'',  //在高德开放平台申请的的key
	                 version:"2.0",
	                 plugins:[
	                     'AMap.Driving', //在这里添加你需要的地图功能,例如鹰眼,比例尺,路线规划等等
	                 ],
	             }).then((AMap)=>{
	                 _this.map = new AMap.Map('地图元素id',{
	                     //设置地图容器id
	                     viewMode: "3D", //是否为3D地图模式
	                     zoom: 11, //初始化地图级别
	                     center:[113.00, 22.00], //初始化地图中心点位置
	                 });
	                 _this.getRoute();
	                 //在地图组件上需要使用的方法,都可以写在这里
	             }).catch(e=>{
	                 console.log(e);
	             })
	         }
        },
}

下面是我遇到的第一个坑
由于el-dialog不同于其他基础dom元素,当父组件中该el-dialog的visible.sync所绑定的值不为true时,地图组件会因为该元素不存在而无法创建地图组件,所以我们需要在父组件中给地图组件传一个布尔值,根据布尔值,再进行地图组件的初始化工作

父组件
<el-col :span="18">
    <Mapview
      :mapId="LngLatindex"
      :visible="transportVisible"
    ></Mapview>
  </el-col>

然后是我遇到的第二个坑,
由于之前使用固定的id值,所以导致页面在循环创建组件过程中,永远只会显示第一个组件的地图信息,所以id就不能使用固定值,可以将父组件中循环所使用的index传给子组件,之后,再在子组件中对id值进行处理,可以通过class给组件写样式,地图组件必须有宽高,要注意,如果组件的样式没有生效,那么地图实例也无法创建,切记切记检查子组件的样式名,是否与dom结构对应上

created(){
  this.ComponmapId = 'container'+this.mapId
},

地图创建完成后,即可开始路线规划工作,在methods中定义getRoute方法

getRoute() {
		 let _this = this
		 this.driving = new AMap.Driving({
		     // 驾车路线规划策略,AMap.DrivingPolicy.LEAST_TIME是最快捷模式
		     policy: AMap.DrivingPolicy.LEAST_TIME,
		     map: _this.map,
		     panel: "panel"
		 })
		 
		 this.driving.search(_this.startLngLat,_this.endLngLat, function(status, result) {
		     // result 即是对应的驾车导航信息
		     // console.log(result.routes[0]);
		     if (status === 'complete') {
		         console.log('绘制驾车路线完成');
		     } else {
		         console.log('获取驾车数据失败:' + result);
		     }
		     _this.dis = result.routes[0].distance//此处是该路线所计算出来的实际路程公里数
		 });
		},

网上大多数都是根据关键字确定起点终点,并进行路线规划,我就不做太多论述,我所使用的是根据地理坐标,完成定位,并规划路线,传值方式大同小异,包括高德开放文档也给出了很多方式,如果报 LngLat(NaN, NaN),Pixel(NaN, NaN)这两个错,不妨打印检查一下传入的坐标值,是否规范,可以在传值时使用一次Number()类型转换,再有就是检查this指向

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妈耶,头发没了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值