4.1. YSLD快速启动

在最后一节中,我们看到了OGC如何使用XML文档(称为SLD文件)定义样式。

我们现在将使用一个工具来生成我们的SLD文件,更详细地探索Geoserver样式。这个 YSLD Geoserver扩展用于使用更清晰、更简洁的语言生成SLD文件,该语言基于 YAML 。不像 CSS vt.的. YSLD 样式语言与SLD具有一一对应关系,这意味着YSLD的每一行都直接转换为SLD的一行或多行。此外,可以将YSLD样式转换为SLD and back 而不会丢失信息。

使用ysld扩展来定义样式会产生更容易理解的较短示例。在任何时候,我们都可以查看生成的SLD文件。

参考文献:

4.1.1. 句法

本节为不熟悉yaml的映射专业人员提供了对ysld语法的快速介绍。

4.1.1.1. 属性语法

YSLD样式文档中的单个语句(或指令)设计为以下形式的键值或属性值对:

<property>: <value>

这个 <property> 是表示属性名的字符串,而 <value> 可以是多种不同类型中的一种,具体取决于上下文。

整数

数值。可以用引号括起来。

浮标

数值。可以用引号括起来。

文本

文本值。如果值不明确,请使用单引号。

颜色

窗体的十六进制颜色 '#RRGGBB' .

元组

括号中的值列表。例如 [0, 1]

表情

cql表达式被包围 ${{ }}

4.1.1.2. 映射和列表

YSLD文档中有三种类型的对象:

  1. 标量,简单值

  2. 映射,键值(属性值)对的集合

  3. 列表,任何对象集合。列表可以包含映射、标量,甚至其他列表。

    列表要求每个条目都有破折号,而映射则不需要。

例如,符号块是一个列表,因此每个条目都需要自己的破折号:

这个 polygon:text: 对象(单个符号本身)是映射,因此,内容不需要虚线,只需要缩进:

- polygon:
    stroke-color: '#808080'
    fill-color: '#FF0000'

多边形旁边的破折号表示项目本身包含在列表中,而不是包含列表。破折号的位置与列表标题的缩进级别相同。

如果您的列表只包含一个项目,并且在列表的较高级别上没有其他内容,则可以省略封闭元素。例如,以下内容是等效的:

feature-styles:
- rules:
  - symbolizers:
    - point:
        symbols:
        - mark:
            shape: circle
            fill-color: 'gray'
point:
  symbols:
  - mark:
      shape: circle
      fill-color: 'gray'

这对于使您的风格更简洁很有用。

4.1.1.3. 缩进

压痕在YSLD中非常重要。所有指令都必须缩进到适当的位置,以确保正确的层次结构。不正确的缩进将导致样式呈现不正确,或者根本不正确。

例如,多边形符号,因为它是一个映射,所以在它内部包含一些参数,例如填充和笔划的颜色。这些必须缩进,使它们“在”多边形块内。

在本例中,以下标记是 对的

- polygon:
    fill-color: '#808080'
    fill-opacity: 0.5
    stroke-color: black
    stroke-opacity: 0.75

多边形(符号)内的参数是缩进的,这意味着它们引用的是符号,而不是“在它外面”。

与以下内容比较 不正确的 标记:

- polygon:
  fill-color: '#808080'
  fill-opacity: 0.5
  stroke-color: black
  stroke-opacity: 0.75

4.1.1.4. 规则

我们已经看到一个由单个规则组成的CSS样式:

point:
  symbols:
  - mark:
      shape: circle
      fill-color: 'gray'

我们可以制作一个由多个规则组成的样式,仔细选择每个规则的选择器。在这种情况下,我们使用一个选择器来为带有星形的首都城市和带有圆形的非首都设置样式:

rules:
  - filter: ${FEATURECLA = 'Admin-0 capital'}
    scale: [min, max]
    symbolizers:
    - point:
        size: 6
        symbols:
        - mark:
            shape: star
            stroke-color: 'black'
            stroke-width: 1
            fill-color: 'gray'
  - filter: ${FEATURECLA <> 'Admin-0 capital'}
    scale: [min, max]
    symbolizers:
    - point:
        size: 6
        symbols:
        - mark:
            shape: circle
            stroke-color: 'black'
            stroke-width: 1
            fill-color: 'gray'

上面执行的功能属性测试使用 约束查询语言(cql) .此语法可用于定义筛选以选择内容,类似于使用SQL WHERE语句的方式。它还可以用于定义表达式以访问属性值,从而允许在定义样式属性时使用这些值。

还可以根据呈现引擎的状态触发规则选择器。在本例中,我们仅在放大时应用标签:

rules:
  - scale: [min, '2.0E7']
    symbolizers:
    - text:
        label: ${NAME}
        fill-color: 'gray'

在上面的示例中,标签是使用cql表达式定义的。 NAME .这将产生一个动态样式,该样式根据具体情况生成每个标签,并用特征属性填充标签。 NAME .

参考文献:

4.1.1.5. 变量

