4.4.

YSLD造型之旅的下一站是点的表示。

../../../_images/PointSymbology.svg

点符号学回顾:

  • 点仅用于表示位置,不形成形状。线条的视觉宽度不会随比例而变化。

  • SLD使用 PointSymbolizer 记录如何绘制线条形状。

  • 点的标签定位到点位置。

由于点本身没有固有的形状,因此重点放在用适当的符号标记位置上。

参考文献:

这个练习利用了 ne:populated_places 层。

  1. 导航到 风格 页。

  2. 点击 Add a new style 并选择以下选项:

    姓名:

    point_example

    工作区:

    No workspace

    格式:

    YSLD

  3. 选择 pointGenerate a default style 下拉并单击 generate .

  4. 将初始的ysld定义替换为以下内容并单击 apply

    symbolizers:
    - point:
        symbols:
        - mark:
            shape: circle
            stroke-width: 1
    
  5. 并使用 Layer Preview 选项卡以预览结果。

    ../../../_images/point_03_map.png

4.4.1. 作记号

这个 符号控制点数据的显示。点用强制属性表示 mark .

../../../_images/PointSymbology.svg

SLD标准提供了与点符号一起使用的“众所周知”符号: circlesquaretrianglearrowcrossstarx .

  1. 将样式使用的符号更改为正方形:

    symbolizers:
    - point:
        symbols:
        - mark:
            shape: square
            stroke-width: 1
    
  2. 地图预览:

    ../../../_images/point_mark_1.png
  3. 在继续之前,我们将使用过滤器将显示的数据量减少到合理的水平。

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          symbols:
          - mark:
              shape: square
              stroke-width: 1
    

备注

符号 已缩进到 规则

  1. 使图像更加清晰:

    ../../../_images/point_mark_2.png
  2. 其他属性可用于控制标记的演示文稿:

    这个 size 属性用于控制符号大小。

    这个 旋转 属性控制方向,接受以度为单位的输入。

    同时尝试这两种设置:

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          size: 8
          rotation: 45.0
          symbols:
          - mark:
              shape: square
              stroke-width: 1
    
  3. 结果在每个位置用菱形标记:

    ../../../_images/point_mark_3.png
  4. 这个 mark 属性提供用于设置点符号样式的参数。我们换个 fill-color 变成灰色。

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          size: 8
          rotation: 45.0
          symbols:
          - mark:
              shape: square
              stroke-color: 'black'
              stroke-width: 1
              fill-color: 'gray'
    
  5. 将标记更新为带黑色轮廓的灰色正方形。

    ../../../_images/point_mark_4.png
  6. 您可以添加更多的符号来应用其他点样式。

    使用这种方法,标记可以由多个符号组成,每个符号都有自己的设置:

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          size: 16
          symbols:
          - mark:
              shape: square
              stroke-color: 'black'
              stroke-width: 1
              fill-color: 'red'
      - point:
          size: 14
          rotation: 45.0
          symbols:
          - mark:
              shape: cross
              stroke-color: 'white'
              stroke-width: 1
              fill-color: 'black'
    
  7. 产生有趣的复合符号效果:

    ../../../_images/point_mark_5.png

4.4.2. 图解的

符号也可以由外部图形提供,

../../../_images/Point_Graphic.svg

这项技术是用最初的 airport.svg YSLD示例。

  1. 要使用外部图形,需要两条信息。

    url 属性定义为 url 对图像的引用。

    格式 属性用于告诉呈现引擎期望的文件格式

    此技术用于引用放置在Styles目录中的文件。

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          symbols:
          - external:
              url: file:/path/to/geoserver/data_dir/styles/port.svg
              format: image/svg
    
  2. 在每个位置绘制所提供的形状:

    ../../../_images/point_graphic_1.png
  3. 财产 url 参考也可用于参考外部图像。我们可以使用geoserver徽标。

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          size: 16
          symbols:
          - external:
              url: http://localhost:8080/geoserver/web/wicket/resource/org.geoserver.web.GeoServerBasePage/img/logo.png
              format: image/png
    
  4. 如地图预览所示。

    ../../../_images/point_graphic_2.png

4.4.3. 标签

标签现在已经熟悉我们的经验线串和多边形。

../../../_images/Point_Label.svg

