GeoServer передача параметров в стиль

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
meremoto
Новоприбывший
Сообщения: 7
Зарегистрирован: 06 апр 2013, 09:42
Репутация: 2
Откуда: Москва

GeoServer передача параметров в стиль

Сообщение meremoto »

Добрый вечер, уважаемое сообщество.
Хотелось бы узнать можно ли провернуть такое:
Есть точечный стиль, описанный в геосервере.

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


<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
  xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml"
  xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
  <NamedLayer>
    <Name>USA states population</Name>
    <UserStyle>
      <Name>scenario</Name>
      <FeatureTypeStyle>
        <Rule>
          <Title>Scenario equal 1</Title>
          <ogc:Filter>
            <ogc:PropertyIsEqualTo>
             <ogc:PropertyName>scenario</ogc:PropertyName>
             <ogc:Literal>1</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
           <PointSymbolizer>
              <Graphic>
                <Mark>
                  <WellKnownName>triangle</WellKnownName>
                  <Fill>
                    <CssParameter name="fill">#FF0000</CssParameter>
                  </Fill>
                </Mark>
              <Size>6</Size>
            </Graphic>
          </PointSymbolizer>
        </Rule>
.....
Можно ли вместо 1 передать извне параметр, чтобы не дублировать стили?
Если да, то как это можно сделать? Нужно ли как-то видоизменять стиль?

И второй вопрос.
Фильтр выберет объекты и отрисует их в соответствии с представленным правилом, можно ли как то настроить для всех остальных объектов, не попавших в фильтр, стиль по-умолчанию.

Благодарю за ответы.
alphart
Участник
Сообщения: 96
Зарегистрирован: 31 май 2012, 11:55
Репутация: 9
Откуда: Минск

Re: GeoServer передача параметров в стиль

Сообщение alphart »

Первый вопрос - немного не понял.
Второй - напишите
<ogc:PropertyIsNOTEqualTo>
<ogc:PropertyName>scenario</ogc:PropertyName>
<ogc:Literal>1</ogc:Literal>.......

Про выборки объектов вроде хорошо описано в SLD Cookbook.
meremoto
Новоприбывший
Сообщения: 7
Зарегистрирован: 06 апр 2013, 09:42
Репутация: 2
Откуда: Москва

Re: GeoServer передача параметров в стиль

Сообщение meremoto »

Т.е. во всех стилях с выборками мне нужно дублировать дефолтный стиль?

По поводу первого вопроса:
Необходимо в фильтр передавать параметр извне, например из js.

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


<ogc:Filter>
            <ogc:PropertyIsEqualTo>
             <ogc:PropertyName>scenario</ogc:PropertyName>
             <ogc:Literal>1</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>

Чтобы в <ogc:Literal>1</ogc:Literal> я мог передать 2 или 3, или любой другой параметр. Это необходимо, чтобы не создавать кучу похожих стилей, которые отличаются только параметрами фильтра.
meremoto
Новоприбывший
Сообщения: 7
Зарегистрирован: 06 апр 2013, 09:42
Репутация: 2
Откуда: Москва

Re: GeoServer передача параметров в стиль

Сообщение meremoto »

