美文网首页开源
OpenLayers测量加强版

OpenLayers测量加强版

作者: 写前端的大叔 | 来源:发表于2020-01-07 16:14 被阅读0次

最近一直在忙着做一个OpenLayers的项目,好久没来更新了,趁今天有时间来分享一下加强版的测量工具。代码主要是借助官网提供的demo来开发的,只是在demo上多加了两上功能。
1:长度测量时每个节点添加长度范围,仿百度的。
2:总长度的Tip上添加一个清空的按钮。
具体的效果如下所示:

测量.png

1:添加长度节点

具体思路是在开始绘制的时候,首先给地图添加一个singleclick的点击事件,当测量的时候,每点击一下,就会生成一条线,在点击的时候顺便生成一个UI元素,添加到Overlay上。具体实现步骤如下:

  1. 添加点击事件
singleClick = map.on('singleclick', singleclickHandler);
  1. 添加Overlay
    首先定义一个变量,以图形的数量作为key来缓存节点,方便删除的时候来清空对应图形上的节点信息。
    具体代码实现如下所示:
function addLengthOverlay(tooltipCoord,length) {
    var lengthElement = document.createElement('div');
    lengthElement.className = 'ol-tooltip ol-tooltip-length ol-length-bg';
    // lengthElement.className = 'ol-tooltip ol-tooltip-measure';
    var arr = Object.keys(cache);
    var id = arr.length;//获取图形缓存的长度
    lengthTooltip = new Overlay({
        element: lengthElement,
        offset: [0, -15],
        // positioning: 'bottom-center'
    });
    var lengthOverlayArr = lengthOverlays[id];//获取节点数据
    if(!lengthOverlayArr){//为空时重新创建
        lengthOverlayArr = [];
    }
    lengthOverlayArr.push(lengthTooltip);//保存节点信息
    lengthOverlays[id] = lengthOverlayArr;

    lengthTooltip.setPosition(tooltipCoord);
    if(length === 0 || length === '0 m'){//起点
        lengthElement.innerHTML = '起点';
    }else{
        lengthElement.innerHTML = length
    }
    map.addOverlay(lengthTooltip);
}
  1. 移除点击事件
    当绘制完成后,需要移除点击事件,防止业务做其它点击事件时有冲突。在绘制drawend方法中调用unByKey(singleClick);来移除添加的点击事件。

2.清空图层

当点击Tip上的关闭按钮时,可以删除该缓冲图层,主要是通过将前面绘制时缓存的图形总数做为关闭按钮的id,通过该id可以方便的找到对应的图形,然后再清空相应的元素和 Overlay即可。

const onDrawEnd = function () {
    var closeEelement = document.createElement('img');
    closeEelement.src = closeImg;
    closeEelement.className = 'close-btn'
    measureTooltipElement.appendChild(closeEelement);
    var arr = Object.keys(cache);
    var id = arr.length;
    closeEelement.id = id;
    var obj = {
        vector:vector,
        measureTooltip:measureTooltip
    }
    cache[id] = obj;
    closeEelement.addEventListener('click',function (event) {
        var id = this.id;
        var tipObj = cache[id];
        tipObj.vector.getSource().clear();//清空图形
        map.removeLayer(tipObj.vector);//清空临时图层
        map.removeOverlay(tipObj.measureTooltip);//清空TIP
        var array = lengthOverlays[id];
        if(array){
            array.forEach(item =>{
                map.removeOverlay(item);//清空节点
            })
        }

    },false)
}

个人博客

相关文章

网友评论

    本文标题:OpenLayers测量加强版

    本文链接:https://www.haomeiwen.com/subject/gharactx.html