我的网络应用程序需要一个功能来撤销最后一点。有一些解决方案,例如 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-绘制线特征
我试了好几次,都成功了。如果您添加的点不靠近删除的点或添加的点不止一个,则不会发生这种情况。
编辑
似乎 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/