2011-02-10 81 views
1

我目前使用OpenLayers(Vector和WMS)成功顯示多個圖層。 我的應用程序允許用戶修改一些參數,這將:
*修改勢必
*修改地圖中心
*修改WMS圖像
我使用Ajax來避免頁面重載,它工作得很好,但是當一些層需要一段時間才能加載,其他尚未重繪的圖像仍會顯示在背景中(但與我的新上下文無關)。 我想在重新向服務器請求新圖像之前清除WMS圖層(如果可能),但尚未找到任何東西。 我在矢量圖層上通過調用removeAllFeature();在OpenLayers上重繪之前清除WMS圖層

感謝您的幫助!

這裏是我的僞代碼,當用戶點擊該按鈕:

$.getJSON("url/updateMapConfig.php", 
    { 
     data: $(this).serialize() , 
     ajax: 'true', 
     cache: 'false' 
    }, 
    function(j){ 
     if (j.result == 'ok') { 
     var layersToShow = []; 
     // Refresh vector layer 
     for(var i=0;i<map.layers.length;i++) { 
      if (map.layers[i].isVector) { 
      map.layers[i].removeAllFeatures(); 
      map.layers[i].refresh({force:true}); // Vector layer 
      } 
     } 
     // Refresh visible layers 
     for(var i=0;i<map.layers.length;i++) { 
      if (map.layers[i].visibility && !map.layers[i].isBaseLayer && !map.layers[i].isVector) { // Refresh visible non base 
       map.layers[i].redraw(true); // Other layer 
      } 
     } 
     // Set new bounds 
     var bounds = new OpenLayers.Bounds(); 
      bounds.extend(new OpenLayers.LonLat(j.bounds.xmin-100, j.bounds.ymin-100)); 
      bounds.extend(new OpenLayers.LonLat(parseInt(j.bounds.xmax)+100, parseInt(j.bounds.ymax)+100)); 
     map.zoomToExtent(bounds); 
     // Move to destination point 
     if (j.poiCenter != "") { 
      eval("map.setCenter(new OpenLayers.LonLat("+j.poiCenter+"))"); 
     } 
     } 
    } 
); 

回答

1

我終於找到了利用每一層的clearGrid()函數重繪他們面前的大團圓結局。

我還發現,如果任何正在運行該功能將停止瓦負載。 示例我有兩個基礎層:EmptyLayer和WhateverTiledBGLayer。 如果花了20s加載WhateverTiledBGLayer圖塊,即使用戶選擇切換到空圖層,我也可以看到WhateverTiledBGLayer上的剩餘圖塊向服務器發出了請求。

簡單的調用WhateverTiledBGLayer.clearGrid()將停止請求層。

感謝您的幫助。

1

我會用mergeNewParams設置PARAM,使層的拉絲坯料。該方法觸發圖層的重繪。當您的回調從您的更新請求返回時,您會做相反的操作,使其再次正確繪製圖層。

(我已經做了類似這樣的東西,但我沒有源現在)

編輯:

或者 - 當然 - 隱藏與層的visibility屬性層。 :-)

+0

謝謝,我試過:map.layers [i] .setVisibility(false); \t \t \t \t \t map.layers [i]中。setVisibility(真);然而,這層仍然保留,直到重繪,足夠奇怪。我會嘗試mergeNewParams – 2011-02-11 08:43:10

+0

也許你必須在設置可視性時強制重繪?儘管看起來不太可能... – 2011-02-11 10:48:41

0

你可以相應地監聽WMS層的loadstart和loadend事件和隱藏/顯示層。

快速測試結果顯示,雖然你不能設置圖層的可見性爲false loadstart因爲的OpenLayers就停止請求層新的圖像,它永遠不會被完全加載。你可以嘗試使用layer.display(false/true),看看它是否能解決你的問題。代碼應該是這個樣子:

yourWmsLayer.events.on({ 
     "loadstart" : function(){ 
      this.display(false); 
     }, 
     "loadend" : function(){ 
      this.display(true); 
     } 
    }); 

順便說一句,如果你不設置transitionEffect您的WMS層上的「調整」,那麼默認行爲是舊圖片被刪除之前,新的問題也加載。這不是你想要的嗎?