Страница 1 из 1
фильтры в OpenLayers
Добавлено: 20 ноя 2012, 08:21
SPunkY
Доброго времени суток!
столкнулся с проблемой фильтрации..
собственно сам фильтр:
Код: Выделить всё
function getFilterParam(param){
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: 'cw:date_obs',
value: param
})
var parser = new OpenLayers.Format.Filter.v1_1_0();
var xml = new OpenLayers.Format.XML();
var filter_param = xml.write(parser.write(filter))
// filter_param is now something like: <Filter><PropertyIsEqualTo><PropertyName>cw:date_obs</PropertyName><Literal>2012-11-11T00:00:00</Literal></PropertyIsEqualTo></Filter>
return filter_param;
}
в функции init():
Код: Выделить всё
var filter_param = getFilterParam("2012-11-11T00:00:00");
var wms_points = new OpenLayers.Layer.WMS(
'points',
'http://10.20.128.180:8080/deegree_3.2_pre11/services/WMS',
{layers: 'points', transparent: true, filter:filter_param},
{isBaseLayer: false,
opacity: .9}
);
ошибок не выдает, но и не фильтрует, что не так?

Re: фильтры в OpenLayers
Добавлено: 21 ноя 2012, 07:12
Denis Rykov
Согласно стандарту, WMS-сервис не обязан поддерживать фильтры OGC в описываемой вами форме. Поэтому, вполне вероятно, что и в вашем случае этой поддержки нет. Насколько мне известно - такая возможность является одной из многих вендор-фич GeoServer. За более подробной информацией советую обратиться к статье
Серверы WMS и фильтрация данных.
Re: фильтры в OpenLayers
Добавлено: 21 ноя 2012, 10:18
SPunkY
Спасибо за ссылку на статью, даже странно что не нашел ее самостоятельно..
Не упомянул что использую Tomcat + deegree, с поддержкой OGC фильтров там вроде бы все в порядке. Пробовал подключить фильтр, полученный при помощи OpenLayers, прямо в стиль WMS слоя и он сработал. Но задача в том что бы фильтровать по дате которую введет пользователь, поэтому и фильтр приходится "собирать на лету", а вот применяться он не хочет..
Re: фильтры в OpenLayers
Добавлено: 21 ноя 2012, 11:19
Denis Rykov
SPunkY писал(а):Не упомянул что использую Tomcat + deegree, с поддержкой OGC фильтров там вроде бы все в порядке.
Что значит "всё в порядке"? Ещё раз повторю - WMS не предполагает передачу фильтров от клиента в явном виде, поэтому "порядок" - это как раз отсутствие такой поддержки, в противном случае - это отступление от стандарта (его расширение) и оно должно быть чётко прописано в документации. Никогда не приходилось работать с deegree, не могли бы вы привести ссылки на его документацию?
SPunkY писал(а):Пробовал подключить фильтр, полученный при помощи OpenLayers, прямо в стиль WMS слоя и он сработал
Согласно стандартам - стиль должен быть описан в SLD-файле, вы использовали такой подход? В вашем случае, как мне видится, правильным решением будет создание серверного скрипта, который бы принимал на вход вашу переменную с датой и генерировал бы SLD "на лету", ну то есть как описано в вышеприведенной
статье.
Re: фильтры в OpenLayers
Добавлено: 21 ноя 2012, 11:59
SPunkY
Чего то я все же не могу понять, если WMS не предполагает передачу фильтров от клиента в явном виде, то почему же OpenLayers предлагает это?
Ссылки на документацию:
www.deegree.org/Documentation
wiki.deegree.org/deegreeWiki/
вот так выглядит мой WMS слой:
Код: Выделить всё
<deegreeWMS xmlns="http://www.deegree.org/services/wms" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" configVersion="3.1.0" xsi:schemaLocation="http://www.deegree.org/services/wms http://schemas.deegree.org/wms/0.5.0/wms_configuration.xsd">
<ServiceConfiguration>
<UnrequestableLayer>
<Title>Root Layer</Title>
<CRS>EPSG:31466 EPSG:31467 EPSG:31468 EPSG:4326 EPSG:25832</CRS>
<DynamicLayer>
<PostGIS>conn-postgres</PostGIS>
</DynamicLayer>
<RequestableLayer>
<Name>land</Name>
<Title>Land</Title>
<FeatureStoreId>synopi</FeatureStoreId>
<DirectStyle>
<File>../styles/Platform.xml</File>
</DirectStyle>
</RequestableLayer>
</UnrequestableLayer>
</ServiceConfiguration>
</deegreeWMS>
а вот так его стиль:
Код: Выделить всё
<FeatureTypeStyle xmlns="http://www.opengis.net/se" xmlns:ogc="http://www.opengis.net/ogc" xmlns:deegreeogc="http://www.deegree.org/ogc" xmlns:sed="http://www.deegree.org/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:cw="http://meteo.ru/cw" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/FeatureStyle.xsd http://www.deegree.org/se http://schemas.deegree.org/se/1.1.0/Symbolizer-deegree.xsd">
<Name>Platform</Name>
<FeatureTypeName>cw:synopi</FeatureTypeName>
<Rule>
<Name>Stations</Name>
<Description>
<Title>Stations of the world</Title>
</Description>
<!--ogc:Filter>
<ogc:PropertyIsLessThanOrEqualTo>
<ogc:PropertyName>cw:date_obs</ogc:PropertyName>
<ogc:Literal>2012-11-11T00:00:00</ogc:Literal>
</ogc:PropertyIsLessThanOrEqualTo>
</ogc:Filter-->
<MinScaleDenominator>0</MinScaleDenominator>
<MaxScaleDenominator>999999999</MaxScaleDenominator>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>square</WellKnownName>
<Fill>
<SvgParameter name="fill">#FF6600</SvgParameter>
</Fill>
<Stroke>
<SvgParameter name="stroke">#000000</SvgParameter>
<SvgParameter name="stroke-width">1</SvgParameter>
</Stroke>
</Mark>
</Graphic>
</PointSymbolizer>
</Rule>
<Rule>
<Name>date_obs</Name>
<Description>
<Title>Stations names of the world</Title>
</Description>
<ogc:Filter>
<ogc:Not>
<ogc:PropertyIsNull>
<ogc:PropertyName>cw:date_obs</ogc:PropertyName>
</ogc:PropertyIsNull>
</ogc:Not>
</ogc:Filter>
<MaxScaleDenominator>3000000</MaxScaleDenominator>
<TextSymbolizer>
<Label>
<ogc:PropertyName>cw:date_obs</ogc:PropertyName>
</Label>
<Font>
<SvgParameter name="font-family">Arial</SvgParameter>
<SvgParameter name="font-family">Sans-Serif</SvgParameter>
<SvgParameter name="font-weight">bold</SvgParameter>
<SvgParameter name="font-size">12</SvgParameter>
</Font>
<LabelPlacement>
<PointPlacement>
<Displacement>
<DisplacementX>0</DisplacementX>
<DisplacementY>13</DisplacementY>
</Displacement>
</PointPlacement>
</LabelPlacement>
<Halo>
<Radius>1</Radius>
<Fill>
<SvgParameter name="fill">#000000</SvgParameter>
</Fill>
</Halo>
<Fill>
<SvgParameter name="fill-opacity">1.0</SvgParameter>
<SvgParameter name="fill">#ffffff</SvgParameter>
</Fill>
</TextSymbolizer>
</Rule>
<Rule>
<Name>ttt</Name>
<Description>
<Title>Stations names of the world</Title>
</Description>
<ogc:Filter>
<ogc:Not>
<ogc:PropertyIsNull>
<ogc:PropertyName>cw:ttt</ogc:PropertyName>
</ogc:PropertyIsNull>
</ogc:Not>
</ogc:Filter>
<MaxScaleDenominator>3000000</MaxScaleDenominator>
<TextSymbolizer>
<Label>
<ogc:PropertyName>cw:ttt</ogc:PropertyName>
</Label>
<Font>
<SvgParameter name="font-family">Arial</SvgParameter>
<SvgParameter name="font-family">Sans-Serif</SvgParameter>
<SvgParameter name="font-weight">bold</SvgParameter>
<SvgParameter name="font-size">12</SvgParameter>
</Font>
<LabelPlacement>
<PointPlacement>
<Displacement>
<DisplacementX>0</DisplacementX>
<DisplacementY>26</DisplacementY>
</Displacement>
</PointPlacement>
</LabelPlacement>
<Halo>
<Radius>1</Radius>
<Fill>
<SvgParameter name="fill">#000000</SvgParameter>
</Fill>
</Halo>
<Fill>
<SvgParameter name="fill-opacity">1.0</SvgParameter>
<SvgParameter name="fill">#ffffff</SvgParameter>
</Fill>
</TextSymbolizer>
</Rule>
<Rule>
<Name>ppp</Name>
<Description>
<Title>Stations names of the world</Title>
</Description>
<ogc:Filter>
<ogc:Not>
<ogc:PropertyIsNull>
<ogc:PropertyName>cw:ppp</ogc:PropertyName>
</ogc:PropertyIsNull>
</ogc:Not>
</ogc:Filter>
<MaxScaleDenominator>3000000</MaxScaleDenominator>
<TextSymbolizer>
<Label>
<ogc:PropertyName>cw:ppp</ogc:PropertyName>
</Label>
<Font>
<SvgParameter name="font-family">Arial</SvgParameter>
<SvgParameter name="font-family">Sans-Serif</SvgParameter>
<SvgParameter name="font-weight">bold</SvgParameter>
<SvgParameter name="font-size">12</SvgParameter>
</Font>
<LabelPlacement>
<PointPlacement>
<Displacement>
<DisplacementX>0</DisplacementX>
<DisplacementY>39</DisplacementY>
</Displacement>
</PointPlacement>
</LabelPlacement>
<Halo>
<Radius>1</Radius>
<Fill>
<SvgParameter name="fill">#000000</SvgParameter>
</Fill>
</Halo>
<Fill>
<SvgParameter name="fill-opacity">1.0</SvgParameter>
<SvgParameter name="fill">#ffffff</SvgParameter>
</Fill>
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
В вашем случае, как мне видится, правильным решением будет создание серверного скрипта, который бы принимал на вход вашу переменную с датой и генерировал бы SLD "на лету", ну то есть как описано в вышеприведенной статье
Были такие мысли, но наткнулся на фильтры OpenLayers и решил что это было бы правильней.. Раз с OpenLayers не по пути, буду пробовать! Спасибо!
Re: фильтры в OpenLayers
Добавлено: 21 ноя 2012, 12:08
Denis Rykov
Почему вы решили, что OpenLayers это предлагает? Если открыть документацию, то можно заметить, что свойство filter - определено для всех объектов класса
OpenLayers.Layer.Vector, для слоёв класса
OpenLayers.Layer.WMS нет поддержки свойства filter. Это и логично, так как поддержка фильтров в стандарте прописана не для WMS, а как раз для векторных данных, передаваемых по протоколу WFS.
Re: фильтры в OpenLayers
Добавлено: 21 ноя 2012, 12:14
SPunkY