表达

作者

德克·蒂尔格

联系

米里乌普德德德德克

作者

乌姆贝托·尼科莱蒂

联系

gmail.com上的umberto.nicoletti

最后更新

2018-08-24

介绍

从6.0版开始,表达式在四个地方使用:

字符串引号

字符串可以用单引号或双引号引起来:

'This is a string'
"And this is also a string"

字符串中的引号转义

备注

低于5.0的MapServer版本不支持引号转义。

从MapServer 5.0开始,如果数据集包含双引号,则可以使用类似C的转义序列:

"National \"hero\" statue"

要转义单引号,请使用以下序列:

"National \'hero\' statue"

从MapServer6.0开始,不需要在双引号字符串中转义单引号,也不需要在单引号字符串中转义双引号。在6.0中,还可以按如下方式编写字符串:

'National "hero" statue'
...

要转义单引号,请使用以下序列:

"National 'hero' statue"

使用属性

属性值可以在映射文件中引用并在表达式中使用。属性引用区分大小写,可用于以下类型的表达式:

  • LAYER “过滤器”

  • CLASS “表达式”

  • CLASS “文本”

引用属性是通过将属性名括在方括号中来完成的,如:[attributeName]。然后,每次出现“[attributename]”都将替换为属性“attributename”的实际值。

示例:我们层的数据集具有属性“buildingu name”。我们希望此属性的值出现在字符串中。这可以通过以下方式完成(单引号或双引号):

'The [BUILDING_NAME] building'

对于其建筑名称属性设置为“历史博物馆”的建筑,生成的字符串为:

'The Historical Museum building'

为了 栅格数据 已经定义了可用于分类的图层特殊属性,例如:

  • [像素]…将成为像素值作为数字

  • [红色]、[绿色]、[蓝色]…将分别成为像素值中红色、绿色和蓝色分量的颜色值。

表达式类型

表达式用于将属性值与某些逻辑检查相匹配。可以与MapServer一起使用三种不同类型的表达式:

  • 字符串比较:将单个属性与字符串值进行比较。

  • 正则表达式:单个属性与正则表达式匹配。

  • 列表表达式:将字符串属性与多个可能值的列表进行比较

  • 逻辑“MapServer表达式”:使用逻辑表达式比较一个或多个属性。

字符串比较(相等)

字符串比较的意思是,顾名思义,如果属性值等于某个值,则检查属性值。字符串比较是MapServer表达式的最简单形式,也是最快的选项。

使用字符串比较来筛选 LAYER FILTERITEMFILTER FILTERITEM FILTER CLASSITEMLAYER EXPRESSIONCLASS 对象。

简单字符串比较筛选器示例

FILTER "2005"
FILTERITEM "year"

将匹配属性“year”设置为“2005”的所有记录。呈现的映射将显示为数据集将只包含那些“year”设置为“2005”的项。

CLASSITEMLAYER 以及 EXPRESSIONCLASS

LAYER
    NAME "example"
    CLASSITEM "year"
    ...
    CLASS
        NAME "year-2005"
        EXPRESSION "2005"
        ...
    END
END

CLASSITEMFILTERITEM

正则表达式比较

正则表达式是来自Unix世界的标准文本模式匹配机制。正则表达式匹配的功能由UNIX系统上的操作系统提供,因此稍微依赖于操作系统。但是,它们的最小功能集是由POSIX标准定义的。在UNIX系统上,特定正则表达式库的文档通常位于“regex”手册页(“man regex”)。

FILTERITEMLAYER FILTER) 或 CLASSITEMCLASS EXPRESSION) LAYER FILTERCLASS EXPRESSION.

正则表达式通常由具有特殊含义的字符和解释为它们的字符组成。字母数字字符(a-z、a-z和0-9)按原样处理。具有特殊含义的字符包括:

  • **.*将匹配单个字符。

  • [**和]**用于分组。例如*[A-Z]*将匹配字符A、B、C、…、X、Y、Z。

  • ********和**用于指定某些内容应匹配的频率。

  • **^**匹配开头,**$**匹配值的结尾。

  • 反斜杠****用于去除特殊含义。例如,*$*与美元符号匹配。

