通过请求参数设置 wms 样式
Styling wms by request parameter
总的来说:
是否可以根据 cql 过滤器或其他参数对单个 wms 查询中的某些 wms 功能进行不同的样式设置?
特别是:
在 wms 查询中,返回特征集合的栅格(即样式为红点的点),
我希望 geoserver 只对一个由随 wms 请求发送的 http-req-参数标识的特定功能设置不同的样式(蓝点)
将其他人保留在默认样式的集合中
并避免两个 wms 重叠:
您可以为此使用过滤器和变量替换。
您的 SLD 可能是这样的:
<?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>default_point</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Default Point</Title>
<Abstract>A sample style that draws a point</Abstract>
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Red Square</Title>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>square</WellKnownName>
<Fill>
<CssParameter name="fill">#FF0000</CssParameter>
</Fill>
</Mark>
<Size>6</Size>
</Graphic>
</PointSymbolizer>
</Rule>
<Rule>
<Name>rule2</Name>
<Title>Blue Square</Title>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>name</ogc:PropertyName>
<ogc:Function name="env">
<ogc:Literal>element</ogc:Literal>
</ogc:Function>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>square</WellKnownName>
<Fill>
<CssParameter name="fill">#0000FF</CssParameter>
</Fill>
</Mark>
<Size>6</Size>
</Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
看到我们在 'env' 参数(在请求的末尾)中使用了一个名为 'element' 的参数(正如我们在 SLD 中定义的),您可以在其中分配一个值wms 请求,因此只有属性 'name' 的值为 'name_yo_want_to_filter' 的要素将呈现为蓝色,如下所示:
http://your_geoserver/wms?LAYERS=your_layer&STYLES=&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG%3A25830&BBOX=177329.45520721,4198063.2254456,177681.24924735,4198495.164411&WIDTH=417&HEIGHT=512&env=element:name_yo_want_to_filter
请记住,'fid' 不是有效参数,因为它通常是隐藏的,因此地理服务器不会接受它的 'PropertyIsEqualTo' 过滤器。
参考:http://docs.geoserver.org/latest/en/user/styling/sld-extensions/substitution.html
参考:http://docs.geoserver.org/latest/en/user/styling/sld-reference/filters.html
比@Fmba 的建议更快(也可能更容易)的方法是请求图层两次,一次使用默认颜色,第二次使用滤镜和高亮样式。您可以在一个请求中执行此操作,也可以发出两个请求,以便浏览器可以缓存默认层并仅重新获取突出显示。
对于第一个请求,它看起来像:
http://....../wms?service=wms&.....&layers=dots,dots&styles=,highlight&cql_filter=INCLUDE;INTERSECT(the_geom,%20POINT%20(-74.817265%2040.5296504))
这两次请求层(点),一次使用默认样式(或者您也可以在此处使用命名样式),然后使用突出显示样式。最后,您必须提供两个过滤器(第一个过滤器适用于 return 一切)。
而在第二个中,您只需像往常一样添加另一层。
总的来说:
是否可以根据 cql 过滤器或其他参数对单个 wms 查询中的某些 wms 功能进行不同的样式设置?
特别是:
在 wms 查询中,返回特征集合的栅格(即样式为红点的点),
我希望 geoserver 只对一个由随 wms 请求发送的 http-req-参数标识的特定功能设置不同的样式(蓝点)
将其他人保留在默认样式的集合中
并避免两个 wms 重叠:
您可以为此使用过滤器和变量替换。 您的 SLD 可能是这样的:
<?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>default_point</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Default Point</Title>
<Abstract>A sample style that draws a point</Abstract>
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Red Square</Title>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>square</WellKnownName>
<Fill>
<CssParameter name="fill">#FF0000</CssParameter>
</Fill>
</Mark>
<Size>6</Size>
</Graphic>
</PointSymbolizer>
</Rule>
<Rule>
<Name>rule2</Name>
<Title>Blue Square</Title>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>name</ogc:PropertyName>
<ogc:Function name="env">
<ogc:Literal>element</ogc:Literal>
</ogc:Function>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>square</WellKnownName>
<Fill>
<CssParameter name="fill">#0000FF</CssParameter>
</Fill>
</Mark>
<Size>6</Size>
</Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
看到我们在 'env' 参数(在请求的末尾)中使用了一个名为 'element' 的参数(正如我们在 SLD 中定义的),您可以在其中分配一个值wms 请求,因此只有属性 'name' 的值为 'name_yo_want_to_filter' 的要素将呈现为蓝色,如下所示:
http://your_geoserver/wms?LAYERS=your_layer&STYLES=&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG%3A25830&BBOX=177329.45520721,4198063.2254456,177681.24924735,4198495.164411&WIDTH=417&HEIGHT=512&env=element:name_yo_want_to_filter
请记住,'fid' 不是有效参数,因为它通常是隐藏的,因此地理服务器不会接受它的 'PropertyIsEqualTo' 过滤器。
参考:http://docs.geoserver.org/latest/en/user/styling/sld-extensions/substitution.html 参考:http://docs.geoserver.org/latest/en/user/styling/sld-reference/filters.html
比@Fmba 的建议更快(也可能更容易)的方法是请求图层两次,一次使用默认颜色,第二次使用滤镜和高亮样式。您可以在一个请求中执行此操作,也可以发出两个请求,以便浏览器可以缓存默认层并仅重新获取突出显示。
对于第一个请求,它看起来像:
http://....../wms?service=wms&.....&layers=dots,dots&styles=,highlight&cql_filter=INCLUDE;INTERSECT(the_geom,%20POINT%20(-74.817265%2040.5296504))
这两次请求层(点),一次使用默认样式(或者您也可以在此处使用命名样式),然后使用突出显示样式。最后,您必须提供两个过滤器(第一个过滤器适用于 return 一切)。
而在第二个中,您只需像往常一样添加另一层。