拥有OpenLayers中多边形的removeLastPoint()函数

问题描述 投票:0回答:1

我正在尝试使用OpenLayers中的removeLastPoint()函数修复我的应用程序问题。问题是在移动设备上removeLastPoint()正在删除错误订单上的点。在桌面模式下,一切都运行良好。

Here是这个问题的解释。

让我在图像上呈现这个“在错误的顺序上删除点的问题”它在实践中是如何工作的。

我们从绘制一些LineString开始:

enter image description here

我们现在有一个LineString,它是通过连接第5点创建的。现在我试图通过点击我的removeLatPoint()来调用removeButton函数,就像那样:

removeButton.on('click', () => {
   draw.removeLastPoint(); // this function comes from ol.integration.Draw class
});

现在我期待得到这样的结果:

enter image description here

但是我得到了什么?我有类似的东西:

enter image description here

在下一步我会得到:

enter image description here

在下一个:

enter image description here

最后,我只得到第5点。

enter image description here

问题是事实上,在OpenLayers removeLastPoint()函数正在删除不是最后一点,而是在它之前。

这是来自removeLastPoint()的当前OpenLayers函数代码:

enter image description here

问题是这条线对我来说:coordinates.splice(-2, 1);,因为它的工作就像我展示的一样。

enter image description here

我等不及正式解决这个问题所以我写了我的临时解决方案。在我的修复中,我在removeLastPoint()之前调用了我自己的函数,它正在移除最后一个坐标,并且复制了它之前的坐标。就像那样:

enter image description here

曾经存在差异。我正在使用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

enter image description here

我不知道我该怎么做。来自Draw的类OpenLayers对多边形没有任何有用的功能,它将改变或更新当前的绘图多边形。

Here充满了Draw级。

您有什么想法我如何更新它并注入我修改过的坐标集合?

Here是我的小提琴,也许它会有所帮助。我不知道为什么但是在我的小提琴草图上总是空的,所以这个小提琴不能很好地工作,但它能够显示我的代码。

javascript jquery gis openlayers
1个回答
0
投票

我再次解决了我自己在StackOverflow中遇到的问题。真棒!

那么让我提出解决方案。

我说在修改多边形后我需要更新this.sketchCoords_对象,因为没有它,来自removeLastPoint()OpenLayers将处理旧的坐标集合。

如果draw.extend()仅适用于LineString几何,那么我必须找到另一种解决方法。

我发现了它。

解决方案是:

  1. 编写自己的类来扩展来自OpenLayers的类来自this.sketchCoords_对象: declare namespace ol { namespace interaction { class ExtendedDrawClass extends ol.interaction.Draw { sketchCoords_?: ol.Coordinate | ol.Coordinate[] | ol.Coordinate[][]; } } }
  2. 然后只需在自己的代码中修改此集合。例如,就像那样: var myNewCoordinates = geometry.getCoordinates(); myNewCoordinates.split(-1,1); (<ol.Coordinate[][]>(<ol.interaction.ExtendedDrawClass>this.draw).sketchCoords_) = [myNewCoordinates];

就这样。

当代码从removeLastPoint()调用OpenLayers函数时,它有一个myNewCoordinates集合设置到this.sketchCoords_对象。

我为有类似问题的人留下了这个解决方案。也许它会有所帮助。如果是,那么请提出我的问答。

© www.soinside.com 2019 - 2024. All rights reserved.