OpenLayers仅在鼠标moveend后重绘

时间:2011-02-14 12:10:52

标签: javascript openlayers

在这种情况下,我使用OpenLayers 2.10中的Map控件。在地图上我有基础层 具有自定义功能的OpenLayers.Layer.OSMOpenLayers.Layer.Vector。现在,当我使用鼠标移动地图时,以前不可见的功能将不会重新绘制,直到释放鼠标按钮。我在所有OpenLayers示例中都注意到了同样的问题。任何人都可以提供某种改变这种行为的工作吗?我想要实现的是在功能变得可见之后立即绘制功能或者总是绘制所有功能(我使用少量功能,因此地图控制的性能并不重要)。

我目前的想法是在地图上处理某些特定事件(例如点击鼠标移动)并强制重绘功能。

4 个答案:

答案 0 :(得分:6)

更新

由于可靠性原因,v2.11中引入了SVG2渲染器,然后立即弃用(请参阅this pull request)。对于OL> = 2.12,设置图层的ratio属性,使其在更宽的区域内渲染所有要素,作为屏幕尺寸的比例。权衡是性能,如果您的用户在某个方向“抛出”他们的地图,他们将飞过这些功能,但在那时他们可能会有一些渲染延迟。

new OpenLayers.Layer.Vector("My Layer", {
    ratio: 2
});

原始答案

来自http://lists.osgeo.org/pipermail/openlayers-dev/2011-March/007345.html

  

新的OpenLayers.Renderer.SVG2渲染器执行您要求的操作。它可以在主干上使用(将在2.11中)。要使用它,请为OpenLayers.Layer.Vector配置渲染器数组,如下所示:

new OpenLayers.Layer.Vector("My Layer", {
    renderers: ["SVG2", "VML", "Canvas"]
});
     

或者在原型上设置它:

     

OpenLayers.Layer.Vector.renderers = ["SVG2", "VML", "Canvas"];

     

请注意,VML(在IE6,7,8中使用)和Canvas(在Android设备上使用)的行为类似于Renderer.SVG,并且在平移时不会绘制功能。

答案 1 :(得分:0)

我没有解决方案,但做了一个观察。在OL示例网站上的Vector Behavior上查看此示例,如果要素部分可见(即放置在视口的边框上),则在拖动到完整视图时它们将保持部分隐藏。仅在释放鼠标按钮时完全可见。我的观点是,这似乎是一个显示问题,而不是负载问题,如果这已经不明显......

会密切关注这个问题,对答案很好奇。 : - )

答案 2 :(得分:0)

万一有人偶然发现这个问题(正如我所做的那样),OpenLayers 2.11解决了这个问题。我在我的网络应用程序上测试了它,它现在立即重绘了矢量功能,而安装了旧版本的OL,它会执行上面所写的操作。我之前从来没有注意到的东西,要么是如此好看,要发现它!

以下是发行说明。

http://trac.osgeo.org/openlayers/wiki/Release/2.11/Notes

这种方式表明了它的实际效果。最好的例子我觉得我很害怕:P

http://openlayers.org/dev/examples/rotate-features.html

答案 3 :(得分:0)

使用OpenLayer v6.4.3,您可以设置VectorLayer的以下属性:

  • updateWhileAnimating布尔值(默认为false)设置为true时,将在动画过程中重新创建功能批次。这意味着将不会显示任何裁剪的矢量,但是此设置会对大量矢量数据产生性能影响。设置为false时,将在没有动画激活时重新创建批次。
  • updateWhileInteracting布尔值(默认为false)设置为true时,将在交互期间重新创建要素批次。另请参见updateWhileAnimating。