openlayers:重绘矢量图层而不再次下载数据

问题描述:

我需要的是一种在不下载数据的情况下修改矢量图表示的方法。 我已经定义了一个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

问题在于你设置了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