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被触发的颜色似乎马上改变但在此之后,系统停止大约与在初始页面加载时下载数据所用的时间相同。在这段时间内什么都不能做。有什么不对?
问题在于你设置了resFactor。我创建了两个演示地图,一个加载一些GeoServer GML矢量,并重新设置它们,而不使用resFactor 1设置,另一个使用resFactor 1设置,第二个绝对发送多个请求。如果您将resfactor设置为大于1的任何值,则不会发生这种情况。
否resFactor设定+点击restyle 3次给出了这样的结果:
只有1数据请求。
然而,3 +点击restyle 3次resFactor设置使该结果:
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();
}
你能分享你的build_style功能? – drnextgis 2012-03-19 10:27:25
您使用的是什么版本的OpenLayers?你能检查使用Fiddler/FireBug网络工具,该层确实是第二次从服务器请求。 – AlexC 2012-03-19 12:06:57
ops ...我请你原谅...我在UpdateGlmLayer函数中忘了一行...现在它是正确的。我已经添加了glm.redraw();最后... – manuele 2012-03-19 13:52:13