<template>
<div class="hello">
<div style="margin-bottom:10px">
<button @click="clickStart('jinting')">设定坐标</button>
<button @click="clickEnd">退出设定</button>
<button @click="re" style="color:#ff0000">重置</button>
<button @click="getBoundary">生成区域</button>
<button @click="clickCenter">设定中心点</button>
<button @click="boo2 = !boo2">显示点集</button>
<input type="text" placeholder="请输入城市名称" width="200" v-model="cityName"></input>
</div>
<!-- map start -->
<div style="" id="dituContent" class="ditu-content"></div>
<!-- map end -->
<div style="text-align:center" class="ditu-point" v-if="savePointsArray.length > 0" v-show="boo2">
<p v-for="todo in savePointsArray">
<span style="padding-right:20px;">{{ todo.name }}</span><span>{{ todo.point }}</span>
</p>
</div>
</div>
</template> <script>
export default {
name: 'mymap',
data () {
return {
polygons: [],
clickCity: '',
polyline: null,
marker: null,
cityName: '',
status: 'none',
centerPoint: [],
savePointsArray: [],
savePointsString: '',
jinting: '',
todos: [
{ text: '学习 JavaScript' },
{ text: '学习 Vue' },
{ text: '整个牛项目' }
], mapObj:null,
boo2: false // 当点了显示点集的按钮之后变为true
}
},
mounted () {
this.initMap()
},
methods:{
re(){
this.polygons = []
this.clickCity = ''
this.polyline = null
this.marker = null
this.cityName = ''
this.status = 'none'
this.centerPoint = []
this.savePointsArray = []
this.savePointsString = ''
this.jinting = ''
this.mapObj = null
this.boo2 = false this.initMap()
},
initMap () {
this.createMap() //创建地图
},
createMap(){
let self = this
let m = new BMap.Map("dituContent")
let point = new BMap.Point(120.49,31.15)
m.centerAndZoom(point,12)
m.setCurrentCity("苏州")
m.addEventListener("click",function(e){
let ln = e.point.lng
let la = e.point.lat
self.clickFun(ln,la)
}); this.setMapEvent(m)
},
setMapEvent(m){
m.enableDragging();//启用地图拖拽事件,默认启用(可不写)
m.enableScrollWheelZoom();//启用地图滚轮放大缩小
m.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
m.enableKeyboard();//启用键盘上下左右键移动地图 this.addMapControl(m);//向地图添加控件
},
addMapControl(m){
//向地图中添加缩放控件
let ctrl_nav = new BMap.NavigationControl({anchor:BMAP_ANCHOR_TOP_LEFT,type:BMAP_NAVIGATION_CONTROL_LARGE});
m.addControl(ctrl_nav);
//向地图中添加缩略图控件
let ctrl_ove = new BMap.OverviewMapControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,isOpen:1});
m.addControl(ctrl_ove);
//向地图中添加比例尺控件
let ctrl_sca = new BMap.ScaleControl({anchor:BMAP_ANCHOR_BOTTOM_LEFT});
m.addControl(ctrl_sca); this.mapObj = m
},
clickFun(ln,la){ if (this.status === 'inner') {
this.centerPoint[0] = ln
this.centerPoint[1] = la this.marker = new BMap.Marker(new BMap.Point(ln, la)); // 创建点
this.mapObj.addOverlay(this.marker);
} else if (this.clickCity === '') {
console.log('当前没有选择镇');
return
} else {
switch(this.clickCity)
{
case 'jinting':
this.jinting += (ln + ',' + la + ';')
this.pline(this.jinting)
// console.log('this.jinting', this.jinting)
break;
default:
return
}
}
},
clickStart(n){
$('#dituContent div').css({
'cursor':'crosshair'
})
this.polygons = []
this.clickCity = n
this.status = 'outside'
},
clickEnd(){
console.log('======================== CLICK END ======================')
this.clickCity = ''
this.status = 'none'
$('#dituContent div').css({
'cursor':'url("http://api0.map.bdimg.com/images/openhand.cur") 8 8, default'
})
},
clickCenter(){
this.status = 'inner'
$('#dituContent div').css({
'cursor':'crosshair'
})
},
pline(city){ this.mapObj.removeOverlay(this.polyline)
let pois = city.split(';')
let poisarray = []
pois.pop() for (let i = 0; i < pois.length; i++) {
poisarray.push(new BMap.Point(parseFloat(pois[i].split(',')[0]),parseFloat(pois[i].split(',')[1]))) } this.polyline = new BMap.Polyline(poisarray, {
enableEditing: false,//是否启用线编辑,默认为false
enableClicking: false,//是否响应点击事件,默认为true
strokeWeight:'5',//折线的宽度,以像素为单位
strokeOpacity: 0.5,//折线的透明度,取值范围0 - 1
strokeColor:"#18a45b" //折线颜色
});
this.mapObj.addOverlay(this.polyline); //增加折线
},
getBoundary(){
this.mapObj.removeOverlay(this.polyline)
let areas = []
let contentArray = []
areas.push(this.jinting)
let colors = "#fff492"
let pointArray = []
for (var i = 0; i < areas.length; i++) {
let ply = new BMap.Polygon(areas[i], { strokeWeight: 2, strokeColor: "#ff0000" }); //建立多边形覆盖物
ply.setFillColor(colors) //设置多边形的填充颜色
ply.setFillOpacity(0.35);
this.polygons.push(ply); //加入多边形数组,以之后获取多边形边界点集 // ply.enableEditing(); //范围可编辑 【编辑的时候开启】 this.mapObj.addOverlay(ply); //添加覆盖物
pointArray = pointArray.concat(ply.getPath());
} this.addlabel2()
this.savePoints()
this.reload2()
},
reload2(){
this.polygons = []
this.clickCity = ''
this.polyline = null
this.cityName = ''
this.jinting = ""
this.status = 'none'
this.mapObj.removeOverlay(this.marker)
this.centerPoint = []
},
addlabel2(){
let pointArray = [
new BMap.Point(this.centerPoint[0], this.centerPoint[1]),
]
let optsArray = [{}]
let labelArray = []
this.contentArray = [this.cityName]
for (let i = 0; i < pointArray.length; i++) {
optsArray[i].position = pointArray[i]
labelArray[i] = new BMap.Label(this.contentArray[i], optsArray[i])
labelArray[i].setStyle({
color: "red",
fontSize: "12px",
height: "20px",
lineHeight: "20px",
fontFamily: "微软雅黑"
});
this.mapObj.addOverlay(labelArray[i])
}
},
savePoints(){
console.log('=======================存储点集')
console.log(this.cityName)
if (this.cityName === ''){
alert('城市名称必填!')
return
}
if (this.savePointsCheck(this.cityName)){
alert('这个点已经存过了!')
return
}
let obj = {}
obj.name = this.cityName
obj.point = this.jinting.slice(0,-1)
obj.centerpoint = this.centerPoint[0] + ',' + this.centerPoint[1]
this.savePointsArray.push(obj)
console.log(this.savePointsArray) },
savePointsCheck(c) {
console.log(c)
let f = this.savePointsArray.find((v) => {
console.log(c)
console.log(v.name + '===' + c)
return v.name === c
}) return f
}
}
}
</script> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.ditu-content{
width:70%;
height:600px;
border:#ccc solid 1px;
margin:0 auto 20px;
}
.pointwords{
word-wrap: break-word;
text-align: center;
padding: 0 20px;
}
.button{
height: 100px;
}
</style>

