功能

函数是在计算ysld参数值时可以使用的附加操作。在大多数情况下,参数的值可以是函数的输出(结果)。

在样式文档中的大多数地方都可以使用函数。

句法

函数不是其自身的参数,而是用作参数值的一部分,或者实际上在任何表达式中。所以语法非常一般,例如:

<parameter>: ${<function>}

函数在呈现时进行计算,因此输出作为参数值传递,然后相应地呈现。

功能列表

函数的引用列表可以在 GeoServer User Manual 也可以在 GeoTools User Manual Function List .

函数可以松散地分为几何函数、数学函数和字符串函数等类别。

主题功能

有三个重要功能通常比使用规则更容易用于主题化,并且可以大大简化样式文档: 重新编码分类插入 .

重新编码 :属性值直接映射到样式属性::

recode(attribute,value1,result1,value2,result2,value3,result3,...)

这相当于使用类似的筛选器创建多个规则:

rules:
- ...
  filter: ${attribute = value1}
  - ...
    <property>: result1
- ...
  filter: ${attribute = value2}
  - ...
    <property>: result2
- ...
  filter: ${attribute = value3}
  - ...
    <property>: result3

分类 :类别是使用最小和最大范围定义的,属性值被分类为适当的类别::

categorize(attribute,category0,value1,category1,value2,category2,...,belongsTo)

这会造成一种情况, attribute 值,如果小于 value1 将得到的结果 category0 ;如果介于 value1value2 ,将给出 category1 ;如果介于 value2value3 ,将给出 category2 等。值必须按升序排列。

这个 belongsTo 参数是可选的,并且可以是 succeedingpreceding .它定义查找值等于 attribute 值。如果 attribute 值等于 value1suceeding 如果使用,则结果将为 category1 .如果 preceding 如果使用,则结果将为 category0 . 默认值为 succeeding .

这相当于创建以下多个规则:

rules:
- ...
  filter: ${attribute < value1}
  - ...
    <property>: category0
- ...
  filter: ${attribute >= value1 AND attribute < value2}
  - ...
    <property>: category1
- ...
  filter: ${attribute >= value2}
  - ...
    <property>: category2

插入 :用于通过基于属性值计算样式属性来平滑主题量化数据。这类似于分类,只是值是连续的而不是离散的:

interpolate(attribute,value1,entry1,value2,entry2,...,mode,method)

这会造成一种情况, attribute 值,如果等于 value1 将得到的结果 entry1 ;如果中间 value1value2 会得到中间的结果 entry1entry2 ;如果四分之三 value1value2 将得到四分之三的结果 entry1entry2 等。

这个 mode 参数是可选的,并且可以是 linearcosinecubic .它定义要使用的插值算法,并默认为 linear .

这个 method 参数是可选的,并且可以是 numericcolor .它决定了 entry1entry2 ,…是数字或颜色,默认为 numeric .

在向量样式中没有等价于此函数的。在栅格样式中,与此最接近的是颜色渐变。

这三个主题功能可以通过下表进行简单总结:

功能

输入类型

输出类型

重新编码

离散的

离散的

分类

连续

离散的

插入

连续

连续

实例

在线条端点处显示旋转箭头

这个 startPoint(geom)endPoint(geom) 函数将几何图形作为参数,并分别返回几何图形的起点和终点。这个 startAngle(geom)endAngle(geom) 函数将几何图形作为参数,并分别返回在几何图形的起点和终点处终止的线的角度。这些函数可用于在线条几何图形的末端显示箭头,并旋转箭头以匹配线条的方向:

feature-styles:
- rules:
  - symbolizers:
      - line:
          stroke-width: 1
      - point:
          geometry: ${endPoint(geom)}
          rotation: ${endAngle(geom)}
          size: 24
          symbols:
          - mark:
              shape: 'shape://carrow'
              fill-color: '#000000'
../../../_images/functions_arrows.png

端点箭头

放置阴影

这个 offset(geom, x, y) 函数获取一个几何图形和两个值,并将几何图形替换为 xy 方向。这可用于创建投影效果:

feature-styles:
- name: shadow
  rules:
  - symbolizers:
    - polygon:
        stroke-width: 0.0
        fill-color: '#000000'
        fill-opacity: 0.75
        geometry: ${offset(geom, 0.0001, -0.0001)}
- name: fill
  rules:
  - symbolizers:
    - polygon:
      stroke-width: 0.0
      fill-color: '#00FFFF'
