Страница 1 из 1

OL: атрибутивная выборка

Добавлено: 09 ноя 2010, 13:41
Denis Rykov
Есть векторный слой (загруженный локально из файла). Как можно отобразить только те объекты, что удовлетворяют определенному условию (OpenLayers.Filter.Comparison похоже работает только при http запросах)?

Re: OL: атрибутивная выборка

Добавлено: 09 ноя 2010, 14:27
Mavka
Классы OpenLayers.Filter служат для создания фильтров:

Код: Выделить всё

filter = new OpenLayers.Filter.Comparison({
    type: OpenLayers.Filter.Comparison.EQUAL_TO,
    property: 'name',
    value: 'Vasya',
}); 
эквивалентно "name = Vasya". Можно создавать вложенные условия (count < 5) AND (country = "russia"). Кстати, по логике они очень близки к OGC Filter Encoding.

Далее этот фильтр нужно куда то "применить". Я, например, из этих фильтров создаю длинные гирлянды стилей и сохраняю их на сервере в виде SLD. Можно использовать в запросах WMS/WFS по типу inline SLD и во внутреннем формате стилей для векторного слоя. Но сами по себе они ничего не делают.

Re: OL: атрибутивная выборка

Добавлено: 09 ноя 2010, 14:47
Mavka
Непосредственно по вопросу. Попробуйте создать стиль, в котором указаны только нужные объекты:

Код: Выделить всё

var new_style = new OpenLayers.Style();

var rule = new OpenLayers.Rule({
    filter: new OpenLayers.Filter.Comparison({
        type: OpenLayers.Filter.Comparison.EQUAL_TO,
        property: 'country',
        value: 'russia',
    }),
    symbolizer: {pointRadius: 10, fillColor: "green",
    fillOpacity: 0.5, strokeColor: "black"}
});

new_style.addRules([rule]);

lay_vector.style = new_style; 
По последней строчке не уверен, возможно, придется использовать 'styleMap'.

Re: OL: атрибутивная выборка

Добавлено: 20 ноя 2010, 14:30
Denis Rykov
2Mavka
А можно каким-нибудь образом получить доступ к объектам, которые удовлетворяют правилу? То есть мне в конечно счёте нужно посчитать охват объектов, отображаемых после применения правила.

Re: OL: атрибутивная выборка

Добавлено: 20 ноя 2010, 18:45
Mavka
Идея только такая:
1. Перебрать в цикле все объекты, отобрав в массив от подходящих объектов Bounds.
2. Создать объект OpenLayers.Bounds и расширить его на массив объектов (Bounds.extend).

P.S. OpenLayers - тонкий клиент, геопроцессинг по-возможности желательно перекладывать на сервер.

Re: OL: атрибутивная выборка

Добавлено: 21 ноя 2010, 16:23
Mavka
_DR_
По вашему вопросу в рассылке. Может все таки перейти от файла к сервису? Поставить легкий FeatureServer (python-скрипт) и пользоваться его фильтром? Он умеет делать выборки по атрибутам (только равно "=") и bbox.

Re: OL: атрибутивная выборка

Добавлено: 23 ноя 2010, 19:41
Denis Rykov
Спасибо за наводку, интресная штука FeatureServer, никогда до этого не приходилось пользоваться.

Re: OL: атрибутивная выборка

Добавлено: 23 ноя 2010, 22:54
bim2010

Re: OL: атрибутивная выборка

Добавлено: 10 мар 2011, 11:50
Mavka
Можно воспользоваться стратегией Filter. При ее использовании данные загружают в полном объеме и потом динамически включают/выключают нужные объекты.