vue 调用高德地图 绘制坐标测量点,测距工具,绘制线条

具体事件,具体需求请对照官方api
https://lbs.amap.com/api/javascript-api/reference/plugin
首先上效果图

image.png

项目需求:要求在高德地图上用测量工具绘制出锚点,然后吧锚点参数提交给后台,再次渲染地图为绘制的结果为线。
1.首先在public路径下的index.html文件下调用高德地图js,至于申请key请自行查看。(推荐下面npm引用)

<script language="javascript" src="//webapi.amap.com/maps?v=2.0&key=您申请的key值&plugin=AMap.ControlBar,AMap.ToolBar,AMap.RangingTool,AMap.Autocomplete,AMap.PlaceSearch,AMap.MouseTool"></script>

ps:npm 创建方法
npm install vue-amap --save
main.js中

// 引入vue-amap
import AMap from 'vue-amap';
Vue.use(AMap);
// 初始化vue-amap
AMap.initAMapApiLoader({
    // 申请的高德key
    key: '申请的高德key',
    // 插件集合
    plugin:  ['AMap.ControlBar', 'AMap.RangingTool', 'AMap.Autocomplete', 'AMap.PlaceSearch', 'AMap.ToolBar', 'AMap.MouseTool', 'AMap.PolyEditor'],
    v: '2.0',
  });

2.创建地图,以及仪表工具盘 this.resultslist 是后台传给我的数据 为了获取到地图的首个定位点。

let map = new AMap.Map("container", {
viewMode: "3D", // 3D地图
zoom: 16,//缩放
rotation:-15,//旋转度数
pitch:50, //倾斜角度
rotateEnable:true, //地图是否可旋转
pitchEnable:true, //是否允许设置俯仰角度
viewMode:'3D',//开启3D视图,默认为关闭
buildingAnimation:true,//楼块出现是否带动画
showBuildingBlock: true, // 设置地图显示3D楼块效果,移动端也可使用。推荐使用。
resizeEnable: true, // 固定大小的窗口的大小
zooms:[3,20], //地图显示的缩放级别范围在PC上,默认为[3,18],取值范围[3-18];在移动设备上,默认为[3,19],取值范围[3-19]
center: [this.resultslist[0].positionX,this.resultslist[0].positionY],//地图定位
});
this.maps=map
//仪表盘
var controlBar = new AMap.ControlBar({
position:{
  right:'10px',
  top:'14px'
 }
});
var toolBar = new AMap.ToolBar({
 position:{
   right:'40px',
   top:'125px'
 }
});
controlBar.addTo(map);
toolBar.addTo(map);

3.绘制测量工具坐标点 this.Custom为我勾选自定义坐标的时候开始绘制测量线(由于需求只需要绘制一条,如果需要绘制多条测量线自行补充)

 var ruler2;
 ruler2 = new AMap.RangingTool(map,{
 startLabelText:"START",
 midLabelText:"MID",
 endLabelText:"END"
 });
ruler2.turnOn(); //开启绘制
let that=this
AMap.Event.addListener(ruler2,"end",function(e){  
  console.log(e.points) //绘制测量工具点结束的数据
ruler2.turnOff()  //关闭绘制
});
// ps:如果遇到AMap.Event报错,先打印AMap,观察下面的参数
AMap.Event.addListener(ruler2,"removenode",function(e){
  console.log(e.points) //删除一段节点返回的数据
});    

4.绘制折线点 path 为折线的数组坐标具体格式为[['',''],['','']]绘制多条折线。

for (var i =0; i<this.getLineListest.length;i++) {
 if(this.getLineListest.length>0){
  let aaabc=this.getLineListest[i].id+"cc"
  aaabc = new AMap.Polyline({
  path:this.getLineListest[i].lineArrList,
  isOutline: true,
  outlineColor: '#ffeeff',
  borderWeight: 3,
  strokeColor: "#3366FF",
  strokeOpacity: 1,
  strokeWeight: 3, //线条粗细
// 折线样式还支持 'dashed'
  strokeStyle: "solid",
  strokeDasharray: [0, 5],
  lineJoin: 'round',
  lineCap: 'round',
  zIndex: 50,
  })
  map.add([aaabc]);
  this.aaabcsest=aaabc
 }
}

5.编辑画好的折线点。

<template>
<div>
<div @click="open()">开始编辑</div>
<div id="btn" @click="closend($event)">编辑结束</div>
</div>
<template>

 open(){
  // this.aaabcsest为绘制折线点数据
  //this.maps 为创建地图数据上面都有声明到
    let polyEditor = new AMap.PolyEditor(this.maps,this.aaabcsest)
    this.polyEditorlist=polyEditor
    polyEditor.open()
    polyEditor.on('addnode', function(event) {
     console.log(event)
    })
    polyEditor.on('adjust', function(event) {
     console.log(event)
    })
    polyEditor.on('removenode', function(event) {
      console.log(event)
    })
  },
  closend(){
   let arr = Object.keys(this.polyEditorlist)
   let that=this
   let btn = document.getElementById("btn");
   btn.click()  //这里执行模拟点击事件,点击一次方法相当于执行两次
   let polyEditor = this.polyEditorlist
   polyEditor.close()
   polyEditor.on('end', function(event) {
   console.log(event) //最终得到执行完毕的数据参数
   })
 },

6.绘制坐标点以及弹窗以及点击事件,由于弹框必须第一个显示所以我倒叙循环为了保证弹窗为第一个 aa为每次循环的数据依次添加坐标点。

for (var i =this.resultslist.length-1, marker; i>=0;i--) {
  if(this.resultslist[i].positionX!=='' && this.resultslist[i].positionY!==''){
  let aa=[this.resultslist[i].positionX,this.resultslist[i].positionY];
//坐标点
 marker = new AMap.Marker({
  map: map,
  offset: new AMap.Pixel(-10, -32) ,// 相对于基点的偏移位置
  icon: "https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png",
  position: aa,
 });
  var infoWindow = new AMap.InfoWindow({
    offset:new AMap.Pixel(0, -35), //偏移量
  });
//坐标点弹框
  marker.content = 'html';
  marker.on('click', markerClick);
  marker.emit('click', {target: marker});
}
}
function markerClick(e) {
 infoWindow.setContent(e.target.content);
 infoWindow.open(map, e.target.getPosition());
}

vue npm 刷新页面地图可能会报错,如图所示:


image.png

只需要在new AMap.Map前面调用lazyAMapApiLoaderInstance就可以了,注意是从第一行到地图的最后结束。

import { lazyAMapApiLoaderInstance } from 'vue-amap';
 lazyAMapApiLoaderInstance.load().then(() => {
 let map = new AMap.Map("container", {
 })
})
image.png

写的很简单,如有不足请多多包含,有帮助到的话最好不过了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容