Задача решается следующим способом:
В GeoServer фильтр описывается так:

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

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0" 
 xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
 xmlns="http://www.opengis.net/sld" 
 xmlns:ogc="http://www.opengis.net/ogc" 
 xmlns:xlink="http://www.w3.org/1999/xlink" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- a Named Layer is the basic building block of an SLD document -->
  <NamedLayer>
    <Name>GDSScenario</Name>
    <UserStyle>
      <FeatureTypeStyle>
        <Rule>
          <Name>Scenario equal variable</Name>
          <ogc:Filter>
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>Scenario</ogc:PropertyName>
              <ogc:Function name="env">
                 <ogc:Literal>scenario</ogc:Literal>
                 <ogc:Literal>-1</ogc:Literal>
              </ogc:Function>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <PointSymbolizer>
            <Graphic>
              <Mark>
                <WellKnownName>triangle</WellKnownName>
                <Fill>
                  <CssParameter name="fill">#FFA500</CssParameter>
                </Fill>
                <Stroke>
                  <CssParameter name="stroke">#FF8C00</CssParameter>
                  <CssParameter name="stroke-width">1</CssParameter>
                </Stroke>
              </Mark>
              <Size>13</Size>
            </Graphic>
          </PointSymbolizer>
        </Rule>
        <Rule>
          <Name>Scenario not equal variable</Name>
          <ogc:Filter>
            <ogc:PropertyIsNotEqualTo>
              <ogc:PropertyName>Scenario</ogc:PropertyName>
              <ogc:Function name="env">
                 <ogc:Literal>scenario</ogc:Literal>
                 <ogc:Literal>-1</ogc:Literal>
              </ogc:Function>
            </ogc:PropertyIsNotEqualTo>
          </ogc:Filter>
          <PointSymbolizer>
            <Graphic>
              <Mark>
                <WellKnownName>triangle</WellKnownName>
                <Fill>
                  <CssParameter name="fill">#A9A9A9</CssParameter>
                </Fill>
                <Stroke>
                  <CssParameter name="stroke">#A9A9A9</CssParameter>
                  <CssParameter name="stroke-width">1</CssParameter>
                </Stroke>
              </Mark>
              <Size>13</Size>
            </Graphic>
          </PointSymbolizer>
        </Rule>
        <Rule>
          <TextSymbolizer>
            <Label>
              <ogc:PropertyName>Descriptio</ogc:PropertyName>
            </Label>
            <Font>
              <CssParameter name="font-family">Arial</CssParameter>
              <CssParameter name="font-size">8</CssParameter>
              <CssParameter name="font-style">normal</CssParameter>
              <CssParameter name="font-weight">bold</CssParameter>
            </Font>
            <LabelPlacement>
              <PointPlacement>
                <AnchorPoint>
                  <AnchorPointX>0.5</AnchorPointX>
                  <AnchorPointY>2.5</AnchorPointY>
                </AnchorPoint>
              </PointPlacement>
            </LabelPlacement>
            <Fill>
              <CssParameter name="fill">#000000</CssParameter>
            </Fill>
          </TextSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>
Ключевой момент здесь следующий:

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

<ogc:Function name="env">
    <ogc:Literal>scenario</ogc:Literal>
    <ogc:Literal>-1</ogc:Literal>
</ogc:Function>
Таким образом описывается шаблон переменной для фильтра или для заливки и т.д.
Т.е. такие блоки можно подсовывать в любые элементы стиля.
<ogc:Literal>scenario</ogc:Literal> - описывает название переменной
<ogc:Literal>-1</ogc:Literal> - значение по-умолчанию.

После этого на клиенте формируется карта (например Leaflet)

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

var geoserverWMSURL = "http://localhost:8081/geoserver/map/wms";
var gds = new L.TileLayer.WMS(geoserverWMSURL, {
      layers: 'ugsGDS',
      format: 'image/png',
      transparent: true,
      tiled: true,
      minZoom: 8,
      maxZoom: 30
  });

var map = L.map('map', {
    center: new L.LatLng(59.326171875, 31.0693359375),
    inertia: false,
    zoom: 8,
    fadeAnimation: true,
    zoomAnimation: false,
    crs: L.CRS.EPSG4326,
    layers: [gds]
  });

gds.setParams({styles: "GDSScenario", env: "scenario:1"});
Последняя строка позволяет записать в переменную scenario значение 1, которое будет учитываться фильтром GeoServer'а.
Также можно задавать эти параметры при настройке слоя.

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

var gds = new L.TileLayer.WMS(geoserverWMSURL, {
      layers: 'ugsGDS',
      format: 'image/png',
      styles: 'GDSScenario',
      env: 'scenario:1',
      transparent: true,
      tiled: true,
      minZoom: 8,
      maxZoom: 30
  });
Если в env несколько параметров, то они должны быть перечислены через ";".
Например, env: 'scenario:1;fill-value:FF8C00'.
Вот так все просто.
Ответить

Вернуться в «Веб-картография»

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

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