mapserver支持两个regex运算符:

  • **~**区分大小写的正则表达式

  • **~***不区分大小写的正则表达式

以下 LAYER 配置将使地图上呈现的所有记录在名为“placename”的属性中具有“hotel”

LAYER
    NAME 'regexp-example'
    FILTERITEM 'placename'
    FILTER /hotel/
    ...
END

备注

为了 FILTER,

示例:匹配属性“year”中值为2000到2010的记录:

FILTERITEM "year"
FILTER /^20[0-9][0-9]/

示例:匹配纯数字或空的所有记录

FILTER /^[0-9]*$/

示例:匹配 name 属性以“by”、“by”、“by”或“by”结尾(不区分大小写匹配):

EXPRESSION ('[name]' ~* 'by$')

示例:匹配 rdname 属性以“main”开头。

LAYER
...
CLASSITEM 'rdname'
CLASS

  EXPRESSION /^Main.*$/

备注

如果在使用MapServer和正则表达式时经常遇到分段错误,则可能是当前工作环境链接到多个正则表达式库。当mapserver与带有自己副本的组件(如apache httpd或php)链接时,就会发生这种情况。在这些情况下,作者在使用操作系统的正则表达式库(即libc中的正则表达式库)制作所有这些组件方面取得了最好的经验。然而,这涉及到编辑一些组件的构建文件。

列表表达式

6.4 新版功能.

列出表达式(请参见 MS RFC 95:支持表达式分析器中的列表 )是将字符串属性与多个可能值的列表进行比较的有效方法。它们的行为复制了现有的regex或MapServer表达式,但是它们的性能要高得多。要激活它们,请在{}之间用逗号分隔的值列表, 没有 添加引号或额外空格。

LAYER
    NAME 'list-example'
    CLASSITEM 'roadtype'
    ...
    CLASS
      EXPRESSION {motorway,trunk}
      #equivalent to regex EXPRESSION /motorway|trunk/
      #equivalent to MapServer EXPRESSION ("[roadtype]" IN "motorway,trunk")
      ...
    END
    CLASS
      # spaces in attribute names are supported
      EXPRESSION {primary road,secondary road}
      ...
    END
END

警告

列表表达式不支持引号转义或包含逗号的属性值。

“MapServer表达式”

mapserver表达式是最复杂的,并且根据它们的编写方式,可能会变得非常慢。它们可以匹配任何属性,从而允许根据多个属性进行过滤和分类。除了纯逻辑运算之外,还有允许某些算术、字符串和时间运算的表达式。

为了能够将mapserver表达式用于过滤器或表达式值,表达式最终必须成为逻辑值。

打字

属性和文本的类型确定如下:

  • 字符串:用引号或单引号字符括起来

"[string_attribute]" or '[string_attribute]'
"string_literal" or 'string_literal'
  • 数字:不报价

[numeric_attribute]
numeric_value
  • 日期时间:后引号字符

`[date_time_attribute]`
`date_time_literal`

逻辑表达式

逻辑表达式将逻辑值作为其输入并返回逻辑值。逻辑表达式为“true”或“false”。完整表达式需要用方括号括起来,但单个逻辑表达式只需要方括号来建立优先级或保持清晰。

  • (表达式1和表达式2)

    (表达式1)和(表达式2)

    (表达式1)&(表达式2)

    当两个逻辑表达式(expression1和expression2)都为true时返回true。

  • (表达式1)或(表达式2)

    (表达式1)(表达式2))

    当至少一个逻辑表达式(expression1或expression2)为true时返回true。

  • 不(表达式1)

    !(表达式1)

    当expression1为false时返回true。

