Javascript 撤消OL3中的最后一个点将删除最后一个线段
我需要在我的web应用程序中使用一个功能来撤消最后一点。已经有一些解决方案,例如对于给定的问题,可以在一定程度上解决它: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
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
方法。我将尝试更新我的答案以向您显示此选项。