openlayers: перерисовать векторный слой без повторной загрузки данных - PullRequest
3 голосов
/ 19 марта 2012

Мне нужен способ изменить представление векторного слоя без повторной загрузки данных. Я определил векторный слой 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, кажется, что цвета меняются сразу, но после этого система останавливается примерно на то же время, которое потребовалось для загрузки данных при начальной загрузке страницы. Ничего нельзя сделать за это время. Что-то не так?

1 Ответ

5 голосов
/ 19 марта 2012

Проблема с настройкой resFactor.Я создал две демонстрационные карты: одна загружает несколько векторов GeoServer GML и выполняет их рестайлинг без настройки resFactor 1, а другая - с настройкой resFactor 1, а вторая, безусловно, отправляет несколько запросов.Если вы установите для коэффициента выше 1, этого не произойдет.

Нет настройки resFactor + нажатие на рестайл 3 раза дает такой результат:

3 Restyle Clicks, 1 data request

Только 1 запрос данных.

Однако настройка resFactor3 + нажатие рестайла 3 раза дает такой результат: 3 Restyle Clicks, 4 data requests

4 запроса данных.

Я считаю, что такое поведение вы наблюдаете.Для меня это похоже на ошибку, так как в документации сказано, что вы сделали правильно.Глядя на код в js-файле стратегии BBOX, проблема, похоже, заключается в коде:

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

{Float} Необязательный коэффициент, используемый для определения того, когда ранее запрошенные функции были недействительными.Если установлено, resFactor будет сравниваться с разрешением предыдущего запроса с текущим разрешением карты.Если resFactor> (старый / новый) и 1 / resFactor <(старый / новый).Если вы установите resFactor 1, данные будут запрашиваться каждый раз, когда изменяется разрешение.Если вы установите resFactor 3, данные будут запрашиваться, если старое разрешение в 3 раза больше нового, или если новое в 3 раза больше старого.Если старые границы не содержат новых границ, всегда будут запрашиваться новые данные (с учетом или без учета resFactor). </p>

Я делаю рестайлы следующим образом:

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

}
...