通过请求参数设置 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 一切)。

而在第二个中,您只需像往常一样添加另一层。