这个 text 符号 标签 属性是标记点位置所必需的。

  1. 替换 point_example 包括以下内容:

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          symbols:
          - mark:
              shape: circle
              stroke-color: 'black'
              stroke-width: 1
              fill-color: 'gray'
      - text:
          label: ${NAME}
          fill-color: 'gray'
          placement: point
    
  2. 确认结果 Layer Preview 预览。

    ../../../_images/point_label_1.png
  3. 每个标签都是从提供的点开始绘制的——这是不幸的,因为它确保每个标签将与使用的符号重叠。为了解决这个限制,我们将使用ysld控件来放置标签:

    提供两个值,表示标签相对于起始标签位置的对齐方式。

    取代 用于提供使用和X和Y偏移的初始位移。对于点,建议使用此偏移调整符号所用区域的标签位置。

    备注

    财产 定义相对于由结果标签形成的边界框的定位点位置。定位点位置将捕捉到由点位置和位移偏移生成的标签位置。

    同时使用这两个工具,我们可以将标签置于符号下方的中心,注意所用的位移提供了符号尺寸所需区域之外的偏移量。

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          size: 10
          symbols:
          - mark:
              shape: circle
              stroke-color: 'black'
              stroke-width: 1
              fill-color: 'gray'
      - text:
          label: ${NAME}
          fill-color: 'black'
          placement: point
          anchor: [0.5, 1.0]
          displacement: [0, -12]
    
  4. 每个标签现在都放在标记下面。

    ../../../_images/point_label_2.png
  5. 剩下的一个问题是标签和符号之间的重叠。

    geoserver提供了一个特定于供应商的参数,允许符号参与标签冲突解决,防止标签重叠任何符号。这严重限制了可用于贴标签的区域,最好与最大位移供应商选择结合使用。

    x-labelObstacle vendor参数要求渲染引擎避免在指示符号的顶部绘制标签。这适用于点符号。

    x-maxDisplacement vendor参数为渲染引擎提供冲突解决期间允许其移动标签的最大距离。这适用于文本符号。

    x-spaceAround vendor参数告诉渲染引擎提供地图上标签之间的最小距离,确保它们不会重叠。这适用于文本符号。

    更新我们的示例以使用这些设置:

    rules:
    - filter: ${SCALERANK < '1'}
      scale: [min, max]
      symbolizers:
      - point:
          size: 10
          symbols:
          - mark:
              shape: circle
              stroke-color: 'black'
              stroke-width: 1
              fill-color: 'gray'
          x-labelObstacle: true
      - text:
          label: ${NAME}
          fill-color: 'black'
          placement: point
          anchor: [0.5, 1.0]
          displacement: [0, -12]
          x-maxDisplacement: 100
          x-spaceAround: 2
    
  6. 使图像更加清晰:

    ../../../_images/point_label_3.png

