Получить имя слоя в SLD - PullRequest
       55

Получить имя слоя в SLD

1 голос
/ 31 марта 2020

Есть ли какой-либо элемент или функция, которую мы можем использовать, чтобы получить текущее имя слоя в SLD? Мы запрашиваем несколько слоев и хотели бы использовать один и тот же стиль для каждого из них, но с небольшими изменениями, такими как изменение цвета и т. Д. c. в зависимости от слоя.

Я не смог найти никакой документации, которая бы учитывала такой вариант использования, без создания нового SLD для каждого типа слоя.

1 Ответ

0 голосов
/ 01 апреля 2020

[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

...