vue 项目使用 openlayers根据半径绘制圆形、绘制多边形

这个地方我就简单点写吧,因为一些东西比较乱,有的包啥的就按照官网API开发文档根据报错提示自己添加就可以了,我这个地方就不重复写了。

绘制圆形

这里的绘制圆是指当后台返回数据,告诉你以某个经纬度坐标为圆心,或者是顶点,以 r 为半径绘制,不是鼠标手动绘制。

首先绘制圆,首先有一个数据源和一个图层来存放绘制的圆形,这个很简单。然后创建变量自己该就可以,我估计都搞openlayer了,这些基础应该不至于不知道,我这边就写关键代码,我想应该没问题,我用的是默认3857坐标,不是4326。

sourcePoint = new VectorSource()   // 创建数据源
layerPoint = new VectorLayer({     // 创建图层zIndex: 1,   // 图层的层级
})
layerPoint.setSource(sourcePoint)  // 把数据源绑定到图层上面
map.addLayer(layerPoint)  // 把图层添加到地图上面去

好的,通过上面的代码实现了创建一个图层在地图上来放置绘制的圆形。

接下来就是向这个数据源去添加圆形,这个呢,还是嘛,和我之前写的博客差不多,那几部分相互嵌套,我还是把图在贴一下吧,这个图是大佬整理的,我直接拿来用了。


通过上面图看,刚刚我们做的,往地图上添加 layer 图层完成了,向 layer 添加 source 数据源也完成了。下一步就是往 source 中添加 feature 了。

   // 绘制圆形addCircle() {let feature = new Feature({title: 'beijing',geometry: new Circle(fromLonLat([116.400819, 39.916263]), this.getRadius(500)),  // 创建 以[116.400819, 39.916263]为圆心,500米为半径的圆,但是这个半径不是很准,没解决了})feature.setStyle(new Style({fill: new Fill({color: 'rgba(32, 157, 230, 0.5)'})}))feature.setId('1233')  // 设置 feature 的ID值feature.set('data', {  // 设置其他的数据name: 'wjw',})sourcePoint .addFeatures([feature])},
// 半径计算getRadius(radius) {let metersPerUnit = map.getView().getProjection().getMetersPerUnit();let circleRadius = radius / metersPerUnit;return circleRadius;},

上边代码就是实现了在地图上以某点,某半径绘制一个圆形,但是半径不是很准确,如果有大佬解决了半径不准确的问题希望帮忙指点一下。

鼠标移入修改样式

哎哟,写了一遍,忘记保存了,麻蛋,从新着这个地方。

上边我们在 openlayer 上面绘制了一个圆形,但是我想在鼠标移入的时候,圆变色,移出之后,颜色变回来,怎么整呢?

