百度地图通过DrawingManager.js改造绘制电子围栏,圆形、矩形、多边形、行政区域。( 方式2)

本文主要是介绍百度地图通过DrawingManager.js改造绘制电子围栏,圆形、矩形、多边形、行政区域。( 方式2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

故事:在新项目中,还是需要绘制围栏,由于前面使用的vue-BMap 官方方式进行围栏绘制,虽说比较灵活,但代码量比较大,而且手工敲的代码量太大,因此进行第二中电子围栏的绘制探索。

注意:本文章是居于项目已引入百度地图前提下,如未引入百度地图请自行引入,此处省略。

步骤一:

1、在static文件目录下引入控件代码和控件代码所需的图片,css文件,建议引入为整个lib文件。

注意:文件内有几个图片路径全称需要修改为自身项目全称,例如

 var centerIcon = new BMap.Icon('/XXX/static/js/lib/images/circenter.png', new BMap.Size(20, 20));

2、在项目index.html文件全局引用DrawingManager.js

    <script type="text/javascript" src="/XXXWeb/static/js/lib/DrawingManager.js"></script>

如下图所示:

步骤二:

打开DrawingManager.js控件,搜索“改造”二字进行围栏绘制完成后调用自己本地方法进行获取参数等等(具体内容可自行三次改造)

步骤三:在本地代码/模块进行绘制(行政区域选择请参考上篇文章,结合自身项目和下方代码中的绘制行政区域围栏),具体代码如下

<!-- 插入围栏 --><div class="position-crwl" v-show="!trackShow"><el-dropdown @command="createFences"><el-button type="primary" class="commom-font-size">插入围栏</el-button><el-dropdown-menu slot="dropdown"><el-dropdown-item command="circular">圆形</el-dropdown-item><el-dropdown-item command="rectangular">矩形</el-dropdown-item><el-dropdown-item command="polygon">多边形</el-dropdown-item><el-dropdown-item command="administration">按行政区域</el-dropdown-item></el-dropdown-menu></el-dropdown></div>methods:{//绘制围栏(弹出围栏信息弹窗)createFences(item) {let self = this;//行政围栏直接选择区域if (item == 'administration') {//自身项目选择行政区域逻辑,实现行政区域选择可参考上篇文章return;}let styleOptions = {strokeColor: "#5E87DB", // 边线颜色fillColor: "#5E87DB", // 填充颜色。当参数为空时,圆形没有填充颜色strokeWeight: 2, // 边线宽度,以像素为单位strokeOpacity: 1, // 边线透明度,取值范围0-1fillOpacity: 0.2, // 填充透明度,取值范围0-1};let labelOptions = {borderRadius: "2px",background: "#FFFBCC",border: "1px solid #E1E1E1",color: "#703A04",fontSize: "12px",letterSpacing: "0",padding: "5px",};// 创建鼠标绘制工具self.drawingManager = new BMapLib.DrawingManager(self, self.map, {// isOpen: true, //是否开启绘制模式enableCalculate: false, // 绘制是否进行测距(画线时候)、测面(画圆、多边形、矩形)drawingToolOptions: {enableTips: true,customContainer: "selectbox_Drawing",hasCustomStyle: true,offset: new BMap.Size(5, 5), // 偏离值scale: 0.8, // 工具栏缩放比例drawingModes: [BMAP_DRAWING_RECTANGLE,BMAP_DRAWING_POLYGON,BMAP_DRAWING_CIRCLE,],},enableSorption: true, // 是否开启边界吸附功能sorptionDistance: 20, // 边界吸附距离enableGpc: true, // 是否开启延边裁剪功能enbaleLimit: false, // 是否开启超限提示// limitOptions: {//     area: 50000000 // 面积超限值// },circleOptions: styleOptions, // 圆的样式polylineOptions: styleOptions, // 线的样式polygonOptions: styleOptions, // 多边形的样式rectangleOptions: styleOptions, // 矩形的样式labelOptions: labelOptions, // label的样式});var arr = document.getElementsByClassName("bmap-btn");for (var i = 0; i < arr.length; i++) {arr[i].style.backgroundPositionY = "0";}switch (item) {case "marker": {var drawingType = BMAP_DRAWING_MARKER;break;}case "polyline": {var drawingType = BMAP_DRAWING_POLYLINE;break;}case "rectangular": {var drawingType = BMAP_DRAWING_RECTANGLE;break;}case "polygon": {var drawingType = BMAP_DRAWING_POLYGON;break;}case "circular": {var drawingType = BMAP_DRAWING_CIRCLE;break;}}// 进行绘制if (self.drawingManager._isOpen &&self.drawingManager.getDrawingMode() === drawingType) {self.drawingManager.close();} else {self.drawingManager.setDrawingMode(drawingType);self.drawingManager.open();}},//此处是DrawingManager.js文件绘制完成点击确认后调用的方法,具体请查看该文件openFenceModal(type, path, region, radius, overlay) {let self = this;let valswitch (type) {case 'circle'://圆形circle==circular,后台是使用‘circular’//自己后续实现逻辑break;//由于DrawingManager.js中矩形类型为rectangle,需要在此更改符合打开的字段,原则上rectangular==rectanglecase 'rectangle'://矩形//自己后续实现逻辑break;case 'polygon'://多边型//自己后续实现逻辑break;case 'administration'://行政//自己后续实现逻辑break;default:break;}},// 绘制行政区域(value为中文行政区域地址,例如广东省广州市),具体使用情况结合自身项目drawRegion(value) {let self = this;if (!value) {this.$message({message: "操作失败,请选择区域",type: "error",});return;}var bdary = new BMap.Boundary();bdary.get(value, (rs) => {//获取行政区域self.map.clearOverlays(); //清除地图覆盖物var count = rs.boundaries.length; //行政区域的点有多少个if (count === 0) {alert("未能获取当前输入行政区域");return false;}var pointArray = [];for (var i = 0; i < count; i++) {// console.log(rs.boundaries[i]);var ply = new BMap.Polygon(rs.boundaries[i], {strokeColor: '',strokeWeight: '',strokeOpacity: '0.35',strokeStyle: 'dashed',fillColor: '',fillOpacity: '0.35'}); //建立多边形覆盖物var str = JSON.stringify(ply.ia); //将BMap获取的行政区边界经纬度转为字符串self.map.addOverlay(ply); //添加覆盖物pointArray = pointArray.concat(ply.getPath());}self.map.setViewport(pointArray); //调整视野});return true;},}

注意:DrawingManager.js中的self为页面引用new BMapLib.DrawingManager(this, this.map, {})传入的this

效果图如下:

这篇关于百度地图通过DrawingManager.js改造绘制电子围栏,圆形、矩形、多边形、行政区域。( 方式2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/488875

相关文章

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程