vue引入高德地图--鱼骨图、地图类型切换、鼠标绘制工具
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
高德api文档地址:https://lbs.amap.com/demo-center/js-api
1、创建地图
HTML代码:
<template>
<div>
<div class="input_list">
<span style="padding-right: 30px">圆半径(m):<input v-model="radius"/></span>
<span style="padding-right: 30px">圆面积(m²):<input v-model="Math.floor(circleArea)"/> (m²)</span>
<span >多边形面积(m²):<input v-model="Math.floor(polygonArea)"/> </span>
</div>
<div id="amap-box"></div>
<div class="mouseTool" style="">
<el-form size="mini" class="tools_list">
<el-form-item>
<el-radio-group v-model="radio" @change="addPhoto" fill="#1aad19" size="small">
<el-radio label="circle">画圆 </el-radio>
<el-radio label="polygon">画多边形 </el-radio>
</el-radio-group>
<el-button @click="clearAll">清除</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
data(){
return{
mapObj: null, //定义全局地图
mouseTool:null,//鼠标绘图工具
radio:'', //图案类型
circle:null,//圆形
circlecenter:[],//圆心坐标
circleEditor:null, //圆形编辑器
radius:0,//半径
circleArea:'',//圆形面积
polygon:null,//多边形
polygonPath:[],//获取多边形点坐标
polygonEditor:null,//多边形编辑工具
polygonArea:'',//多边形面积
}
},
mounted(){
this.initMap()
},
methods:{
initMap(){
let map = new AMap.Map('amap-box', {
resizeEnable: true, //是否监控地图容器尺寸变化
zoom:11, //初始化地图层级
center: [116.397428, 39.90923] //初始化地图中心点
});
//左侧鱼骨图显示
let toolbar = new AMap.ToolBar();
map.addControl(toolbar);
//右上角地图切换效果显示
let maptype = new AMap.MapType({
defaultType: 0, //使用2D地图
showRoad:true //叠加路网图层
});
map.addControl(maptype);
self.mapObj = map;
//生成鼠标绘图工具
self.mouseTool = new AMap.MouseTool(self.mapObj);
//绘制 方法
self.mouseTool.on('draw',function(e){
self.mapObj.setDefaultCursor("crosshair");
if(self.radio=='circle'){
//计算圆心坐标
let x = e.obj.getPath()[8].lng ; //圆心的x轴坐标
let y = e.obj.getPath()[0].lat; //圆心的y轴坐标
self.circlecenter=[x,y]; //圆心坐标
//计算圆的半径
let m1 = new AMap.Marker({
position: new AMap.LngLat(e.obj.getPath()[0].lng,e.obj.getPath()[0].lat)
});
let m2 = new AMap.Marker({
position:new AMap.LngLat(e.obj.getPath()[17].lng,e.obj.getPath()[17].lat)
});
let p1 = m1.getPosition();
let p2 = m2.getPosition();
let distance = Math.round(p1.distance(p2));
self.radius=distance;
//圆的面积
self.circleArea = 3.14*(self.radius*self.radius)
self.drawcircle(); //添加圆形到地图
self.mouseTool.close(true) //去掉蓝色底层
}else if(self.radio=='polygon'){
self.polygonPath=e.obj.getPath();
self.drawpolygon();
self.mouseTool.close(true) //去掉蓝色底层
}
});
},
addPhoto(){
let self = this;
self.draw(self.radio);
},
//判断需要画的图形类型
draw(type) {
let self = this;
self.mapObj.setDefaultCursor("crosshair");
switch (type) {
case 'polygon':{
self.mapObj.clearMap(); //清除地图
self.radius='';
self.circleArea="";
self.mouseTool.polygon({});
break;
}
case 'circle':{
self.mapObj.clearMap();
self.polygonArea='';
self.mouseTool.circle({});
break;
}
}
},
//添加圆并且编辑
drawcircle(){
let self = this;
self.circle = new AMap.Circle({ //圆形编辑器的样式
map: self.mapObj,
center:self.circlecenter,
radius:self.radius,
strokeColor: "#F33",
strokeOpacity: 1,
strokeWeight: 1,
fillColor: "#fff",
fillOpacity: 0.5
});
self.circle.setMap(self.mapObj)
// 缩放地图到合适的视野级别
self.mapObj.setFitView([ self.circle ]);
self.circleEditor = new AMap.CircleEditor(self.mapObj,self.circle); //创建多边形编辑器对象
self.circleEditor.open(); //打开多边形编辑器
self.mapObj.setDefaultCursor("crosshair");
self.circleEditor.on('adjust', function(event) {
self.radius=event.radius; //获取圆形的半径
self.circleArea = 3.14*(self.radius*self.radius) //面积
});
self.circleEditor.on('move', function(event) {
console.log(event)//获取圆心坐标
});
},
//添加多边形到地图
drawpolygon(){
let self = this;
self.polygon = new AMap.Polygon({
path: self.polygonPath,
fillColor: '#fff', // 多边形填充颜色
borderWeight: 1, // 线条宽度,默认为 1
strokeWeight: 1,
fillOpacity: 0.5,
strokeColor: 'red', // 线条颜色
});
self.mapObj.add(self.polygon); //多边形添加到地图层里
self.mapObj.setFitView(); //显示多边形图案
self.polygonEditor = new AMap.PolyEditor(self.mapObj,self.polygon); //创建多边形编辑器对象
self.polygonEditor.open(); //打开多边形编辑器
self.polygonArea = AMap.GeometryUtil.ringArea(self.polygonPath);//初始化计算面积
self.polygonEditor.on('adjust', function(event) { //编辑多边形时候,随时监听坐标点并计算面积
self.polygonArea = AMap.GeometryUtil.ringArea(self.polygonPath);
//console.log(self.polygonPath) 获取多边形的点
});
},
//清除所有图形
clearAll(){
let self = this;
self.radio='';
self.radius='';
self.circleArea="";
self.polygonArea='';
self.mapObj.clearMap();
self.mapObj.setDefaultCursor();
},
}
这里一定要注意“amap-box”和id值一致
在初始化的方法中,配置好地图控件。修改配置文件
[地图的链接地址&(你的秘钥)+所使用的控件,每次更新完配置文件,要npm run dev, 否则会报错]
在画圆的时候需要注意的事:
1、需要计算圆心坐标和半径:
e.obj.getPath();===》返回了36个点的坐标;可以自己画坐标图就能明白,
e.obj.getPath()[0];第一个点坐标,
e.obj.getPath()[17];和第一个点对应的点坐标;
e.obj.getPath()[0] 和e.obj.getPath()[17] 两点距离,是直径;
2、再利用两点间距离方法:
计算圆的半径
JS 代码
//计算圆的半径
let m1 = new AMap.Marker({
position: new AMap.LngLat(e.obj.getPath()[0].lng,e.obj.getPath()[0].lat)
});
let m2 = new AMap.Marker({
position:new AMap.LngLat(e.obj.getPath()[17].lng,e.obj.getPath()[17].lat)
});
let p1 = m1.getPosition();
let p2 = m2.getPosition();
let distance = Math.round(p1.distance(p2));
self.radius=distance;
3、圆的面积
//圆的面积
self.circleArea = 3.14*(self.radius*self.radius)
self.drawcircle(); //添加圆形到地图
self.mouseTool.close(true) //去掉蓝色底层
4、编辑圆的时候,实时获取半径和圆心
//移动半径大小时候调用
self.circleEditor.on('adjust', function(event) {
self.radius=event.radius; //获取圆形的半径
self.circleArea = 3.14*(self.radius*self.radius) //面积
});
//移动圆心时候调用
self.circleEditor.on('move', function(event) {
console.log(event)//获取圆心坐标
});
在画多边形的时候需要注意的事:
1、e.obj.getPath(); ==》直接返回多边形的各个点坐标;
2、计算多变形的面积 ;
let polygonPath=e.obj.getPath();//获取路径
let polygonArea = AMap.GeometryUtil.ringArea(polygonPath); //计算面积
3、编辑多边形时候监听方法(获取面积)
self.polygonEditor.on('adjust', function(event) { //编辑多边形时候,随时监听坐标点并计算面积
self.polygonArea = AMap.GeometryUtil.ringArea(self.polygonPath);
//console.log(self.polygonPath) 获取多边形的点
});
其他参考网站:
转:博客文档:https://www.cnblogs.com/milkmap/tag/高德/
GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
更多推荐
已为社区贡献2条内容
所有评论(0)