2011-01-27 10 views
0

私はWMSGetFeatureInfoポップアップは、ユーザーがマップ上のポイントをクリックするたびに出ているOpenLayersを/ GeoExtJSマップを持っています。ただし、ポップアップは、ユーザーのクリック時に設定された解像度で表示されないレイヤーでも結果を表示します。 OpenLayers layer.calculateInRange()はどのレイヤーが現在範囲内にあるかどうかを非常にうまく伝えますが、getfeatureinfoリクエストからそれらを削除する方法はわかりません...無効にWMSGetFeatureInfo

beforegetfeatureinfoを試しても動作しませんでした。

任意のアイデアは、本当に、素晴らしい:)

var layersToBeQueried = [layerA, layerB, layerC, layerD, layerE]; 

function removeLayersOutOfRange(layerArray) { 
    for (var i = 0; i < layerArray.length; i++) { 
     alert(layerArray[i].name); 
     if (layerArray[i].calculateInRange() == false) { 
      layerArray.splice(i, 1); 
     } 
    } 
    return layerArray; 
} 
var info = new OpenLayers.Control.WMSGetFeatureInfo({ 
    url: layerURL, 
    layerUrls: [layerURL], 
    title: 'Identify features by clicking', 
    queryVisible: true, 
    eventListeners: { 
     beforegetfeatureinfo: function (event) { 
      this.layers = removeLayersOutOfRange(layersToBeQueried); 
     }, 
     getfeatureinfo: function (event) { 

      if (event.text.length <= 687) { } else { 

       popup = new GeoExt.Popup({ 
        title: "Popup", 
        location: event.xy, 
        autoScroll: true, 
        height: $('#myViewPort').height() - 250, 
        maximizable: true, 
        collapsible: true, 
        map: mapPanel.map, 
        anchored: true, 
        html: '<div id="popupWrap"></div>', 
        listeners: { 
         close: function() { 
          // closing a popup destroys it, but our reference is truthy 
          popup = null; 
         } 
        } 
       }); 

       popup.show(); 

      }//end if 
     }//end getfeatureinfo 
    }//end eventListeners 
});//end OpenLayers.Control.WMSGetFeatureInfo 

mapPanel.map.addControl(info); 
info.activate(); 

おかげだろう

elshae

答えて

3

元の問題の解決策ではありませんが、removeLayersOutOfRange関数を再考する必要があります。スプライス配列を使用すると、ループ中に配列が変更され、インデックスも変更されます。これは、すべてのレイヤーを正しくループしないことを意味します。

私はそれを上渡す代わりに、入力配列の編集、新しい配列を作成示唆し、その配列に範囲内にあるレイヤーを押します。この(未テスト)のような

何か:

function removeLayersOutOfRange(layerArray){ 
    var retArray = new Array(); 
    for(var i = 0; i < layerArray.length; i++) { 
     //alert(layerArray[i].name); 
     if(layerArray[i].calculateInRange() == false){ 
      retArray.push(layerArray[i]); 
     } 
    } 
    return retArray; 
} 

今、あなたの元の問題を見てみます。おそらく層のロジックは、検索が完了したときに実行することができますか? getFeatureInfoメソッドでは、レイヤのロジックにどのレイヤが表示されているかを確認し、それらのレイヤの情報のみを使用してメッセージをコンパイルしますか?クエリレイヤーがうまくいけば、おそらくここでの犯人かもしれません。その経験を持っていない、唯一の...

+0

ありがとうございました!私の古い機能をあなたのものに切り替えるとすぐに、すべてが機能しているようです。私は配列を間違って繰り返していました:p – elshae

+0

すごく聞いてください! :-) –

2

を推測Iは、例えば、あなたがする必要があるすべてはWMSGetFeatureInfoに「レイヤー」パラメータを追加だと思います

var info = new OpenLayers.Control.WMSGetFeatureInfo({ 
        url: layerURL, 
        layers: [layersToBeQueried] 
        title: 'Identify features by clicking', 
        queryVisible: true, 
        infoFormat: 'application/vnd.ogc.gml' 
        ... 
}); 

とにかくOpenLayer 2.12とGeoServer 2.1で動作します。

関連する問題