通过请求参数样式化 wms
Posted
技术标签:
【中文标题】通过请求参数样式化 wms【英文标题】:Styling wms by request parameter 【发布时间】:2015-10-20 09:36:19 【问题描述】:一般: 是否可以根据 cql 过滤器或其他参数对单个 wms 查询中的某些 wms 功能进行不同的样式设置?尤其是: 在 wms 查询中,返回特征集合的栅格(即样式为红点的点), 我希望 geoserver 仅对一个由 wms 请求发送的 http-req-parameter 标识的特定功能进行不同样式(蓝点) 以默认样式保留集合中的其他人 并避免两个 wms 重叠:
【问题讨论】:
如 [docs.geoserver.org/stable/en/user/styling/sld-working.html]: “可以使用 SLD_BODY=style 参数在 WMS GetMap GET 请求中直接提供 SLD 文档。SLD XML 必须是 URL 编码的。”对您来说是一个有效的方案,使用适当的过滤器根据请求动态创建 SLD? @Fbma 我认为这会全局重新设置图层的样式,我编辑了我的 Q,因为它可能不清楚.. 好的,我明白了。通过将第一个过滤器设置为第二个过滤器的否定,可以避免重叠;) 【参考方案1】:比@Fmba 的建议更快(并且可能更容易)的方法是请求图层两次,一次使用默认颜色,第二次使用过滤器和高亮样式。您可以在一个请求中执行此操作,也可以发出两个请求,以便浏览器可以缓存默认图层并仅重新获取高光。
对于第一个请求,它看起来像:
http://....../wms?service=wms&.....&layers=dots,dots&styles=,highlight&cql_filter=INCLUDE;INTERSECT(the_geom,%20POINT%20(-74.817265%2040.5296504))
这会请求图层(点)两次,一次使用默认样式(或者您也可以在此处使用命名样式),然后使用高亮样式。最后,您必须提供两个过滤器(第一个过滤器只是返回所有内容)。
而在第二个中,您只需像往常一样添加另一个图层。
【讨论】:
这绝对是比我更好更简单的解决方案! ;) 太好了,你成功了! @iant :我的原始 Q 中的示例可能会产生误导,导致 «selected» 样式与 «unselected» 具有相同的形状,它适用于不同的形状还是仅与两个 wms 重叠? [编辑 Q 以进一步澄清] 据我了解,您可以避免图形重叠,只需在第一个 CQL 过滤器中指定正确的条件,而不是将其设置为“真”。所以:第一个过滤器选择不是您想要的功能,第二个过滤器选择您想要突出显示的功能。 @Fbma 是正确的,如果它们是不同的形状,您需要从第一张地图中排除突出显示的项目,我通常将其用于多边形,所以这不是问题。【参考方案2】:您可以为此使用过滤器和变量替换。 您的 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”不是有效参数,因为它通常是隐藏的,因此 geoserver 不会接受它的“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
【讨论】:
好吧,@iant 的回答对于我的具体问题来说确实更简洁,但对于您非常有用的提示也 +1!以上是关于通过请求参数样式化 wms的主要内容,如果未能解决你的问题,请参考以下文章