# vue 项目使用 openlayers根据半径绘制圆形、绘制多边形
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))
这里不贴图了
【重要说明】博文仅作为本人的学习记录,论点和观点仅代表个人而不代表技术的真理,目的是自我学习和有幸成为可以向他人分享的经验,因此有错误会虚心接受改正,但不代表此刻博文无误!
【博客园地址】叫我+V : http://www.cnblogs.com/wjw1014
【CSDN地址】叫我+V : https://wjw1014.blog.csdn.net/
【Gitee地址】叫我+V :https://gitee.com/wjw1014
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-06-17 Vue项目导入导出csv文件