TRICK系列:Openlayers 中实现Draw通过键盘按键取消全部绘制、取消上一步绘制

前言

DrawOpenLayers中常用的一个组件,默认是单击绘制,双击结束绘制。

但是在实际工程中常常需要在绘制过程中使用按键来取消全部绘制、取消上一步绘制,如何做到呢?

闲言少叙,直接上干货。

原理

在draw中是不处理键盘的按键事件的,只有当鼠标的左右键按下的时候,才会触发ol/MapBrowserEvent 类的事件,所以我们无法使用Openlayers的机制来实现使用按键的目的。此时就需要引入方便又强大的jQuery了。通过jQuery监听document对象的按键事件,来实现我们取消全部或者取消上一步的绘制。

操作

直接上代码吧

import Map from 'ol/Map';
import View from 'ol/View';
import Draw from 'ol/interaction/Draw';
import {
    Tile as TileLayer,
    Vector as VectorLayer
} from 'ol/layer';
import {
    OSM,
    Vector as VectorSource
} from 'ol/source';
import $ from 'jquery'
var raster = new TileLayer({
    source: new OSM()
});

var source = new VectorSource({
    wrapX: false
});

var vector = new VectorLayer({
    source: source
});

var map = new Map({
    layers: [raster, vector],
    target: 'map',
    view: new View({
        center: [-11000000, 4600000],
        zoom: 4
    })
});

var typeSelect = document.getElementById('type');

var draw; // global so we can remove it later
function addInteraction() {
    var value = typeSelect.value;
    if (value !== 'None') {
        draw = new Draw({
            source: source,
            type: typeSelect.value,

        });
        map.addInteraction(draw);
    }
}

typeSelect.onchange = function () {
    map.removeInteraction(draw);
    addInteraction();
};
addInteraction();


$(document).keyup(function (event) {
    if (event.keyCode == 27)
        draw.abortDrawing();
    else if (event.keyCode == 90 && event.ctrlKey) {
        console.log(draw);
        if (typeSelect.value== 'Circle')
            draw.abortDrawing();
        else
            draw.removeLastPoint()

    }
})

需要注意的是,这个函数只有Openlayers 6.3之后才有,那么在之前的老版本里(比如5.x甚至6.0.x、6.1.x),需要自己把这个逻辑实现出来,重载Draw类添加一个abortDrawing()公有成员:

import Map from 'ol/Map';
import View from 'ol/View';
import Draw from 'ol/interaction/Draw';
import {
    Tile as TileLayer,
    Vector as VectorLayer
} from 'ol/layer';
import {
    OSM,
    Vector as VectorSource
} from 'ol/source';
import $ from 'jquery'


class DrawPlus extends Draw{
     constructor(options){
         super(options);
     } 
     abortDrawing() {
      this.abortDrawing_();
      }
}
   


var raster = new TileLayer({
    source: new OSM()
});

var source = new VectorSource({
    wrapX: false
});

var vector = new VectorLayer({
    source: source
});

var map = new Map({
    layers: [raster, vector],
    target: 'map',
    view: new View({
        center: [-11000000, 4600000],
        zoom: 4
    })
});

var typeSelect = document.getElementById('type');

var draw; // global so we can remove it later
function addInteraction() {
    var value = typeSelect.value;
    if (value !== 'None') {
        draw = new DrawPlus({
            source: source,
            type: typeSelect.value,

        });
        map.addInteraction(draw);
    }
}

typeSelect.onchange = function () {
    map.removeInteraction(draw);
    addInteraction();
};
addInteraction();


$(document).keyup(function (event) {
    if (event.keyCode == 27)
        draw.abortDrawing();
    else if (event.keyCode == 90 && event.ctrlKey) {
        console.log(draw);
        if (typeSelect.value== 'Circle')
            draw.abortDrawing();
        else
            draw.removeLastPoint()

    }
})

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

战斗中的老胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值