2012-03-19 92 views
3

我需要的是一種在不下載數據的情況下修改矢量圖表示的方法。 我已經定義了一個GLM矢量圖層和一個名爲build_style的函數,以根據某些特徵對它們的幾何進行着色。我有一個調用它以這種方式定義的函數UpdateGlmLayer HTML表單:openlayers:重繪矢量圖層而不再次下載數據

function UpdateGlmLayer(info_str) { 
    var v = info_str.split("|"); 
    var filter_column = v[0]; 
    var values = [parseFloat(v[1]), parseFloat(v[2]), parseFloat(v[3])]; 
    glm.styleMap = build_style(filter_column, values); 
    glm.redraw(); 
}; 

的GLM層以這種方式定義:

gml_protocol = new OpenLayers.Protocol.HTTP({ 
    url: "http://localhost:8080/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typeName="+info["layer_featurePrefix"]+":"+info["layer_featureType"], 
    format: new OpenLayers.Format.GML() 
}) 

glm = new OpenLayers.Layer.Vector(info["layer_name"], { 
    strategies: [new OpenLayers.Strategy.BBOX({ratio: 3, resFactor: 1})], 
    protocol: gml_protocol, 
    styleMap: build_style(info["filter_property"], info["filter_values"]), 
    srsName: info["layer_srsName"], 
    projection: new OpenLayers.Projection("EPSG:4326"), 
    visibility: true 
}); 

當UpdateGlmLayer被觸發的顏色似乎馬上改變但在此之後,系統停止大約與在初始頁面加載時下載數據所用的時間相同。在這段時間內什麼都不能做。有什麼不對?

+0

你能分享你的build_style功能? – drnextgis 2012-03-19 10:27:25

+0

您使用的是什麼版本的OpenLayers?你能檢查使用Fiddler/FireBug網絡工具,該層確實是第二次從服務器請求。 – AlexC 2012-03-19 12:06:57

+0

ops ...我請你原諒...我在UpdateGlmLayer函數中忘了一行...現在它是正確的。我已經添加了glm.redraw();最後... – manuele 2012-03-19 13:52:13

回答

5

問題在於你設置了resFactor。我創建了兩個演示地圖,一個加載一些GeoServer GML矢量,並重新設置它們,而不使用resFactor 1設置,另一個使用resFactor 1設置,第二個絕對發送多個請求。如果您將resfactor設置爲大於1的任何值,則不會發生這種情況。

否resFactor設定+點擊restyle 3次給出了這樣的結果:

3 Restyle Clicks, 1 data request

只有1數據請求。

然而,3 +點擊restyle 3次resFactor設置使該結果: 3 Restyle Clicks, 4 data requests

4的數據請求。

這我相信是你看到的行爲。這看起來像一個bug,因爲文檔說明你所做的是有效的。看着在BBOX戰略js文件代碼中的問題似乎是在代碼:

var ratio = this.resolution/this.layer.map.getResolution(); 
invalid = (ratio >= this.resFactor || ratio <= (1/this.resFactor)); 

這是在.redraw()函數運行來計算是否需要重新加載數據。由於在重繪地圖時分辨率始終設置爲1(分辨率未更改,所以this.resolution === this.layer.map.getResolution()),則無效將始終等於true,因此圖層將重新加載。

resFactor

{浮法}可選用來確定何時先前請求 特徵是無效的因素。如果設置,resFactor將與之前請求的 分辨率進行比較,以當前地圖分辨率。如果 resFactor>(舊/新)和1/resFactor <(舊/新)。如果您設置了1的 resFactor,則每次分辨率 更改時都會請求數據。如果您將resFactor設置爲3,那麼如果舊分辨率是新分辨率的3倍,或者新分辨率是舊分辨率的3倍,則會請求數據。 如果舊邊界不包含新邊界,則新數據總是會被請求(有或沒有考慮resFactor) 。

我做restyles以下方式:

var style1, style2; 


style1 = new OpenLayers.Style({ 
       strokeColor: "yellow", 
       strokeWidth: 10 }); 


style2 = new OpenLayers.Style({ 
       strokeColor: "blue", 
       strokeWidth: 5 }); 

function restyle1() 
{ 
    layer.styleMap = style1; 
    layer.redraw(); 

} 

function restyle2() 
{ 
    layer.styleMap = style2; 
    layer.redraw(); 

} 
+0

太棒了!沒有resFactor解決了我的問題。非常感謝! – manuele 2012-03-19 13:55:34

+0

@manuele:通過點擊複選標記來表明他的答案並接受它作爲答案。 – capdragon 2012-03-21 15:43:07

+0

@capdragon:完成! :) – manuele 2012-05-15 06:50:20