返回逻辑值的字符串表达式

在语法上,字符串是用单引号或双引号封装的。

  • (字符串1“eq”字符串2“)

    (“string1”=“string2”)-自6.0起已弃用

    (“String1”=“字符串2”)

    字符串相等时返回true。区分大小写。

  • (“字符串1”=*“字符串2”)

    字符串相等时返回true。不区分大小写。

  • (Strug1)!=“STRIG2”

    (字符串1“ne”字符串2“)

    当字符串不相等时返回true。

  • (字符串1“<”字符串2“)

    (字符串1“lt”字符串2“)

    当“string1”在词典上小于“string2”时返回true

  • (字符串1“>”字符串2“)

    (“字符串1”gt“字符串2”)

    当“string1”在词典上大于“string2”时返回true。

  • (“string1”<=“string2”)

    (“字符串1”le“字符串2”)

    当“string1”在词典上小于或等于“string2”时返回true

  • (“String1”>=“字符串2”)

    (第1行“GE”第2行)

    当“string1”在词典上大于或等于“string2”时返回true。

  • (“token1,token2,…,tokenn”中的“string1”)

    当“string1”等于给定的标记之一时返回true。

    备注

    标记的分隔符是逗号。这意味着列表中不能有不必要的空白,并且不能比较其中包含逗号的令牌。

  • (“字符串1”~“regexp”)

    当“string1”与正则表达式“regexp”匹配时返回true。此操作与前面描述的正则表达式匹配相同。

  • (“字符串1”~*“regexp”)

    当“string1”与正则表达式“regexp”匹配时返回true(不区分大小写)。此操作与前面描述的正则表达式匹配相同。

返回逻辑值的算术表达式

算术运算的基本元素是数字。返回数字的算术运算将在下一节中介绍。

  • (N1 EQ N2)

    (n1==n2)-自6.0起已弃用

    (n1= n2)

    当数字相等时返回true。

  • (N1!= N2)

    (N1 Ne N2)

    当数字不相等时返回true。

  • (n<n2)

    (N1 LT N2)

    当n1小于n2时返回true。

  • (n1> n2)

    (N1 GT N2)

    当n1大于n2时返回true。

  • (n<<n2)

    (N1 LE N2)

    当n1小于或等于n2时返回true。

  • (n1>=n2)

    (N1 Ge N2)

    当n1大于或等于n2时返回true。

  • (N1在“数字1,数字2,…,数字n”中)

    当n1等于给定数字之一时返回true。

返回逻辑值(geos)的空间表达式

  • (形状1等于形状2)

    如果shape1和shape2相等,则返回true

  • (形状1与形状2相交)

    6.0 新版功能.

    如果shape1和shape2相交,则返回true

  • (形状1不相交形状2)

    6.0 新版功能.

    如果shape1和shape2不相交,则返回true

  • (形状1接触形状2)

    6.0 新版功能.

    如果shape1和shape2触摸,则返回true

  • (形状1与形状2重叠)

    6.0 新版功能.

    如果shape1和shape2重叠,则返回true

  • (形状1与形状2交叉)

    6.0 新版功能.

    如果shape1和shape2交叉,则返回true

  • (形状1在形状2中)

    6.0 新版功能.

    如果shape1在shape2内,则返回true

  • (形状1包含形状2)

    6.0 新版功能.

    如果shape1包含shape2,则返回true

  • (形状1 dwithin形状2)

    6.0 新版功能.

    如果shape1和shape2之间的距离等于0,则返回true

  • (形状1超出形状2)

    6.0 新版功能.

    如果shape1和shape2之间的距离大于0,则返回true

返回字符串的字符串操作

  • “字符串1”+“字符串2”

    返回“String1String2”,即两个串互相连接。

