- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 OpenLayers 中的 removeLastPoint()
函数修复我的应用程序问题。问题在于,在移动设备上,removeLastPoint()
正在以错误的顺序删除点。在桌面模式下一切正常。
Here是这个问题的解释。
让我用图片展示这个“按错误顺序删除点的问题”在实践中是如何工作的。
我们从绘制一些 LineString
开始:
我们现在有一个 LineString
,它是通过连接第 5 个点创建的。现在我尝试通过单击我的 removeButton
来调用 removeLatPoint()
函数,就像那样:
removeButton.on('click', () => {
draw.removeLastPoint(); // this function comes from ol.integration.Draw class
});
现在我期待得到这样的结果:
但是我得到了什么?我有这样的东西:
下一步我会得到:
接下来:
最后我只会得到第 5 点。
问题在于,在 OpenLayers
中,removeLastPoint()
函数不是移除最后一个点,而是移除它之前的一个点。
这是 OpenLayers
中的当前 removeLastPoint()
函数代码:
对我来说有问题的是这一行:coordinates.splice(-2, 1);
因为它就像我展示的那样工作。
我等不及这个问题的官方解决方案,所以我写了我的临时解决方案。在我的修复中,我在 removeLastPoint()
之前调用了我自己的函数,该函数正在删除最后一个坐标并复制它之前的坐标。就这样:
有一次区别。我正在使用 draw.extend(measureFeature);
函数在最后一个之前复制这个坐标,因为我必须刷新保存在私有(private)变量 this.sketchCoords_
中的信息在 OpenLayers
网站上。当我尝试以另一种方式进行操作时,this.sketchCoords_
仍然记得先前保存的绘制几何体状态,而不是为 myArray = 调用
然后调用 removeLastPoint()
['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
几何体编写的那样。
但是,如果 draw.extend()
仅适用于 LineString
几何图形,我如何通过注入(inject)修改后的坐标集合来更新 this.sketchCoords_
?
我不知道我该怎么做。 OpenLayers
中的类 Draw
对多边形没有任何有用的功能,这些多边形将更改或更新当前绘制的多边形。
Here充满了Draw
类。
您知道如何更新它并注入(inject)我修改后的坐标集合吗?
Here是我的 fiddle ,也许它会有所帮助。我不知道为什么,但在我的 fiddle 草图上总是空的,所以这个 fiddle 不能正常工作,但它可以稍微显示我的代码。
最佳答案
我又一次解决了我自己放到 StackOverflow 中的问题。太棒了!
那么让我介绍一下解决方案。
我说修改多边形后我需要更新 this.sketchCoords_
对象,因为没有它,OpenLayers
中的 removeLastPoint()
将起作用在旧坐标集合上。
如果 draw.extend()
仅适用于 LineString
几何图形,那么我必须找到另一种解决方案。
我找到了。
解决方案是:
编写自己的类以从来自 this.sketchCoords_
对象的 OpenLayers 中扩展类 Draw:
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];
仅此而已。
当代码从 OpenLayers
调用 removeLastPoint()
函数时,它会在 this.sketchCoords_ 中设置一个
对象。myNewCoordinates
集合
我把这个解决方案留给有类似问题的人。也许它会有所帮助。如果是,请给我的问题和答案投票。
关于javascript - 在 OpenLayers 中拥有多边形的 removeLastPoint() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54985377/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!