OpenLayers 6 连点成线——限制只能在已有的点要素之间画线

我们有时候会遇到这样一种需求:地图上已经产生了一些点,需要手动在这些点之间画线连接。

在这里插入图片描述


在这里插入图片描述

分析:

我们知道OpenLayers原生的ol.interaction.Draw类型是无法支持这种限制的。于是仍然考虑在事件处理上找找机会:ol.interaction.Draw有一个属性condition,它的定义是一个函数,接受event作为参数(实际上只限于click类型的event),然后由函数的逻辑决定返回值ture还是false,以此通知控件是否处理本次点击绘制。
实现:

先在这里试试,在ol.interaction.Draw初始化的时候给condition赋值:

			condition: function(event) {
			let flag = 0;
			let features = map.getFeaturesAtPixel(event.pixel)
			features.some(element => {
				if (vSource.hasFeature(element)) {
					flag = 1;
					return true
				}
			});
			if (flag == 1) return true;
 
		}

先声明一个标志变量,然后用some对点击到的所有要素进行部分遍历(存在没有点击到的情况,所以用了一个标志变量),使用了hasFeature来判断迭代到的要素是不是我们目标图层里的点要素,如果是,就返回ture中断迭代过程。

在外面判断flag的值来确定上面的迭代过程有没有命中目标图层中的点要素,如果命中了,返回ture,通知draw组件“处理”本次点击,连线。

为了能准确点到目标图层的点要素,还需要向地图上添加一个snap交互组件,使得鼠标指针能够自动吸附到附近的点要素:

var snap = new ol.interaction.Snap({
			source: vSource
		})
		map.addInteraction(draw);
		map.addInteraction(snap);

最后的效果就是:
在这里插入图片描述

全部代码:

更多请见:http://www.mark-to-win.com/tutorial/175098.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenLayers是一个用于展示地图的JavaScript库,虽然它在绘制实时动态画线方面非常强大,但在处理大量数据时可能会出现性能问题,导致画线卡顿。 造成OpenLayers实时动态画线卡的原因可能有以下几: 1. 数据量过大:如果要绘制大量的实时动态画线,每次更新都需要重新计算和渲染,这会消耗大量的计算资源和内存,导致卡顿。 2. 频繁的数据更新:如果更新频率过高,比如每毫秒要绘制一次线,这会引起大量的重绘和渲染,从而影响性能。 3. 低效的代码实现:编写的代码可能存在一些低效的算法或循环,导致在遍历数据和绘制线时耗费更多的时间。 要解决OpenLayers实时动态画线卡顿的问题,可以尝试以下几种方法: 1. 数据分批加载:将大量的数据分成小批量加载,每次只绘制一部分数据,这样可以减少每次的计算和渲染量,提升性能。 2. 优化算法和循环:检查代码中可能存在的低效算法和循环,采用更高效的实现方式,减少耗时。 3. 减少更新频率:如果数据更新频率过高,并不是每次都需要实时更新画线,可以调整更新频率,根据需求间隔一定时间更新。 4. 利用Web Worker:将一些计算密集型的任务使用Web Worker来实现,这样可以将计算任务放到后台线程中,减少主线程的负担,提高画线的流畅性。 综上所述,OpenLayers实时动态画线可能会卡顿,但通过优化代码、分批加载数据、减少更新频率等方法,可以提升性能,减少画线的卡顿问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值