фильтры в OpenLayers

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
SPunkY
Интересующийся
Сообщения: 18
Зарегистрирован: 07 ноя 2012, 08:30
Репутация: 0

фильтры в OpenLayers

Сообщение SPunkY » 20 ноя 2012, 08:21

Доброго времени суток!
столкнулся с проблемой фильтрации.. :?

собственно сам фильтр:

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

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}
);
ошибок не выдает, но и не фильтрует, что не так? :roll:

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: фильтры в OpenLayers

Сообщение Denis Rykov » 21 ноя 2012, 07:12

Согласно стандарту, WMS-сервис не обязан поддерживать фильтры OGC в описываемой вами форме. Поэтому, вполне вероятно, что и в вашем случае этой поддержки нет. Насколько мне известно - такая возможность является одной из многих вендор-фич GeoServer. За более подробной информацией советую обратиться к статье Серверы WMS и фильтрация данных.
Spatial is now, more than ever, just another column- The Geometry Column.

SPunkY
Интересующийся
Сообщения: 18
Зарегистрирован: 07 ноя 2012, 08:30
Репутация: 0

Re: фильтры в OpenLayers

Сообщение SPunkY » 21 ноя 2012, 10:18

Спасибо за ссылку на статью, даже странно что не нашел ее самостоятельно..
Не упомянул что использую Tomcat + deegree, с поддержкой OGC фильтров там вроде бы все в порядке. Пробовал подключить фильтр, полученный при помощи OpenLayers, прямо в стиль WMS слоя и он сработал. Но задача в том что бы фильтровать по дате которую введет пользователь, поэтому и фильтр приходится "собирать на лету", а вот применяться он не хочет..

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: фильтры в OpenLayers

Сообщение Denis Rykov » 21 ноя 2012, 11:19

SPunkY писал(а):Не упомянул что использую Tomcat + deegree, с поддержкой OGC фильтров там вроде бы все в порядке.
Что значит "всё в порядке"? Ещё раз повторю - WMS не предполагает передачу фильтров от клиента в явном виде, поэтому "порядок" - это как раз отсутствие такой поддержки, в противном случае - это отступление от стандарта (его расширение) и оно должно быть чётко прописано в документации. Никогда не приходилось работать с deegree, не могли бы вы привести ссылки на его документацию?
SPunkY писал(а):Пробовал подключить фильтр, полученный при помощи OpenLayers, прямо в стиль WMS слоя и он сработал
Согласно стандартам - стиль должен быть описан в SLD-файле, вы использовали такой подход? В вашем случае, как мне видится, правильным решением будет создание серверного скрипта, который бы принимал на вход вашу переменную с датой и генерировал бы SLD "на лету", ну то есть как описано в вышеприведенной статье.
Spatial is now, more than ever, just another column- The Geometry Column.

SPunkY
Интересующийся
Сообщения: 18
Зарегистрирован: 07 ноя 2012, 08:30
Репутация: 0

Re: фильтры в OpenLayers

Сообщение SPunkY » 21 ноя 2012, 11:59

Чего то я все же не могу понять, если 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 не по пути, буду пробовать! Спасибо!

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: фильтры в OpenLayers

Сообщение Denis Rykov » 21 ноя 2012, 12:08

Почему вы решили, что OpenLayers это предлагает? Если открыть документацию, то можно заметить, что свойство filter - определено для всех объектов класса OpenLayers.Layer.Vector, для слоёв класса OpenLayers.Layer.WMS нет поддержки свойства filter. Это и логично, так как поддержка фильтров в стандарте прописана не для WMS, а как раз для векторных данных, передаваемых по протоколу WFS.
Spatial is now, more than ever, just another column- The Geometry Column.

SPunkY
Интересующийся
Сообщения: 18
Зарегистрирован: 07 ноя 2012, 08:30
Репутация: 0

Re: фильтры в OpenLayers

Сообщение SPunkY » 21 ноя 2012, 12:14

Изображение

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя