2012-04-27 175 views
3

在OpenLayers中,我有一個集羣策略來限制用戶在地圖上看到的特徵/點數。但是,當用戶完全放大時,我想關閉聚類策略,以顯示所有功能。要做到這一點,我趕上變焦事件是這樣的: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(),但這沒有幫助。有任何想法嗎?

+0

請參閱[this](http://stackoverflow.com/questions/6457437/openlayers-cluster-recalculate/20050360#20050360)爲簡短方法的答案。 – Asad 2013-11-18 14:40:09

回答

2

我在這篇文章中找到了答案。 OpenLayers Cluster Recalculate

基本上,我需要設置集羣策略,然後「recluster」。作品一種享受。

4

請立即撥打層redraw()方法沒有地圖 - this.vector.redraw()

+0

謝謝,但我也嘗試過,它不起作用(儘管我認爲它應該!) – 2012-04-27 11:18:18

+1

我不確定,但您也可以嘗試調用圖層上的refresh()方法。我也會嘗試在策略上調用deactivate()方法,而不是設置高treshhold - this.vector.strategies [0] .deactivate()。您還可以嘗試收聽地圖的「movestart」而不是「zoomend」。我認爲功能尚未在移動開發中繪製,因此您有更好的機會防止事情發生。 – igorti 2012-04-27 11:39:22

+0

+1停用 – 2012-08-28 06:55:00

10

vectorlayer.refresh({force:true}); 試試這個。

+0

這工作完美。謝謝。 – 2013-01-29 02:05:06

+1

我發現在openlayers 3中,你需要調用源對象的刷新,而不是圖層。 – Isti115 2016-07-21 13:33:49

0

感謝這個文件,我解決了同樣的問題:CenteredCluster.js,我在<script src="... /OpenLayers.js"></script>之後加入。我從這個例子中捕獲到這個文件:http://jorix.github.io/OL-Ragbag/examples/sundials.html僅供參考:https://github.com/jorix/OL-Ragbag

然後我不使用集羣策略方法,但是可以使用ZoomRange選項設置文件的類CenteredCluster來控制集羣的行爲(激活,去激活,距離和treshold):

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)是REFR成功了。

有關於OL此功能,最大的問題這麼多不同的信息是,沒有人定義OL版本上的東西工程:)

希望這會幫助別人!

0

以前的答案都不適合我。我閱讀Open Layers 3 API,發現ol.layer.Vector.changed(),這對我有幫助。使用像:vectorLayer.changed()

相關問題