Отмена последней точки в OL3 удаляет последний сегмент

Мне нужна функциональность в моем веб-приложении для отмены последней точки. Были некоторые решения, такие как 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, вы можете попробовать, что я собираюсь объяснить:

Если вы нарисуете линию с некоторыми вершинами и затем отмените (нажмите ESC) до тех пор, пока последняя точка на линии не будет удалена, а затем закончите линию (или достаточно близко к ней), то же самое, что только что отменено, последний сегмент будут удалены, почему?

объясняется цифрами:

1. Рисование функции линии

введите описание изображения здесь

2- уничтожение последней (третьей) точки введите описание изображения здесь

3- завершение линии в (или закрытии) той же точки. введите описание изображения здесь

4 - последний сегмент удален. введите описание изображения здесь

Я пробовал это несколько раз, и это случается. Это не произойдет, если вы добавите точку, не близкую к удаленному, или добавьте несколько точек.

Edit

Кажется, что 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 предполагает, что чертеж закончен и запускает событие рисования (у меня есть это событие для некоторых целей, но удивительно запускается без причины).

Ответы

Ответ 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();
    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();
}
};