Задача решается следующим способом:
В 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'.
Вот так все просто.