4.4.4. 动感造型

  1. 我们会很快使用 标尺 根据@scale filters选择内容。

    define: &point
      size: 6
      symbols:
      - mark:
          shape: circle
          stroke-color: 'black'
          stroke-width: 1
          fill-color: 'gray'
    rules:
    - filter: ${SCALERANK < '7'}
      scale: ['4000000.0', '8000000.0']
      symbolizers:
      - point:
          <<: *point
    - filter: ${SCALERANK < '5'}
      scale: ['8000000.0', '1.7E7']
      symbolizers:
      - point:
          <<: *point
    - filter: ${SCALERANK < '4'}
      scale: ['1.7E7', '3.5E7']
      symbolizers:
      - point:
          <<: *point
    - filter: ${SCALERANK < '3'}
      scale: ['3.5E7', '7.0E7']
      symbolizers:
      - point:
          <<: *point
    - filter: ${SCALERANK < '2'}
      scale: ['7.0E7', '1.4E8']
      symbolizers:
      - point:
          <<: *point
    - filter: ${SCALERANK < '1'}
      scale: ['1.4E8', max]
      symbolizers:
      - point:
          <<: *point
    - scale: [min, '4000000.0']
      symbolizers:
      - point:
          <<: *point
    
  2. 点击 Apply 更新 Layer Preview 在每一步之后。

    ../../../_images/point_04_scale.png

    备注

    这个ysld利用了 定义 避免重复点符号内容多次。作为一个例子, scale: [min, '4000000.0'] 规则,与 define: 导致以下属性集合:

    - scale: [min, '4000000.0']
      symbolizers:
      - point:
          size: 6
          symbols:
          - mark:
              shape: circle
              stroke-color: 'black'
              stroke-width: 1
              fill-color: 'gray'
    
  3. 要添加标签,我们必须在每个比例过滤器中同时使用点和文本符号。

    define: &point
      size: 6
      symbols:
      - mark:
          shape: circle
          stroke-color: 'black'
          stroke-width: 1
          fill-color: 'gray'
    define: &label
      label: ${NAME}
      fill-color: 'black'
      font-family: Arial
      font-size: 10
      font-style: normal
      font-weight: normal
      placement: point
    rules:
    - filter: ${SCALERANK < '7'}
      scale: ['4000000.0', '8000000.0']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '5'}
      scale: ['8000000.0', '1.7E7']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '4'}
      scale: ['1.7E7', '3.5E7']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '3'}
      scale: ['3.5E7', '7.0E7']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '2'}
      scale: ['7.0E7', '1.4E8']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '1'}
      scale: ['1.4E8', max]
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - scale: [min, '4000000.0']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    
    ../../../_images/point_05_label.png
  4. 我们将使用 取代 将标签放置在每个符号的上方。

    将以下两行添加到 label 定义:

    define: &label
      label: ${NAME}
      fill-color: 'black'
      font-family: Arial
      font-size: 10
      font-style: normal
      font-weight: normal
      placement: point
      anchor: [0.5, 0]
      displacement: [0, 6]
    
    ../../../_images/point_05_align.png
  5. 对特定于供应商的参数进行一点处理,可以防止标签与每个符号发生冲突,同时使渲染引擎在允许重新定位标签的范围内具有一定的灵活性。

    将以下供应商选项添加到 label 定义:

    define: &label
      label: ${NAME}
      fill-color: 'black'
      font-family: Arial
      font-size: 10
      font-style: normal
      font-weight: normal
      placement: point
      anchor: [0.5, 0]
      displacement: [0, 6]
      x-maxDisplacement: 90
      x-spaceAround: 2
    

    将以下供应商选项添加到 point 定义:

    define: &point
      size: 6
      symbols:
      - mark:
          shape: circle
          stroke-color: 'black'
          stroke-width: 1
          fill-color: 'gray'
      x-labelObstacle: true
    
    ../../../_images/point_06_relocate.png
  6. 现在我们已经清楚地标记了我们的城市,放大到您熟悉的区域,我们可以逐个查看符号的变化。

    我们使用前面的表达式来生成适当的标签。表达式也可用于许多其他属性设置。

    这个 ne:populated_places 图层提供了几个特定的属性,以使样式更简单:

    • SCALERANK :我们已使用此属性控制显示的详细程度

    • LABELRANK :用于解决冲突的提示,允许重要城市(如首都)标记,即使它们靠近较大的邻居。

    • FEATURECLA :用于表示不同类型的城市。我们查一下 Admin-0 capital 城市。

    我们要做的第一件事就是计算点 size 使用快速表达式:

    ${10-(SCALERANK/2)}
    

    此表达式的大小应介于5和9之间,并且需要同时应用于这两个点 size 和标签 取代 .

    我们可以手动为geoserver提供标签优先级,而不是解决标签冲突的“先到先服务”默认值。为每个标签计算所提供的表达式,如果发生冲突,则以优先级最高的标签为准。

    labelrank属性从1到10,在用作地理服务器标签优先级之前需要翻转:

    ${10 - LABELRANK}
    

    此表达式将产生介于0和10之间的值,并将用于 优先 .

    define: &point
      size: ${10-(SCALERANK/2)}
      symbols:
      - mark:
          shape: circle
          stroke-color: 'black'
          stroke-width: 1
          fill-color: 'gray'
      x-labelObstacle: true
    define: &label
      label: ${NAME}
      fill-color: 'black'
      font-family: Arial
      font-size: 10
      font-style: normal
      font-weight: normal
      placement: point
      anchor: [0.5, 0]
      displacement: [0, '${''10'' - SCALERANK / ''2''}']
      priority: ${'10' - LABELRANK}
      x-maxDisplacement: 90
      x-spaceAround: 2
    
    ../../../_images/point_07_expression.png
  7. 接下来我们可以使用 FEATURECLA 检查首都。

    在顶部添加首都城市的筛选器 规则 名单:

    - filter: ${SCALERANK < '2' AND FEATURECLA = 'Admin-0 capital'}
      scale: ['7.0E7', max]
      name: capitals
      symbolizers:
      - point:
          symbols:
          - mark:
              shape: star
              stroke-color: 'black'
              stroke-width: 1
              fill-color: 'gray'
      - text:
          label: ${NAME}
          fill-color: 'gray'
          placement: point
    - filter: ${FEATURECLA = 'Admin-0 capital'}
      scale: [min, '7.0E7']
      name: capitals
      symbolizers:
      - point:
          symbols:
          - mark:
              shape: star
              stroke-color: 'black'
              stroke-width: 1
              fill-color: 'gray'
      - text:
          label: ${NAME}
          fill-color: 'gray'
          placement: point
    

    更新人口稠密的地方过滤器以忽略首都:

    - filter: ${SCALERANK < '7' AND FEATURECLA <> 'Admin-0 capital'}
      scale: ['4000000.0', '8000000.0']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '5' AND FEATURECLA <> 'Admin-0 capital'}
      scale: ['8000000.0', '1.7E7']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '4' AND FEATURECLA <> 'Admin-0 capital'}
      scale: ['1.7E7', '3.5E7']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '3' AND FEATURECLA <> 'Admin-0 capital'}
      scale: ['3.5E7', '7.0E7']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '2' AND FEATURECLA <> 'Admin-0 capital'}
      scale: ['7.0E7', '1.4E8']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - filter: ${SCALERANK < '1' AND FEATURECLA <> 'Admin-0 capital'}
      scale: ['1.4E8', max]
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    - scale: [min, '4000000.0']
      symbolizers:
      - point:
          <<: *point
      - text:
          <<: *label
    
    ../../../_images/point_09_fill.png
  8. 如果您想检查您的工作,最终文件在这里: point_example.ysld