返回字符串的函数

  • ToString(N1,“格式1”)

    6.0 新版功能.

    使用“format1”格式化数字n1(C样式格式化-sprintf)。

  • Commify(“字符串1”)

    6.0 新版功能.

    将数千个分隔符(逗号)添加到一个长数字中,使其更具可读性。

  • 上(“字符串1”)

    7.0 新版功能.

    强制所有字符为大写

  • 下(“字符串1”)

    7.0 新版功能.

    强制所有字符为小写

  • initcap(“字符串1”)

    7.0 新版功能.

    对于字符串中的每个单词,强制第一个字符为大写,其余字符为小写。

  • FirstCap(“字符串1”)

    7.0 新版功能.

    在字符串的第一个单词中,强制第一个字符为大写,其余字符为小写。

返回数字的字符串函数

  • 长度(“字符串1”)

    返回“string1”的字符数

返回数字的算术运算和函数

  • 圆形(n1,n2)

    6.0 新版功能.

    返回n1舍入为n2的倍数:n2*舍入(n1/n2)

  • 轮次(N1)

    8.0 新版功能.

    返回四舍五入为最接近的整数的N1(添加SLD互操作性)

  • N1+N2

    返回n1和n2的和

  • N1-N2

    返回从n1减去n2

  • N1*N2

    返回n1乘以n2

  • N1/N2>

    返回n1除以n2

  • -N1型

    返回n1否定

  • N1^ N2

    将n1返回n2的幂

  • N1%N2

    返回n1%n2(模数运算符)。这将返回一个数除以另一个数后的余数,例如10%3返回1。

备注

当上面的数字运算像逻辑运算一样使用时,以下规则适用:等于零的值将被视为“假”,其他所有值都将为“真”。这意味着

( 6 + 5 )

会返回真的,但是

( 5 - 5 )

将返回false。

返回数字的空间函数(geos)

  • 面积(形状1)

    6.0 新版功能.

    返回形状1的区域

返回形状的空间函数(geos)

  • FromText(“字符串1”)

    6.0 新版功能.

    返回字符串1对应的形状(wkt-已知文本)

    fromText('POINT(500000 5000000)')
    
  • 缓冲器(形状1、N1)

    6.0 新版功能.

    返回用bufferDistance n1缓冲shape1时产生的形状

  • 差异(形状1、形状2)

    6.0 新版功能.

    返回从shape1中减去shape1和shape2的公共区域时产生的形状

时间表达式

MapServer使用内部时间类型进行比较。要将一个字符串转换成这个时间类型,它将从上到下检查下面的列表,以检查指定的时间是否匹配,如果匹配,它将进行转换。以下是整数值: YYYY 年, MMDD -日期, hh -小时, mm 分钟, ss -秒。以下是格式的字符元素:-**(破折号)-日期分隔符,(冒号)-时间分隔符, **T -标记时间组件的开始(ISO 8601),空格-标记日期的结束和时间组件的开始, Z -祖鲁时间(0 UTC偏移)。

  • `年:月:日:月:日`

  • `年:月:日:月:秒`

  • `年-月-日hh:mm:ss`

  • `年-月-日-时:月`

  • `年-月-日hh:mm`

  • `年-月-日`

  • `年-月-日hh`

  • ‘YYYY-MM-DD’

  • ‘yyyymm’

  • 'yyyy'

  • THH:mm:SSZ’

  • `厚度:mm:ss`

对于通过这种方式获得的时间值,支持以下操作:

  • (T1 EQ T2)

    (T1==T2)-自6.0起已弃用

    (t1=t2)

    当时间相等时返回true。

  • (T1!= t2)

    (T1 NE T2)

    当时间不相等时返回true。

  • (T1<T2)

    (T1、LT、T2)

    当T1早于T2时返回true

  • (T1> T2)

    (T1 GT T2)

    当T1晚于T2时返回true。

  • (t1 <t= t2)

    (T1 LE T2)

    当T1早于或等于T2时返回true

  • (t1>=t2)

    (T1 GE T2)

    当T1晚于或等于T2时返回true。