其实很简单,就是设置一下鼠标移动事件,监听鼠标有没有移动到圆上面,如果移动到了就获取这个圆的 feature,然后设置他的颜色,当移出之后再设置回来。

       map.on('pointermove', ev => {let pixel = ev.pixel  // 获取鼠标移动的位置let feature = map.forEachFeatureAtPixel(pixel, (feature) => {return feature   // 根据位置查找有没有圆})if (feature) {  // 如果有, feature 就是那个圆的feature,直接修改样式就行map.getTargetElement().style.cursor = 'pointer'  // 设置鼠标变成小手指let pointData = feature.get('data')  // 获取圆设置的数据// ... 然后是其他逻辑} else {  // 如果没有,表示鼠标移出了圆map.getTargetElement().style.cursor = ''   // 取消鼠标小手指的样式// ... 其他逻辑代码}})

绘制多边形

这个地方说的绘制多边形是指鼠标手动绘制,绘制完成可以获得鼠标绘制多边形的顶点坐标。

绘制

首先绘制和上面一样,只要是图层,就哪几层才能显示在地图上,所以呢,先创建图层、数据源添加到地图,然后呢,因为是鼠标绘制,所以说需要设置一下绘制完成的多边形在地图上什么样式,然后在一个就是添加鼠标交互的工具,所以说就是下面的代码。

     source = new VectorSource();vector = new VectorLayer({source: source,style: new Style({fill: new Fill({color: 'rgba(255, 255, 255, 0.2)',}),stroke: new Stroke({color: '#ffcc33',width: 3,}),image: new CircleStyle({radius: 3,fill: new Fill({color: '#ffcc33',}),}),}),});map.addLayer(vector)modify = new Modify({ source: source });snap = new Snap({ source: source });draw = new Draw({source: source,type: 'Polygon',});

上边代码呢,实现了图层初始化和交互工具的初始化,接下来就是鼠标绑定事件绘制。

     map.addInteraction(modify);map.addInteraction(draw);map.addInteraction(snap);draw.on('drawend', e => {//绘画完成触发时间const geometry = e.feature.getGeometry()const corrdinates = geometry.getCoordinates()let points = []corrdinates[0].forEach(item => {let xy = transform(item, 'EPSG:3857', 'EPSG:4326')  // 转换成经纬度坐标points.push(xy)})this.$message.success('顶点坐标是:' + JSON.stringify(points))map.removeInteraction(draw);  //移除交互map.removeInteraction(snap);  //移除交互map.removeInteraction(modify);  //移除交互});

编辑多边形

再次编辑的话,这个就很简单了,上一步不是移除了三个吗?第一个是鼠标绘制,编辑的时候除了鼠标绘制,其他两个移除的交互再加上就可以了。

map.addInteraction(modify);
map.addInteraction(snap);

完成绘制

绘制完成的话,在移除交互工具,然后重新获取一下顶点坐标列表就可以了。

     map.removeInteraction(draw);//移除绘画互动map.removeInteraction(snap);//移除绘画互动map.removeInteraction(modify);//移除绘画互动let feature = source.getFeatures()[0]const geometry = feature.getGeometry()const corrdinates = geometry.getCoordinates()let points = []corrdinates[0].forEach(item => {let xy = transform(item, 'EPSG:3857', 'EPSG:4326')points.push(xy)})this.$message.success('顶点坐标是:' + JSON.stringify(points))

这里不贴图了

vue 项目使用 openlayers根据半径绘制圆形、绘制多边形相关推荐

  1. 如何在vue项目中使用echarts和高德地图绘制折线和热力图

    1.先下载相关的依赖,这里echarts和高德地图放到一起.(高德地图需要先去申请一个key) // The Vue build version to load with the `import` c ...

  2. 关于VUE项目地图开发中大量点标记绘制一些总结

    问题说明 在地图开发中,当地图中绘制大量的标记点后,无论是拖动或者缩放,都会感觉到明显的卡顿现象.(一般超过800个点后就比较明显了).在平时的工作业务中,由于公司的实时监控页面需要展现5000-20 ...

  3. vue全局引入openlayers_vue项目中openlayers绘制行政区划

    vue项目中openlayers画行政区划(区域范围),供大家参考,具体内容如下 原理 在地图上画需要的范围,实际上就是在地图上打上一圈点,然后依次将这些点用线连接,就形成了范围 引用相应的ol模块 ...

  4. openlayers根据半径绘制圆形,多圆连线并标记距离

    openlayers根据半径绘制圆形,多圆连线并标记距离 实现一个什么效果呢,就是在openlayers上面,绘制三个圆形,绘制完成之后,三个圆心连接起来,然后标记出每两个圆心之间的距离. 期望效果: ...

  5. vue项目引入百度地图BMapGL鼠标绘制和BMap辅助工具

    目录 引言 1.引用百度地图 2.在项目中使用百度地图 2-1.页面结构部分 2-2.js逻辑部分 3-1.页面结构部分 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架.它旨 ...

  6. 064:vue+openlayers根据坐标来显示点、线段、圆形、多边形(代码示例)

    第064个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中根据坐标信息来显示点.线段.圆形以及多边形. 直接复制下面的 vue+openlayers源代码,操作2分钟 ...

  7. 【VUE项目实战】9、创建登录组件并绘制布局

    接上篇<8.登录与退出功能开发准备(二)> 上一篇讲解了登录模块的开发的前置准备工作,本篇来正式开发登录模块. 一.创建登录组件并渲染 下面我们创建一个根组件,并将根组件渲染到App根组件 ...

  8. 【vue项目使用echarts实现区域地图绘制,且可点击单独区域】

    vue项目使用echarts实现区域地图绘制,且可点击单独区域 - 菜鸟程序员的总结 - 博客园

  9. android+动态地图+效果图,Android百度地图绘制圆形,圆形半径可动态变化

    问题:百度地图绘制圆形,圆形半径可随进度拖动条发生改变 思路:圆形本身是一个覆盖物,可参考百度地图Demo中的OverlayDemo.java这个类进行实现.完成画圆之后,圆形半径如何随着进度条的拖动 ...

最新文章

  1. SAP EWM - 包装主数据 - 包装明细 -2
  2. 打印给定字符串中字符的所有排列
  3. jmeter5.1.1启动提示not able to find java executable or version的解决办法
  4. 聚合 aggregate
  5. OpenShift 4 - DevSecOps Workshop (4) - 为 Task 增加参数和Workspace
  6. ionic中定义路由的问题
  7. html中logo不变形,CSS3如何实现LOGO中的文本变形动画
  8. 一个Ext2+SWFUpload做的图片上传对话框收藏
  9. SpringBoot 发送邮件和附件(实用版)
  10. 打算做知识付费,所有了解一下视频加密
  11. 什么是论文陈述?论文陈述怎么写?
  12. android 怎么选择audio hal
  13. 1.1 迷茫的大学——《逆袭大学》连载
  14. 目标检测经典论文——YOLOv3论文翻译:YOLOv3: An Incremental Improvement(YOLOv3:增量式的改进)
  15. JS逆向基础知识个人总结
  16. Asus Prime B360M-A+i5-8400+RX 570 黑苹果efi引导文件
  17. 收下这份秘籍:如何提高投稿命中率
  18. keil仿真逻辑分析仪观察引脚变化
  19. unix程序员手册_推荐几本实惠电子书,程序员读的经典书都有,比如deep learning...
  20. 采用两阶段Faster RCNN算法,引入light head的思想

热门文章

  1. Arduino读取GPS模块
  2. 什么是“国家中小企业公共服务示范平台”?
  3. 为什么很多企业都在使用短信群发?原来是有3大好处!
  4. 【xitongshoucang.com】全方位对Shift键大揭秘
  5. STM32 IAP升级(bootLoader)
  6. 酷派5860s 游戏合集贴
  7. 写给前端初学者的Vue入门教程
  8. 如果win10 硬盘依然经常100%使用率 务必请安装achi驱动。
  9. 计算机硬盘对计算机速度的影响,实测加密软件BitLocker对硬盘性能有何影响
  10. 无法启动此程序,因为计算机中丢失rtl70.bpl怎么修复教程