4.4.5. 奖金

4.4.5.1. 挑战几何位置

  1. 这个 mark 属性可用于呈现任何几何内容。

  2. 挑战: 通过使用 mark 财产。

    备注

    回答 discussed 在工作簿的末尾。

4.4.5.2. 探索动态符号化

  1. 我们做了大量的工作来设置过滤器,以便在首都的星和圆之间进行选择。

    这种方法在单独应用时非常简单:

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

    当与检查另一个属性或检查@scale(如我们的示例中所示)结合使用时,这种方法可能很快导致许多规则难以保持直线。

  2. 仔细看看, shape 实际上可以用字符串表示:

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

    在SLD中表示为:

     <sld:PointSymbolizer>
       <sld:Graphic>
          <sld:Mark>
             <sld:WellKnownName>star</sld:WellKnownName>
             <sld:Fill/>
             <sld:Stroke/>
          </sld:Mark>
       </sld:Graphic>
    </sld:PointSymbolizer>
    
  3. GeoServer认识到SLD标记和外部图形的这种局限性,并为动态符号化提供了机会。

    这是通过在传递给符号或url的字符串中嵌入一个小的cql表达式来实现的。此子表达式与 ${{ }} 如图所示:

    - point:
        symbols:
        - mark:
            shape: ${if_then_else(equalTo(FEATURECLA,'Admin-0 capital'),'star','circle')}
    

    在SLD中表示为:

     <sld:PointSymbolizer>
       <sld:Graphic>
          <sld:Mark>
             <sld:WellKnownName>${if_then_else(equalTo(FEATURECLA,'Admin-0 capital'),'star','circle')}</sld:WellKnownName>
             <sld:Fill/>
             <sld:Stroke/>
          </sld:Mark>
       </sld:Graphic>
    </sld:PointSymbolizer>
    
  4. 挑战: 使用此方法重写 动感造型 例子。

    备注

    回答 provided 在工作簿的末尾。

4.4.5.3. 挑战层组

  1. 使用A 图层组 探索符号学如何一起工作以形成地图。

    • 东北:东北1

    • NE:州政府

    • NE:人口密集的地方

  2. 在这里帮助开始工作的方式是 ne:states_provinces_shp

    symbolizers:
    - polygon:
        stroke-color: 'black'
        stroke-width: 0.25
        stroke-opacity: 0.5
        fill-color: 'white'
        fill-opacity: 0.05
    - polygon:
        stroke-color: 'black'
        stroke-width: 0.25
        stroke-opacity: 0.5
        fill-color: ${Recode(mapcolor9,'1','#8dd3c7','2','#ffffb3','3','#bebada','4','#fb8072','5','#80b1d3','6','#fdb462','7','#b3de69','8','#fccde5','9','#d9d9d9')}
        fill-opacity: 0.5
    
  3. 这个背景比较繁忙,必须注意确保符号和标签都清晰可见。

  4. 挑战: 在这个繁忙的背景下,尽你所能地为居住区设计风格。

    下面是一个带有灵感标签的示例:

    ../../../_images/point_challenge_1.png

    备注

    回答 provided 在工作簿的末尾。

4.4.5.4. 探索真正的字体

  1. 除了图像格式,geoserver还可以使用其他类型的图形,例如真字体:

    symbolizers:
    - point:
        symbols:
        - mark:
            shape: ttf://Webdings#0x0064
            stroke-color: 'blue'
            stroke-width: 1
    
  2. 其他字体已放入 styles 目录可供使用。

4.4.5.5. 浏览自定义图形

  1. GeoServer渲染引擎允许Java开发人员勾引额外的符号支持。

    geoserver使用此工具提供用于填充图案的形状。社区扩展允许使用简单的自定义形状甚至图表。

  2. 使用WKT几何图形表示添加了对自定义图形的支持。

    symbolizers:
    - point:
        symbols:
        - mark:
            shape: wkt://MULTILINESTRING((-0.25 -0.25, -0.125 -0.25), (0.125 -0.25, 0.25 -0.25), (-0.25 0.25, -0.125 0.25), (0.125 0.25, 0.25 0.25))
            stroke-color: 'blue'
            stroke-width: 1
    
Previous: 4.3. 多边形