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)' }) }) ) sourcePoint .addFeatures([feature]) },
上边代码就是实现了在地图上以某点,某半径绘制一个圆形,但是半径不是很准确,如果有大佬解决了半径不准确的问题希望帮忙指点一下。
绘制多边形
这个地方说的绘制多边形是指鼠标手动绘制,绘制完成可以获得鼠标绘制多边形的顶点坐标。
绘制
首先绘制和上面一样,只要是图层,就哪几层才能显示在地图上,所以呢,先创建图层、数据源添加到地图,然后呢,因为是鼠标绘制,所以说需要设置一下绘制完成的多边形在地图上什么样式,然后在一个就是添加鼠标交互的工具,所以说就是下面的代码。
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实现绘制圆形和多边形 的文章就介绍到这了,更多相关Vue openlayers绘制圆形 多边形内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
这篇文章主要介绍了vue项目 使用Hbuilder打包app 设置沉浸式状态栏的方法,本文通过实例代码效果图展示给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下2018-10-10解决vue 使用axios.all()方法发起多个请求控制台报错的问题
这篇文章主要介绍了解决vue 使用axios.all()方法发起多个请求控制台报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-11-11vue-admin-box第一步npm install时报错的处理
这篇文章主要介绍了vue-admin-box第一步npm install时报错的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-10-10vue Router(v3.x) 路由传参的三种方式场景分析
vue 路由传参的使用场景一般都是应用在父路由跳转到子路由时,携带参数跳转,传参方式可划分为 params 传参和 query 传参,而 params 传参又可分为在 url 中显示参数和不显示参数两种方式,这就是vue路由传参的三种方式,感兴趣的朋友跟随小编一起看看吧2023-07-07vue.js开发实现全局调用的MessageBox组件实例代码
最近学习了Vue.js,感觉组件这个地方知识点挺多的,而且很重要,所以决定记录下,下面这篇文章主要给大家介绍了关于利用vue.js开发实现全局调用的MessageBox组件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。2017-11-11
最新评论