【问题标题】:openlayers: redraw vector layer without downloading data againopenlayers:重绘矢量图层,无需再次下载数据
【发布时间】:2012-03-19 10:20:06
【问题描述】:

我需要的是一种无需再次下载数据即可修改矢量图层表示的方法。 我已经定义了一个 GLM 矢量图层和一个名为 build_style 的函数来根据某些特征为它们的几何图形着色。我有一个 HTML 表单,它调用以这种方式定义的函数 UpdateGlmLayer:

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 时,颜色似乎会立即更改,但之后系统停止的时间与在初始页面加载时下载数据所用的时间大致相同。这段时间什么都做不了。有什么问题吗?

【问题讨论】:

  • 你能分享你的 build_style 函数吗?
  • 您使用的是什么版本的 OpenLayers?您能否使用 Fiddler / FireBug 网络工具检查该图层是否确实第二次从服务器请求。
  • ops...对不起...我忘记了 UpdateGlmLayer 函数中的一行...现在它是正确的。我添加了 glm.redraw();最后...

标签: javascript gis openlayers


【解决方案1】:

问题在于你的 resFactor 设置。我创建了两个演示地图,一个加载一些 GeoServer GML 矢量并在没有 resFactor 1 设置的情况下重新设置它们的样式,另一个使用 resFactor 1 设置,第二个肯定是发送多个请求。如果您将 resfactor 设置为 1 以上的任何值,则不会发生这种情况。

没有 resFactor 设置 + 点击 restyle 3 次得到这个结果:

只有 1 个数据请求。

但是,resFactor 设置为 3 + 单击重新样式 3 次会产生以下结果:

4 个数据请求。

我相信这就是您所看到的行为。这对我来说似乎是一个错误,因为文档说您所做的事情是有效的。查看BBOX策略js文件中的代码问题似乎出在代码中:

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

这是在 .redraw() 函数上运行,以计算是否需要重新加载数据。因为当您重绘地图时 ratio 将始终设置为 1(分辨率未更改,因此 this.resolution === this.layer.map.getResolution() ),因此 invalid 将始终等于 true ,因此图层重新加载.

反应因子

{Float} 用于确定先前请求时间的可选因素 功能无效。如果设置,resFactor 将与 上一个请求的分辨率到当前地图的分辨率。如果 resFactor >(旧/新)和 1/resFactor

我正在以下列方式重新设计样式:

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();

}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多