javascript - 撤消 OL3 中的最后一点会删除最后一段

标签 javascript openlayers-3 undo

我的网络应用程序需要一个功能来撤销最后一点。有一些解决方案,例如 this对于可以在一定程度上处理它的给定问题:

var undo = false; // set this to true in the Esc key handler
var draw = new ol.interaction.Draw({
// ...
geometryFunction: function(coords, geom) {
    if (!geom) {
        geom = new ol.geom.LineString(null);
    }
    if (undo) {
        if (coords.length > 1) {
            coords.pop();
        }
        undo = false;
    }
    geom.setCoordinates(coords);
    return geom;
    }
});

但似乎有一个错误或我无法弄清楚的东西。

使用这个 plunker你可以尝试我要解释的内容:

如果您绘制一 strip 有一些顶点的线,然后撤消(按 ESC)直到线上的最后一个点被删除,然后在(或足够接近)刚被撤消的同一点处完成线,最后一段会被移除,为什么?

用数字解释:

1-绘制线特征

enter image description here

2- 撤消最后(第三)点 enter image description here

3- 在同一点完成(或关闭)线。 enter image description here

4-删除最后一段。 enter image description here

我试了好几次,都成功了。如果您添加的点不靠近删除的点或添加的点不止一个,则不会发生这种情况。

编辑

似乎 OL3 检查了几何体的最后两个坐标,如果它们相同,则决定结束绘图 session ,并删除最后一个。我尝试了以下代码:

function geometryChange(coordinates, geometry){
if (!geometry) {
    geometry = new ol.geom.LineString(null);   
} 
if (undo){
    var coords = geometry.getCoordinates();
    console.info(coords);
    console.info(coordinates);
    var diff = coordinates.length - coords.length;
    if (diff > 0) {
        var lastCoordinates= coordinates[coordinates.length-1];
        console.info(coordinates);
        coordinates.splice(coordinates.length - (diff+1), diff,lastCoordinates);
        console.info(coordinates);
        coordinates.pop();
        console.info(coordinates);
        undo=false;
        if (coords.length === 1){
            undone=true;
            lineStringdraw.finishDrawing();
            undone=false;
            var emptyFeature = vector2.getSource().getFeatures()[vector2.getSource().getFeatures().length-1];
            vector2.getSource().removeFeature(emptyFeature);
            featureID-=1;
        }
    }
}
//console.info(coordinates);
geometry.setCoordinates(coordinates);
//coordinates= geometry.getCoordinates();
return geometry;    
}

结果更有趣。当我撤消最后一点时,当我只想添加一个接近该点的点(而不是通过双击完成线条)时,OL 假设绘图已完成并触发 drawend 事件(出于某些目的我有这个事件但令人惊讶的是无故触发)。

最佳答案

尝试更改这段代码:

var keydown = function(evt){
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode === 27 && drawing === true){ //esc key
    var geom = drawing_feature.getGeometry();
    geom.setCoordinates(geom.getCoordinates().slice(0, -1));
}
};

为此:

var keydown = function(evt){
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode === 27 && drawing === true){ //esc key
    var geom = drawing_feature.getGeometry();
    var coordsLength = geom.getCoordinates().length;
    geom.setCoordinates(geom.getCoordinates().slice(0, coordsLength-1));
}
};

如果您可以使用removeLastPoint 方法,那么请尝试以下操作

var keydown = function(evt){
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode === 27 && drawing === true){ //esc key
draw.removeLastPoint();
}
};

关于javascript - 撤消 OL3 中的最后一点会删除最后一段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34490722/

相关文章:

python - 尝试用 pyqtgraph 做一个简单的撤消方法

javascript - 如何撤消最后选中的复选框?

javascript - 元标记影响动画 Bootstrap 图标栏不显示,但是当我删除时,它在移动响应时没有隐藏侧边栏

javascript - 如何在 JavaScript 中设置日期格式?

javascript - 如何让 TinyMce 用内联样式替换已弃用的标签?

openlayers-3 - OL3 : Getting overlayed layers by coordinate

javascript - React hooks - useState() 中的状态在路由更改时不会重置

javascript - Openlayers 3 停止事件传播

javascript - 添加功能事件

javascript - 试图在 p5js 中存储 'undo' 函数的数组值