到目前为止,我们一直在为各个特征设计样式,记录每个形状的表示方式。

设置多个要素的样式或使用过滤器设置不同年份的各个要素的样式时,可能需要重复样式信息。

ysld中的变量允许通过名称定义某个指令或指令块,然后重新使用。这可以大大简化样式文档。

使用变量最常见的两个用例是:

  • 为值创建一个更友好的名称(例如使用myorange而不是 #EE8000

  • 定义指令块以删除冗余内容并缩短文件长度

通常情况下,将所有定义放在ysld文件的最顶部,但不是必需的。

将变量定义为单个值的语法是:

define: &variable <value>

然后,可以将定义的变量作为一个值,按变量名使用 *

<directive>: *variable

将变量定义为内容块的语法是:

define: &varblock
  <directive>: <value>
  <directive>: <value>
  ...
  <block>:
  - <directive>: <value>
    <directive>: <value>
  ...

使用变量块的语法是在变量名前面加上 <<: * . 例如:

<block>:
- <directive>: <value>
  <<: *varblock

4.1.2. 比较ysld和sld

如上所述,YSLD与SLD具有一一对应关系,它只是使用不同的标记语言来显示相同的内容。我们可以将SLD样式与YSLD样式进行比较,以查看这种对应关系:

4.1.2.1. SLD风格

下面是一个例子 SLD file 供参考:

 1<?xml version="1.0" encoding="ISO-8859-1"?>
 2<StyledLayerDescriptor version="1.0.0"
 3 xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
 4 xmlns="http://www.opengis.net/sld"
 5 xmlns:ogc="http://www.opengis.net/ogc"
 6 xmlns:xlink="http://www.w3.org/1999/xlink"
 7 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 8  <NamedLayer>
 9    <Name>airports</Name>
10    <UserStyle>
11      <Title>Airports</Title>
12      <FeatureTypeStyle>
13        <Rule>
14          <Name>airports</Name>
15          <Title>Airports</Title>
16          <PointSymbolizer>
17            <Graphic>
18              <ExternalGraphic>
19                <OnlineResource xlink:type="simple"
20                xlink:href="airport.svg" />
21                <Format>image/svg</Format>
22              </ExternalGraphic>
23              <Size>16</Size>
24            </Graphic>
25          </PointSymbolizer>
26        </Rule>
27      </FeatureTypeStyle>
28    </UserStyle>
29  </NamedLayer>
30</StyledLayerDescriptor>

4.1.2.2. YSLD风格

下面是与 YSLD

 1name: airports
 2title: Airports
 3scale: [min, max]
 4symbolizers:
 5- point:
 6    size: 16
 7    symbols:
 8    - external:
 9        url: airport.svg
10        format: image/svg

我们使用点符号来表示我们希望将此内容绘制为 Point (SLD中的第16行,YSLD中的第5行)。点符号声明一个包含URL的外部图形 airports.svg 指示应绘制的图像(SLD中的第20行,YSLD中的第9行)。

4.1.3. 旅游

为了确认一切正常,让我们重现上面的机场风格。

  1. 导航到 风格 页。

  2. 每次编辑样式时,都会替换关联的SLD文件的内容。我们将创造一种新的风格,而不是破坏我们现有的任何风格。单击 Add a new style 并选择以下选项:

    姓名:

    airports0

    工作区:

    (留空)

    格式:

    YSLD

  3. 将初始的YSLD定义替换为我们的Airport YSLD示例,然后单击 Apply

    name: airports
    title: Airports
    scale: [min, max]
    symbolizers:
    - point:
        size: 16
        symbols:
        - external:
            url: airport.svg
            format: image/svg
    
  4. 单击 Layer Preview 选项卡以预览样式。我们想要预览机场图层,因此单击当前图层的名称并选择 ne:airports 从出现的列表中删除。您可以使用鼠标键平移和滚动滚轮来更改比例。

    ../../../_images/css_02_choose_data.png

    选择机场层

    ../../../_images/css_06_preview.png

    层预览

  5. 点击 Layer Data 用于所选数据的摘要。

    ../../../_images/css_07_data.png

    层属性

4.1.4. 奖金

早点完成?现在请帮助你的邻居,这样我们就可以继续工作了。

如果你真的陷入困境,请考虑以下挑战,而不是跳过前面。

4.1.4.1. 浏览数据

  1. 返回到 Data 选项卡并使用 Compute 链接以确定 标尺 属性。

4.1.4.2. 挑战比较SLD生成

#其余的API可用于直接查看yaml文件。

浏览器:

命令行:

curl -v -u admin:geoserver -XGET http://localhost:8080/geoserver/rest/styles/airports0.yaml
  1. REST API也可用于生成SLD文件:

    浏览器:

命令行:

curl -v -u admin:geoserver -XGET http://localhost:8080/geoserver/rest/styles/airports0.sld?pretty=true
  1. 将生成的SLD与上面手写的SLD进行比较 SLD file 以此为例?

    挑战: 你能发现什么区别?