通过请求参数样式化 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的主要内容,如果未能解决你的问题,请参考以下文章

Postman参数化

Postman参数化

Postman参数化

jmeter参数化

Jmeter参数化请求

Jmeter参数化请求