是否有正确的方法在OpenLayers 2中以编程方式移动单个顶点?
问题是,我需要阻止用户绘制无效(例如,自交叉)多边形。为此,我创建了一个函数来验证多边形,然后我在dragComplete
类的OpenLayers.Control.ModifyFeature
方法中验证多边形(我根据这个创建了自己的类)。
基本上,我在dragStart
方法中保存当前顶点位置,然后我在dragComplete
方法中验证多边形,如果多边形无效,我将顶点的坐标更改为坐标I&之前已经保存过。
它正在工作,顶点移回到前一个位置。但是拖动和旋转处理程序存在问题。这些处理程序并不关心这个顶点是否被移动,它们的位置被设置为具有这个错误顶点的几何体的中心(在移动之前)。当我拖动或旋转特征时,这两个处理程序都会返回到正确的位置。我需要在移动这个顶点时正确设置它们。
是否需要调用某些事件或方法才能使其正常工作?
这就是我在dragComplete
方法的开头所提出的。
dragComplete: function (vertex) {
if (this.feature.geometry.isValid &&
!this.feature.geometry.isValid()) {
vertex.geometry.x = this.vertexPosition.x;
vertex.geometry.y = this.vertexPosition.y;
this.layer.drawFeature(this.feature);
}
...
}
它正确地将顶点移动到给定位置。问题是它不会影响拖动处理程序和旋转处理程序。这是我尝试使用的,没有效果(它位于vertex.geometry.y = this.vertexPosition.y;
方法中的dragComplete
下方):
this.layer.events.triggerEvent('vertexmodified', {
feature: this.feature,
vertex: vertex
});
this.layer.events.triggerEvent('featuremodified', {
feature: this.feature
});
this.layer.events.triggerEvent('refresh');
this.onModification(vertex);
this.onModification(this.feature);
this.layer.drawFeature(vertex);
this.layer.redraw();
这些都不起作用。有没有办法让这些处理程序刷新?
答案 0 :(得分:0)
我设法创建了一个简单的解决方法 - 只需从rotate
对象调用geometry
方法,其中零角度和中心点为原点:
var bounds = this.feature.geometry.bounds;
var center = {
x: bounds.left + (bounds.right - bounds.left) / 2,
y: bounds.bottom + (bounds.top - bounds.bottom) / 2
};
this.feature.geometry.rotate(0, new OpenLayers.Geometry.Point(
center.x, center.y
));
也许这不是一个完美的方式,但它的工作:)