1

現在、OpenLayers (Vector および WMS) を使用して複数のレイヤーを正常に表示しています。私のアプリケーションでは、ユーザーがいくつかのパラメーターを変更できます。これにより、次 の
こと
が 行われます。まだ再描画されていないものはまだ背景に表示されています (ただし、新しいコンテキストとはまったく関係ありません)。サーバーに新しいイメージを再要求する前に (可能であれば) WMS レイヤーをクリアしたいのですが、まだ何も見つかりませんでした。removeAllFeature(); を呼び出して、ベクター レイヤーでこれを行います。

助けてくれてありがとう!

ユーザーがボタンをクリックしたときの擬似コードは次のとおりです。

$.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+"))");  
        }  
      }  
    }  
);  
4

3 に答える 3

2

mergeNewParamsを使用して、レイヤーを空白にするパラメーターを設定します。そのメソッドは、レイヤーの再描画をトリガーします。更新リクエストからコールバックが返ってきたら、反対のことを行ってレイヤーを再び正しく描画します。

(これと似たようなことをしたことがありますが、今のところソースはありません)

編集:

または、もちろん、レイヤーの可視性プロパティを使用してレイヤーを非表示にします。:-)

于 2011-02-10T17:21:10.017 に答える
1

再描画する前に、すべてのレイヤーで clearGrid() 関数を使用して、最終的にハッピーエンドを見つけました。

また、実行中のタイルがある場合、この関数がタイルの読み込みを停止することもわかりました。例 私は 2 つの基本レイヤーを持っていました: EmptyLayer と WhateverTiledBGLayer です。ユーザーが空のレイヤーに切り替えることを選択した場合でも、WhateverTiledBGLayer タイルを読み込むのに 20 秒かかった場合、WhateverTiledBGLayer の残りのタイルのサーバーに対して要求が行われたことがわかりました。

単純にWhateverTiledBGLayer.clearGrid()を呼び出すと、レイヤーのリクエストが停止します。

手伝ってくれてありがとう。

于 2011-02-22T16:10:57.990 に答える
0

WMS レイヤーの loadstart および loadend イベントをリッスンし、それに応じてレイヤーを非表示/表示することができます。

簡単なテストでは、loadstart でレイヤーの可視性を false に設定できないことが示されました。これは、OpenLayers がレイヤーの新しい画像の要求を停止し、レイヤーが完全に読み込まれないためです。ただし、layer.display(false/true) を試して、問題が解決するかどうかを確認できます。コードは次のようになります。

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

ところで、WMS レイヤーで transitionEffect を「サイズ変更」に設定しない場合、デフォルトの動作では、新しい画像が読み込まれる前に古い画像が削除されます。それはあなたが望むものではありませんか?

于 2011-02-11T07:54:42.830 に答える