【问题标题】:Get layer name in SLD在 SLD 中获取图层名称
【发布时间】:2020-07-12 02:16:04
【问题描述】:

我们可以使用任何元素或函数来获取 SLD 中的当前层名称吗? 我们要求多个图层,并希望对每个图层使用相同的样式,但根据图层进行一些小的自定义,例如颜色变化等。

如果没有为每种层类型创建一个新的 SLD,我找不到任何允许此类用例的文档。

【问题讨论】:

  • 我对问题的 OL 标签有点困惑,您想使用 OL 更改样式吗?那么为什么需要 SLD 中的图层名称?
  • 我们在客户端使用 Openlayers TileWMS。如果有人可以使用 Openlayers 找到另一个解决方案,那就太好了 :) Openlayes 社区拥有很多空间知识。
  • 同意.. 让我看看我是否理解,您正在发布具有一种基本样式的多个图层,并且您想知道如何根据图层更改 OL 中的某些样式属性,例如颜色?
  • 没错!我们当然可以不使用一种样式,而是为每一层设置一种新样式。将完全相同的样式复制 24 次(24 层)似乎有点多余,但每一次的颜色或字体大小都略有变化。

标签: openlayers geoserver sld


【解决方案1】:

[WFS]

这里我为你做了一个例子,向你展示如何进行你提到的简单修改。

在下面的示例中,我没有修改图层样式,而是修改了要素样式,这与我刚刚发现的简单示例相同。因此,为了在您的情况下工作,您只需要获取图层样式并以与示例相同的方式进行更改。

<!doctype html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.1.1/css/ol.css" type="text/css">
    <style>
      .map {
        height: 400px;
        width: 100%;
      }
    </style>
    <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.1.1/build/ol.js"></script>
    <title>Simple Style Change</title>
  </head>
  <body>
    <div id="map" class="map"></div>
    <script type="text/javascript">
    // base style default of features
		// features
    const radius = 20000;
    const cx = -80;
    const cy = 35;
    const fonts = [
      '1.2em "Fira Sans", sans-serif',
      'italic 1.2em "Fira Sans", serif',
      'italic small-caps bold 16px/2 cursive',
      'small-caps bold 24px/1 sans-serif',
      'caption'
    ];
    const baseStyle = new ol.style.Style({
      stroke: new ol.style.Stroke({
        color: 'rgba(0, 0, 0, 1)',
        width: 1
      }),
      fill: new ol.style.Fill({
        color: 'rgba(0, 0, 0, 0.1)'
      }),
      text: new ol.style.Text({
        stroke: new ol.style.Stroke({color: '#ffffff', width: 3})
      })
    });
    // map
    const view = new ol.View({
      center: ol.proj.fromLonLat([cx-6, cy]),
      zoom: 7
    });
    const vlayer = new ol.layer.Vector({
      source: new ol.source.Vector(),
      style: baseStyle
    });
    const map = new ol.Map({
			target: 'map',
			layers: [
				new ol.layer.Tile({
					source: new ol.source.OSM()
				}),
        vlayer
			],
			view
		});
    // add features
    const features = [];
    let feat, style, fill, text;
    for (let i = 0; i < 20; i++) {
      feat = new ol.Feature({
        geometry: ol.geom.Polygon.circular([cx-i, cy], radius)
        .transform('EPSG:4326', 'EPSG:3857')
      });
      style = vlayer.getStyle().clone();
      fill = vlayer.getStyle().getFill().clone();
      fill.setColor(`rgba(${i*12},${i*12},${i*12},0.5)`)
      style.setFill(fill);
      text = vlayer.getStyle().getText().clone();
      text.setFont(fonts[i % fonts.length]);
      text.setText(`${i}`);
      style.setText(text);
      feat.setStyle(style);
      features.push(feat);
    }
    vlayer.getSource().addFeatures(features);
    </script>
  </body>
</html>

WMS 更新

对于 WMS,您可以使用两个参数来根据请求动态更改样式。

  • styles:要应用的样式名称的逗号分隔值,默认样式适用于空值。在这种情况下,您必须使用所需的简单更改定义一组样式,然后将这些样式的名称与 OL 中的图层一起使用。
  • sld_body:要应用于地图的 SLD XML 文本。在这种情况下,您有一个基础 SLD,您可以使用 JavaScript 对其进行修改,并将其与 OL 中的图层一起使用。

在 OL 上,您可以指定此参数,假设您使用 TileWMS,在创建时使用选项参数 params 或使用方法 updateParams

GeoServer - WMS

OL API - TileWMS

【讨论】:

  • 抱歉,我看不出我们如何将您的示例与 wms 层一起使用。是的,使用矢量特征很容易
  • 对不起,我错过了理解这个问题..无论如何我已经更新了答案,检查它是否对你的情况有帮助
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 2019-08-27
  • 1970-01-01
  • 2013-09-03
  • 2017-05-08
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多