2012-03-19 4 views
3

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

+0

Какой выпуск OpenLayers вы используете? Можете ли вы проверить с помощью сетевых инструментов Fiddler/FireBug, что слой действительно запрашивается у сервера во второй раз. – AlexC

+0

ops ... Прошу прощения ... Я забыл одну строку в функции UpdateGlmLayer ... теперь это правильно. Я добавил glm.redraw(); в конце ... – manuele

ответ

5

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

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

3 Restyle Clicks, 1 data request

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

Однако установка resFactor из 3 + щелчок рестайлинг 3 раза дает этот результат: 3 Restyle Clicks, 4 data requests

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

Это, я считаю, поведение, которое вы видите. Это выглядит как ошибка для меня, так как в документации говорится, что все, что вы сделали, действительно. Глядя на код в Стратегии 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).

Я делаю 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

большой! NO resFactor решил мою проблему. Большое тебе спасибо! – manuele

+0

@manuele: дать ему кредит, подтвердив свой ответ и приняв его как ответ на ваш вопрос, нажав на галочку. – capdragon

+0

@capdragon: сделано! :) – manuele

Смежные вопросы