如何通过编程方式移动OpenLayers矢量?

9
OpenLayers.Feature.Vector的API文档表示,Vector本身没有任何方法。
我知道如何让用户通过将OpenLayers.Control.DragFeature控制器添加到地图上来移动矢量。因此,如果用户可以移动矢量,则必须有一种以编程方式移动它的方法。但我无法弄清楚如何做到这一点。
2个回答

12

您可以通过调用其geometry对象上的方法来移动OpenLayers.Feature.Vector对象,而不是直接对矢量进行操作。这些方法包括move、rotate、resize和transform。

请注意,您在OpenLayers.Geometry基础对象中找不到任何这些方法的定义,只能在适当的子对象上找到(请注意,在OpenLayers几何图形中有多个继承级别)。OpenLayers.Geometry.Collection 是一个很好的例子。

您可以在此处找到一个很好的以编程方式移动OpenLayers矢量的示例。


1
好的,我现在能够使用 OpenLayers.Geometry.Point.move() 方法来移动要素一定距离。但是我需要把要素移动到特定位置。有简单的方法可以做到这一点吗?还是我必须计算需要移动的距离? - Rene Saarsoo
move 方法通过偏移几何图形的 x 和 y 属性来实现。如果您使用的是 Point(如上所示),则可以执行以下操作:function movePoint(point, x, y) { point.x = x; point.y = y; point.clearBounds(); }您可以在此处查看移动点源代码:http://trac.openlayers.org/browser/trunk/openlayers/lib/OpenLayers/Geometry/Point.js处理更复杂的几何图形将需要更多的工作。请查看 Collection 的移动实现:http://trac.openlayers.org/browser/trunk/openlayers/lib/OpenLayers/Geometry/Collection.js - atogle
顺便问一下,这个 point.clearBounds() 方法怎么样?API文档中好像没有记录。我真的应该使用它吗? - Rene Saarsoo
好的。我想最好还是先移除这个功能,然后把它添加回一个新位置。不想依赖未记录的方法。 - Rene Saarsoo
geom.clearBounds() 只是将 bounds 属性设置为 null,同时也会清空父几何体的 bounds 属性。当一个几何体作为另一个几何体的组件添加时,就会设置父属性。请参见 http://trac.openlayers.org/browser/trunk/openlayers/lib/OpenLayers/Geometry.js 当文档稀缺时,能够阅读源代码将使您受益匪浅。祝好运! - atogle
clearBounds()很重要,因为OpenLayers维护着矢量要素边缘的缓存,所以如果您将一个要素移动到新位置而不重置其边界,则放大它可能会导致它消失,因为已知不在新视口中的矢量被隐藏了。 - Lucent

7
这对我起了作用:
geometry.move(Y_NextPosition - Y_CurrentPosition, X_NextPosition - X_CurrentPosition)

看起来你可以直接设置点的xy值,避免那种不必要的计算。 - Andrew Mao
你的几何对象 feature 是 feature.geometry 还是其他什么?我尝试了这个但不起作用,为什么呢?:var feature = vectorLayer.getFeatureById(id); feature.geometry.move(lon, lat); @danielB - Ismail Yavuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接