最后效果如下:

参考:

https://blog.csdn.net/qq_38903950/article/details/78022174?locationNum=7&fps=1

https://www.cnblogs.com/RiseSoft/p/7979637.html

vue & 百度地图:在地图上绘制多边形的更多相关文章

  1. 软件项目技术点(7)——在canvas上绘制自定义图形

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...

  2. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能

    权声明:本文为博主原创文章,未经博主允许不得转载. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内.以及两点间的测距功能. 绘制多边形(蓝色) ...

  3. 记录开发基于百度地图API实现在地图上绘制轨迹并拾取轨迹对应经纬度的工具说明

    前言: 最近一直在做数据可视化方面的工作,其中平面可视化没什么难度,毕竟已经有很多成熟的可供使用的框架,比如百度的echart.js,highcharts.js等.还有就是3D可视化了,整体来说难度也 ...

  4. Vue:如何在地图上添加自定义覆盖物(点)

    目录 如何在地图上添加自定义覆盖物(点) 首发日期:2019-1-25 如何在地图上添加自定义覆盖物(点) 此文重点是在地图上标点,所以就省去引入百度地图的步骤了. 先给一下最终的效果. 这个效果主要 ...

  5. 在谷歌地图上绘制行政区域轮廓【结合高德地图的API】

    实现思路: 1.利用高德地图行政区域API获得坐标列表 2.将坐标列表绘制在谷歌地图上[因为高德地图和国内的谷歌地图都是采用GCJ02坐标系,所有误差很小,可以不进行坐标误差转换] 注意点: 1.用百 ...

  6. GMap.Net开发之在地图上添加多边形

    上一篇介绍了在GMap上添加自定义标签(GMapMarker),这篇介绍在GMap上添加多边形(GMapPolyogn),并且介绍如何在地图上画任意的多边形. 如果已经知道了多边形的各个点的位置,就可 ...

  7. iOS开发之在地图上绘制出你运行的轨迹

    首先我们看下如何在地图上绘制曲线.在Map Kit中提供了一个叫MKPolyline的类,我们可以利用它来绘制曲线,先看个简单的例子. 使用下面代码从一个文件中读取出经纬度,然后创建一个路径:MKPo ...

  8. R语言绘图:在地图上绘制热力图

    使用ggplot2在地图上绘制热力图 ######*****绘制热力图代码*****####### interval <- seq(0, 150000, 25000)[-2] #设置价格区间 n ...

  9. R语言绘图:在地图上绘制散点图

    使用ggplot2在地图上绘制散点图 ######*****绘制散点图代码*****####### options(baidumap.key = '**************') #设置密钥 bei ...

