我正在尝试使用OpenLayers中的removeLastPoint()
函数修复我的应用程序问题。问题是在移动设备上removeLastPoint()
正在删除错误订单上的点。在桌面模式下,一切都运行良好。
Here是这个问题的解释。
让我在图像上呈现这个“在错误的顺序上删除点的问题”它在实践中是如何工作的。
我们从绘制一些LineString
开始:
我们现在有一个LineString
,它是通过连接第5点创建的。现在我试图通过点击我的removeLatPoint()
来调用removeButton
函数,就像那样:
removeButton.on('click', () => {
draw.removeLastPoint(); // this function comes from ol.integration.Draw class
});
现在我期待得到这样的结果:
但是我得到了什么?我有类似的东西:
在下一步我会得到:
在下一个:
最后,我只得到第5点。
问题是事实上,在OpenLayers
removeLastPoint()
函数正在删除不是最后一点,而是在它之前。
这是来自removeLastPoint()
的当前OpenLayers
函数代码:
问题是这条线对我来说:coordinates.splice(-2, 1);
,因为它的工作就像我展示的一样。
我等不及正式解决这个问题所以我写了我的临时解决方案。在我的修复中,我在removeLastPoint()
之前调用了我自己的函数,它正在移除最后一个坐标,并且复制了它之前的坐标。就像那样:
曾经存在差异。我正在使用draw.extend(measureFeature);
函数在此之前复制此坐标,因为我必须刷新已保存在this.sketchCoords_
站点上的私有变量OpenLayers
中的信息。当我试图在另一方面这样做时,this.sketchCoords_
仍然记得以前保存的绘制几何状态,而不是为removeLastPoint()
调用myArray = ['1','2','3','4','4']
然后它要求myArray = ['1','2','3','4','5']
。因此,我必须使用draw.extend()
复制当前的最后一项并更新this.sketchCoords_
。
这是我自己解决这个问题的方法:
removeButton.on('click', () => {
if (this.isMobileDevice) {
this.removeLastPoint();
}
this.draw.removeLastPoint();
});
removeLastPoint() {
let measureFeature = this.sketch;
measureFeature = measureFeature.clone();
const geom = measureFeature.getGeometry();
if (geom instanceof ol.geom.LineString) {
const coords = geom.getCoordinates();
let preparedCoords: [number, number][] = new Array();
if (coords) {
preparedCoords = coords;
preparedCoords.splice(-1, 1);
geom.setCoordinates(preparedCoords);
measureFeature.setGeometry(geom);
if (preparedCoords.length > 0) {
this.draw.extend(measureFeature);
}
}
} else if (geom instanceof ol.geom.Polygon) {
}
}
我的修复工作正如我所执行的那样。在调用removeLastPoint()
删除多余的项目后,我有一个正确的集合。
这是开始我真正的问题。多边形。在多边形removeLastPoint()
函数也不能很好地工作,我们有同样的问题,删除错误的点(不是最后但在它之前)。
因此,我将编写一个类似的机制来修改多边形坐标,就像我为LineString
几何体所写的那样。
但是,如果this.sketchCoords_
仅适用于draw.extend()
几何,我如何通过注入修改后的坐标集来更新LineString
?
我不知道我该怎么做。来自Draw
的类OpenLayers
对多边形没有任何有用的功能,它将改变或更新当前的绘图多边形。
Here充满了Draw
级。
您有什么想法我如何更新它并注入我修改过的坐标集合?
Here是我的小提琴,也许它会有所帮助。我不知道为什么但是在我的小提琴草图上总是空的,所以这个小提琴不能很好地工作,但它能够显示我的代码。
我再次解决了我自己在StackOverflow中遇到的问题。真棒!
那么让我提出解决方案。
我说在修改多边形后我需要更新this.sketchCoords_
对象,因为没有它,来自removeLastPoint()
的OpenLayers
将处理旧的坐标集合。
如果draw.extend()
仅适用于LineString
几何,那么我必须找到另一种解决方法。
我发现了它。
解决方案是:
this.sketchCoords_
对象:
declare namespace ol {
namespace interaction {
class ExtendedDrawClass extends ol.interaction.Draw {
sketchCoords_?: ol.Coordinate | ol.Coordinate[] | ol.Coordinate[][];
}
}
}
var myNewCoordinates = geometry.getCoordinates();
myNewCoordinates.split(-1,1);
(<ol.Coordinate[][]>(<ol.interaction.ExtendedDrawClass>this.draw).sketchCoords_) = [myNewCoordinates];
就这样。
当代码从removeLastPoint()
调用OpenLayers
函数时,它有一个myNewCoordinates
集合设置到this.sketchCoords_
对象。
我为有类似问题的人留下了这个解决方案。也许它会有所帮助。如果是,那么请提出我的问答。