../../../_images/functions_dropshadow.png

放置阴影

不同颜色的轮廓

这个 buffer(geom, buffer) 函数将一个几何图形和一个值作为参数,并返回一个边界等于原始几何图形加上该值的多边形几何图形。这可用于生成用不同颜色填充的扩展轮廓,例如设置海岸线样式:

feature-styles:
- name: shoreline
  rules:
  - polygon:
      fill-color: '#00BBFF'
      geometry: ${buffer(geom, 0.00025)}
- name: land
  rules:
  - polygon:
      fill-color: '#00DD00'
../../../_images/functions_buffer.png

缓冲大纲

参见:

显示线条顶点

这个 vertices(geom) 函数获取几何图形并返回表示几何图形顶点的点集合。这可用于将多边形或线几何体转换为点几何体:

point:
  geometry: vertices(geom)
../../../_images/functions_vertices.png

端点箭头

参见:

两点之间的角度

这个 atan2(x, y) 函数计算(y/x)的反正切值,因此可以确定两点之间的角度(以弧度为单位)。此函数使用x和y值的符号来确定计算的角度,因此它比 atan() . 这个 getX(point_geom)getY(point_geom) 提取 xy 分别来自几何体的坐标,而 toDegrees(value) 从弧度转换为度数:

point:
  symbols:
  - mark:
      shape: triangle
  rotation: ${toDegrees(atan2(
    getX(startPoint(the_geom))-getX(endPoint(the_geom)),
    getY(startPoint(the_geom))-getY(endPoint(the_geom))))}

参见:

基于大范围值缩放对象

这个 log(value) 函数返回所提供值的自然对数。使用 log(value)/log(base) 指定不同的基。

例如,指定 log(population)/log(2) 当人口增加一倍时,产量将增加1。这使人们能够以一致的比例显示相对大小,同时仍然能够表示非常小和非常大的人口:

point:
  symbols:
  - mark:
      shape: circle
  size: ${log(population)/log(2)}

参见:

将多个字符串组合成一个字符串

这个 Concatenate(string1, string2, ...) 函数接受任意数量的字符串,并将它们组合成单个字符串。这可用于在单个标签中显示多个属性:

text:
  label: ${Concatenate(name, ', ', population)}

大写单词

这个 strCapitalize(string) 函数接受单个字符串,并将字符串中每个单词的第一个字母大写。这可用于大写从小写文本创建的标签:

text:
  label: ${strCapitalize(name)}

参见:

基于离散值的颜色

在某些情况下,可以使用主题函数代替过滤器,以更简单地生成类似的输出。例如,recode函数可以获取属性并根据属性值输出不同的值。因此,可以在一行中完成整个构造,而不是各种过滤器。例如,这可以用于为不同类型的建筑着色:

feature-styles:
- name: name
  rules:
  - symbolizers:
    - polygon:
        fill-color:
          ${recode(zone,
          'I-L', '#FF7700',
          'I-H', '#BB6600',
          'C-H', '#0077BB',
          'C-R', '#00BBDD',
          'C-C', '#00DDFF',
          '', '#777777')}

在上面的示例中,属性是 zone ,然后每个后续对由一个属性值和一个颜色组成。

../../../_images/functions_recode.png

重编码功能

基于类别的颜色

category函数根据属性值匹配的范围(类别)返回不同的值。这也可以通过减少过滤器的数量使样式更简单。此示例使用 categorize 根据 YEARBLT 属性:

feature-styles:
- name: name
  rules:
  - symbolizers:
     - polygon:
        stroke-color: '#000000'
        stroke-width: 0.5
        fill-color:
          ${categorize(YEARBLT, '#DD4400',
          1950,'#AA4400',
          1960,'#886600',
          1970,'#668800',
          1980,'#44BB00',
          1990,'#22DD00',
          2000,'#00FF00')}
../../../_images/filters_categories.png

分类功能

合唱团地图

这个 interpolate 函数可用于通过在属性值之间插入来创建一组连续的值。这可用于创建基于某些连续属性(如“面积”或“总体”)为区域显示不同颜色的脊索动物地图:

feature-styles:
- name: name
  rules:
  - title: fill-graphic
    symbolizers:
    - polygon:
        stroke-width: 1
        fill-color: ${interpolate(PERSONS, 0.0, '#00FF00', 1e7,'#FF0000', 'color')}
../../../_images/functions_choropleth.png

合唱团地图