随机推荐

  1. Python的多继承问题-MRO和C3算法

    大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...

  2. 11.DRF-权限

    Django rest framework源码分析(2)----权限 添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 ...

  3. SSM-框架搭建-tank后台学习系统

    一.前言 最近收到很多网友给我私信,学习软件开发有点吃力,不知道从何处开始学习,会点基础但是做不出来什么项目, 都想放弃了.我就回复道:当下互联网飞速发展,软件开发行业非常吃香而且前景相当不错.希望能 ...

  4. Linux上的Systemctl命令

    LinuxSystemctl是一个系统管理守护进程.工具和库的集合,用于取代System V.service和chkconfig命令,初始进程主要负责控制systemd系统和服务管理器.通过Syste ...

  5. SQL注入之Union注入攻击

    union联合查询算是最简单的一种注入了,但是却是经常遇到. 什么是UNION注入 UNION操作符用于合并两个或多个SELECT语句的结果集,而且UNION内部的SELECT语句必须拥有相同数量的列 ...

  6. 入门大数据---Spark_Streaming与流处理

    一.流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中.应用程序根据需要查询数据或计算数据.这就是传统的静态数据处理架构.Hadoop 采用 HDFS 进 ...

  7. js语法基础入门(1)

    1.基础入门 1.1.hello world 1.1.1.JavaScript是什么? JavaScript是一门跨平台.面向对象的轻量级脚本语言,在web开发中被广泛应用 1.1.2.JavaScr ...

  8. Django迁移命令无法生成mysql表

    数据库迁移问题:在执行python manage.py makemigrations迁移命令之后,正常输出并生成迁移文件,但执行python manage.py migrate之后显示,No migr ...

  9. 分享一个与jQuery相关的TypeError: $ is not a function问题解决过程

    最近碰到一个比较奇葩的问题,估计很多人也遇到过,就是jQuery可能会遇到的‘$ is not a function’,不过我碰到的这个问题比较怪异,解决该问题也颇费了一番周折,现在给大家分享一下. ...

  10. 关于前端数据&逻辑的思考

    最近重构了一个项目,一个基于redux模型的react-native项目,目标是在混乱的代码中梳理出一个清晰的结构来,为了实现这个目标,首先需要对项目的结构做分层处理,将各个逻辑分离出来,这里我是基于 ...