过滤器

过滤器是允许有选择地应用规则的谓词。

过滤器可以采用许多不同的形式。

备注

刻度是一种过滤器,但是 discussed separately .

备注

有关详细信息,请参阅 GeoTools CQL documentationGeoServer CQL tutorial .

句法

过滤器的基本语法是:

rules:
  ...
  filter: ${<expression>}
  ...

在哪里? <expression> 是任何有效的cql/ecql筛选器。

备注

注意过滤器应用于 rules 所以出现在它们里面,但在任何 symbolizers .

过滤器类型

如上所述,过滤器可以是使用cql/ecql(扩展/上下文查询语言)进行的任何有效构造。

cql是使用熟悉的基于文本的语法编写的,与SQL语句有很强的相似性。可以将cql表达式看作SQL语句的“where”子句。

以下均为标准过滤器结构:

对象比较

此筛选器将测试与属性的比较是否为真。其形式如下:

${<attribute> <operator> <value>}

在哪里?

属性

必修的?

描述

默认值

<attribute>

是的

将要与之比较的事物。通常为 属性名 .可能区分大小写。

不适用

<operator>

是的

比较方法。有效的运算符是 =<><=>=<>LIKEILIKEBETWEENIS NULLIN . NOT 可以添加以反转比较。

不适用

<value>

是的

那是什么 <attribute> 正在与比较。通常静态值(如字符串或标量)可以是计算为静态值的表达式。可以包括数学运算符,例如 +-*/ . 使用 单引号 对于字符串,双引号将解释为属性名。省略标量值的引号。

不适用

以下是所有可用操作员的说明:

算符

描述

=

等于

<

小于(不含)

>

大于(非包含)

<=

小于或等于(含)

>=

大于或等于(含)

LIKE

字符串和其他非数字属性的模糊匹配。添加 % 用于多字符通配符,以及 _ 对于单字符通配符。

ILIKE

不区分大小写的版本 LIKE

BETWEEN

测试两个给定值之间的值

IS NULL

用于测试 NULL 价值

IN

用于指定列表。必须包含在列表中,语句才能为真。

NOT

否定布尔(真/假)条件。可与其他运算符一起使用,例如 NOT LIKENOT BETWEEN .

<>

不相等(仅在比较字符串或数值时使用)

备注

这些运算符不区分大小写,但为了易读性和一致性,在所有大小写中都显示了这些运算符。

空间过滤器

过滤器在本质上可以是空间的。任何有效的空间结构 WKT (Well Known Text) 可以使用。空间过滤器包括 INTERSECTSDISJOINTCONTAINSWITHINTOUCHESCROSSESEQUALSDWITHINBBOX . NOT 可以添加以否定条件。

有关这些空间过滤器及其语法的详细信息,请参阅 GeoServer ECQL referenceuDig CQL reference .

复合语句

筛选器可以是语句的组合。一种常见的情况是测试一个属性的值是否大于一个值但小于另一个值。

创建复合语句的语法是使用标准的布尔符号,例如 ANDORNOT 以及相关的括号。

例如,两个语句都需要为真的过滤器是:

filter: ${<statement1> AND <statement2>}

其中任何一个语句都需要为true的筛选器为:

filter: ${<statement1> OR <statement2>}

较大的过滤器可以这样建立:

filter: ${(<statement1> OR <statement2>) AND <statement3> OR NOT <statement4>}

在这些例子中,每个 <statement> 是有效的筛选器。

在优先权方面, AND 先评估,后评估 OR ,除非用括号修改。所以,在上面的最后一个例子中, (<statement1> OR <statement2>) 将首先进行评估,然后是评估结果 AND <statement3> 最后结果是 OR NOT <statement4> .

实例

基于属性的筛选器大小

过滤器用于根据特定条件设置层的不同特征的样式。这个 ILIKE 运算符用于比较两个字符串(忽略大小写),以查看它们是否相似。使用时 LIKEILIKE , the % 字符匹配任何数量的字母(所以 %hwy 匹配任何以 hwy )。此示例使用过滤器区分公路、道路和其他街道,并使用不同的颜色和大小绘制它们:

feature-styles:
- rules:
  - filter: ${streetname ILIKE '%hwy'}
      symbolizers:
      - line:
          stroke-color: '#007799'
          stroke-width: 8
  - filter: ${streetname ILIKE '%rd'}
      symbolizers:
      - line:
          stroke-color: '#00AA00'
          stroke-width: 4
  - else: true
      symbolizers:
      - line:
          stroke-color: black
          stroke-width: 2
../../../_images/filters_roadtypes.png

根据道路类型过滤

基于属性值过滤颜色

过滤器还可以用来根据数据的属性给地图上色。下面的示例使用 YEARBLT 根据不同的地块的建造年份,为其上色。这个 else 仅当不应用其他筛选规则时才应用规则

备注

重新编码 function 可以以更紧凑的语法执行相同的功能。

name: Year Built Filter
feature-styles:
- rules:
  - filter: ${YEARBLT > 2000}
    symbolizers:
    - polygon:
        stroke-color: '#000000'
        stroke-width: 0.5
        fill-color: '#00FF00'
  - filter: ${YEARBLT > 1990 AND YEARBLT < 2000}
    symbolizers:
    - polygon:
        stroke-color: '#000000'
        stroke-width: 0.5
        fill-color: '#22DD00'
  - filter: ${YEARBLT > 1980 AND YEARBLT < 1990}
    symbolizers:
    - polygon:
        stroke-color: '#000000'
        stroke-width: 0.5
        fill-color: '#44BB00'
  - filter: ${YEARBLT > 1970 AND YEARBLT < 1980}
    symbolizers:
    - polygon:
        stroke-color: '#000000'
        stroke-width: 0.5
        fill-color: '#668800'
  - else: true
    symbolizers:
    - polygon:
        stroke-color: '#000000'
        stroke-width: 0.5
        fill-color: '#DD4400'
../../../_images/filters_categories.png

基于属性值筛选

按边界框过滤

空间过滤器可用于根据图层的几何图形过滤图层。这个 bbox 过滤器可用于选择包含在边界框中的特征。此示例将边界框内的多边形着色为橙色,将边界框外的多边形着色为蓝色:

name: Spatial Filter
feature-styles:
- name: name
  rules:
  - filter: bbox(the_geom, -122.9, 42.36, -122.85, 42.28)
    symbolizers:
    - polygon:
         fill-color: '#99CC00'
  - else: true
    symbolizers:
    - polygon:
         fill-color: '#0099CC'
../../../_images/filters_bbox.png

详细信息 bbox 滤波器

按任意几何图形过滤

空间过滤器也可以用来比较层几何图形和任意几何图形,而不仅仅是边界框。在这个例子中, within 过滤器用于选择三角形区域内的所有建筑,该三角形区域使用众所周知的文本(WKT)定义,并将它们涂成绿色。所有其他功能均为蓝色:

feature-styles:
- name: name
  rules:
  - filter: within(the_geom, POLYGON ((-122.9075 42.3625, -122.8225 42.3625, -122.8268 42.2803, -122.9075 42.3625)))
    symbolizers:
    - polygon:
        fill-color: '#00CC00'
  - else: true
    symbolizers:
    - polygon:
        fill-color: '#0099CC'
../../../_images/filters_within.png

使用筛选 within

Previous: 缩放
Next: 功能