2012-12-17 70 views
2

我正在使用GeoExt,OpenLayers開發一個Web應用程序,並擁有自己的GeoServer來爲各種地圖服務。不過,如果需要,我想讓用戶添加其他WMS,以便能夠播放所有期望的圖層。WMS GetFeatureInfo;多層次,不同的來源

因此,我的問題與GetFeatureInfo請求。現在我有連接到geoext的地圖面板,工具欄按鈕,

new GeoExt.Action({ 
      iconCls: "feature", 
      map: map, 
      toggleGroup: "tools", 
      tooltip: "Feature", 
      control: featureControl    
     }) 

其控制屬性是

var featureControl = new OpenLayers.Control.WMSGetFeatureInfo({ 
      queryVisible: true, 
      drillDown: true, 
      infoFormat:"application/vnd.ogc.gml" 
     }); 

我還定義的事件監聽器做什麼,我真的想一旦我得到的答覆,但這在這裏不重要。我的問題如下:

考慮到用戶點擊有2個可見圖層並且其中至少有一個來自不同源的點,OpenLayers將必須針對不同來源執行一個AJAX請求,並且從的OpenLayers自己的文檔,當接收到的GetFeatureInfo響應

觸發。事件 對象具有包含響應正文(字符串)的文本屬性,帶有已解析功能數組的 功能屬性,帶有觸發 請求的鼠標單擊或懸停事件位置的xy屬性 ,以及請求本身的請求屬性。如果drillDown 設置爲true,並且發出多個請求以收集來自所有圖層的功能 信息,則文本和請求將僅包含上次請求的響應 正文和請求對象。

所以,是的,它顯然不會像那樣馬上工作。看看調試器,我可以清楚地看到,從不同的來源獲得兩層,它實際上做了請求,它只是不等待第一個響應,並跳到下一個(顯然是異步)。我曾經想過一個接一個地完成請求,也就是說完成上述第一個請求,一旦完成並保存響應,請繼續下一個請求。但是我仍然習慣了GeoExt使用的數據結構。

是否有任何API(不論是GeoExt還是OpenLayers)選項/我缺少的方法?任何不錯的解決方法?

感謝您閱讀:-)

PS:對不起,如果我沒有得到足夠清晰,英語不是我的母語。如果上述內容不夠清楚,請告知我:)

回答

0

GetFeatureInfo請求會作爲JavaScript Ajax調用發送到外部服務器。所以,出於安全原因,請求可能會被阻止。您必須通過您自己的域上的代理將請求發送到外部服務器。

然後,通過將OpenLayers.ProxyHost設置爲正確的路徑,在openlayers中配置此代理。例如:

OpenLayers.ProxyHost = "/proxy_script"; 

更多的背景信息,請參閱http://trac.osgeo.org/openlayers/wiki/FrequentlyAskedQuestions#ProxyHost

4

我希望這個幫助給別人,我意識到:你是rigth這個控制使異步模式下的請求,但這是好的,沒有問題,真正的問題是當控制處理請求和觸發事件「的GetFeatureInfo」所以,我修改了2種方法對這種控制和它的作品!所以要做到這一點我首先聲明的控制,然後在野蠻模式我修改方法這裏是德代碼:

getInfo = new OpenLayers.Control.WMSGetFeatureInfo({ drillDown:true , queryVisible: true , maxFeatures:100 }); 
    //then i declare a variable that help me to handle more than 1 request..... 
getInfo.responses = []; 
getInfo.handleResponse=function(xy, request) {  var doc = request.responseXML; 
    if(!doc || !doc.documentElement) { doc = request.responseText; } 
    var features = this.format.read(doc); 
    if (this.drillDown === false) { 
     this.triggerGetFeatureInfo(request, xy, features); 
    } else { 
     this._requestCount++; 
     this._features = (this._features || []).concat(features); 
     if(this._numRequests > 1){ 
          //if the num of RQ, (I mean more than 1 resource), i put the Request in array, this is for maybe in a future i could be need other properties or methods from RQ, i dont know. 
      this.responses.push(request);} 
     else{ 
      this.responses = request;} 
     if (this._requestCount === this._numRequests) { 
      //here i change the code.... 
      //this.triggerGetFeatureInfo(request, xy, this._features.concat()); 
      this.triggerGetFeatureInfo(this.responses, xy, this._features.concat()); 
      delete this._features; 
      delete this._requestCount; 
      delete this._numRequests; 
      // I Adding this when the all info is done 4 reboot 
      this.responses=[]; 
     } 
    } 
} 

getInfo.triggerGetFeatureInfo= function(request , xy , features) { 
//finally i added this code for get all request.responseText's 
if(isArray(request)){ 
    text_rq = ''; 
    for(i in request){ 
     text_rq += request[i].responseText; 

     } 
    } 
else{ 
    text_rq = request.responseText; 

    } 

    this.events.triggerEvent("getfeatureinfo", { 
     //text: request.responseText, 
     text : text_rq, 
     features: features, 
     request: request, 
     xy: xy 
    }); 

    // Reset the cursor. 
    OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");} 

謝謝,你給我帶來了一種發現我的問題的方法,這裏是我解決問題的方式,我希望這可以幫助別人。

+0

和我soooobad英語遺憾:S – saheka

+0

哇,謝謝您詳細的解答!我會檢查它,看看它是否也適用於我,並且如果是這樣,請將您的答案標記爲正確:-) –

1

saheka的回答幾乎完美!祝賀並感謝你,我遇到了同樣的問題,並且我終於設法解決了這個問題。

我會在你的代碼更改:

  • IsArray的()不工作,改變這樣的:如果(的instanceof陣列要求){...}在getInfo.triggerGetFeatureInfo的第一行( )
  • 顯示在這個彈出的結果是這樣的:

我的代碼:

getInfo.addPopup = function(map, text, xy) { 
    if(map.popups.length > 0) { 
     map.removePopup(map.popups[0]); 
    } 
    var popup = new OpenLayers.Popup.FramedCloud(
     "anything", 
     map.getLonLatFromPixel(xy), 
     null, 
     text, 
     null, 
     true 
    ); 
    map.addPopup(popup); 
} 

,並在getInfo.triggerGetFeatureInfo()函數,最後一行後,追加:

this.addPopup(map, text_rq, xy);