OpenLayers: 如何在更改矢量图层后刷新地图

11
在OpenLayers中,我使用聚类策略来限制用户在地图上看到的特征/点的数量。但是,当用户完全缩放时,我希望关闭聚类策略,以便显示所有特征。为此,我通过以下方式捕获缩放事件:
map.events.register("zoomend", this, function (e) {
    if (map.getZoom() === this.mapMaxZoom) {
        // Don't cluster at this level. No matter what.
        this.vector.strategies[0].threshold = 1000;
        console.log("setting the clustering strategy to 1000");
    }
});

这个方法有点用,但是我没有看到新的聚类应用 - 我必须再次缩小地图才能看到聚类变为1000(从而显示所有特征)。我需要一种强制openlayers刷新的方法。我已经尝试调用map.redraw(),但没有帮助。有什么想法吗?

9个回答

15

vectorlayer.refresh({force:true}); 试一下。


7
在OpenLayers 3中,您需要在源对象上调用refresh而不是图层。 - Isti115

6
您应该在图层而不是地图上调用redraw()方法 - this.vector.redraw()

谢谢,但我也尝试过了,但它没有起作用(虽然我认为它应该!) - Matt Roberts
1
我不确定,但你也可以尝试在图层上调用refresh()方法。我还会尝试在策略上调用deactivate()方法,而不是设置高阈值 - this.vector.strategies[0].deactivate()。你也可以尝试监听地图的“movestart”而不是“zoomend”。我认为在movestart时要素还没有被绘制,所以你有更好的机会防止事情发生。 - igorti

5

对于 openlayers > 3

vectorlayer.getSource().refresh()

3

我在这篇文章中找到了答案:OpenLayers簇重新计算

基本上,我需要设置集群策略,然后"重新聚类"。 这很有效。


2

之前的答案都对我没用。我查看了Open Layers 3的API,找到了ol.layer.Vector.changed(),这对我很有帮助。使用方法如下:vectorLayer.changed()


1
要解决这个问题,只需要使用map.updateSize();

请问您能否解释一下在哪里以及如何使用它,以及为什么这可以解决问题? - Sadık

1
在OL3中,通过调用图层的源刷新(refresh())方法来刷新它。

layer.getSource().refresh()


1
我通过使用文件CenteredCluster.js解决了同样的问题,我在<script src="... /OpenLayers.js"></script>后引入该文件。我从此示例中获取了该文件:http://jorix.github.io/OL-Ragbag/examples/sundials.html 参考链接: https://github.com/jorix/OL-Ragbag 然后我没有使用集群策略方法,而是使用了该文件的类CenteredCluster,您可以使用ZoomRange选项设置该类以控制群集的行为(激活、去激活、距离和门槛)。
   var centeredCluster = new OpenLayers.Strategy.CenteredCluster({
zoomSettings: [
    {zoomRange: [0, 2], settings: {distance: 10}},
    {zoomRange: [3, 4], settings: {distance: 10}},
    // 5 normal clusters
    {zoomRange: [6, 14], settings: {threshold: 2}},
    {zoomRange: [15, 99], settings: {enabled: false}}
]
});

 var urlKMLClient = 'features.kml'; 
 var layerKMLClient = new OpenLayers.Layer.Vector("Clients", {
      style : style,

     strategies: [centeredCluster, new OpenLayers.Strategy.BBOX()],
    protocol: new OpenLayers.Protocol.HTTP({
        url: urlKMLClient,
        format: new OpenLayers.Format.KML({
            extractStyles: true, 
            extractAttributes: true,
            maxDepth: 2
        })
    })
}
);
     map.addLayer(layerKMLClient);

0
在 OL 3.10.1 中,我执行以下操作:
WMSLayer.getSource().updateParams({"time": Date.now()});
WFSLayer.clear();

两个图层(WMSWFS)都成功刷新了。

关于这个功能在OL中的不同信息很多,最大的问题是没有人定义一个OL版本来确定某些功能是否可用 :)

希望这能帮助到某些人!


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