Javascript 撤消OL3中的最后一个点将删除最后一个线段

Javascript 撤消OL3中的最后一个点将删除最后一个线段,javascript,openlayers-3,undo,Javascript,Openlayers 3,Undo,我需要在我的web应用程序中使用一个功能来撤消最后一点。已经有一些解决方案,例如对于给定的问题,可以在一定程度上解决它: 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.ge

我需要在我的web应用程序中使用一个功能来撤消最后一点。已经有一些解决方案,例如对于给定的问题,可以在一定程度上解决它:

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;
    }
});
但似乎有一个bug或一些我无法理解的东西

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

如果使用一些顶点绘制一条线,然后撤消(按ESC键),直到删除线上的最后一个点,然后在刚刚撤消的同一点处(或足够近)完成该线,最后一段将被删除,为什么

以数字说明:

1-绘制线特征

2-撤消最后(第三)点

3-在(或接近)同一点完成生产线。

4-最后一段被删除。

我试了好几次,结果都发生了。如果添加的点与删除的点不接近或添加多个点,则不会发生此情况

编辑

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

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会假定图形已完成并触发Dround事件(出于某些目的,我有此事件,但令人惊讶的是,它是无原因触发的)

尝试更改这段代码:

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();
}
};

我无法重现这种行为,如果你播放一段屏幕视频会更容易。您的图像序列看起来不像相同的字符串。@JonatasWalker:希望这有帮助…@JonatasWalker:您有时间看一下视频吗?我仍在为这个问题挣扎。如果您有任何见解,我们将不胜感激!是的,我知道了,我认为你和@pavlos已经达成了解决方案。我将尝试更深入的研究。创建plunker时,没有
removeLastPoint
。你应该相信它。那么geometryFunction应该是什么呢?我设法重现了你的案例。切片(0,-1)在我看来并不正确,因为切片需要起点和终点。所以-1这不是一个合适的终点,除非我遗漏了什么。我已经在你的宝藏里改变了这一点,而且似乎已经完成了任务。你试过了吗?也许你不需要geometryFunction+1,因为我也在考虑删除geometryFunction,但我不确定是否需要,因为我需要它来解决其他问题。否则,-1和length-1在切片函数中没有区别。这是正确的。请在w3schools
上阅读,使用负数从数组末尾进行选择
很抱歉,我不知道。至少我们学到了一些东西:(()()())。另外,您是否设法解决了此问题???您始终可以使用
removeLastPoint
方法。我将尝试更新我的答案以向您显示此选项。