表达¶
- 作者
德克·蒂尔格
- 联系
米里乌普德德德德克
- 作者
乌姆贝托·尼科莱蒂
- 联系
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"
使用属性¶
属性值可以在映射文件中引用并在表达式中使用。属性引用区分大小写,可用于以下类型的表达式:
引用属性是通过将属性名括在方括号中来完成的,如:[attributeName]。然后,每次出现“[attributename]”都将替换为属性“attributename”的实际值。
示例:我们层的数据集具有属性“buildingu name”。我们希望此属性的值出现在字符串中。这可以通过以下方式完成(单引号或双引号):
'The [BUILDING_NAME] building'
对于其建筑名称属性设置为“历史博物馆”的建筑,生成的字符串为:
'The Historical Museum building'
为了 栅格数据 已经定义了可用于分类的图层特殊属性,例如:
[像素]…将成为像素值作为数字
[红色]、[绿色]、[蓝色]…将分别成为像素值中红色、绿色和蓝色分量的颜色值。
表达式类型¶
表达式用于将属性值与某些逻辑检查相匹配。可以与MapServer一起使用三种不同类型的表达式:
字符串比较:将单个属性与字符串值进行比较。
正则表达式:单个属性与正则表达式匹配。
列表表达式:将字符串属性与多个可能值的列表进行比较
逻辑“MapServer表达式”:使用逻辑表达式比较一个或多个属性。
字符串比较(相等)¶
字符串比较的意思是,顾名思义,如果属性值等于某个值,则检查属性值。字符串比较是MapServer表达式的最简单形式,也是最快的选项。
使用字符串比较来筛选 LAYER FILTERITEM 和 FILTER FILTERITEM FILTER CLASSITEM 在 LAYER EXPRESSION 在 CLASS 对象。
简单字符串比较筛选器示例
FILTER "2005"
FILTERITEM "year"
将匹配属性“year”设置为“2005”的所有记录。呈现的映射将显示为数据集将只包含那些“year”设置为“2005”的项。
CLASSITEM 在 LAYER 以及 EXPRESSION 在 CLASS :
LAYER
NAME "example"
CLASSITEM "year"
...
CLASS
NAME "year-2005"
EXPRESSION "2005"
...
END
END
CLASSITEM 和 FILTERITEM
正则表达式比较¶
正则表达式是来自Unix世界的标准文本模式匹配机制。正则表达式匹配的功能由UNIX系统上的操作系统提供,因此稍微依赖于操作系统。但是,它们的最小功能集是由POSIX标准定义的。在UNIX系统上,特定正则表达式库的文档通常位于“regex”手册页(“man regex”)。
FILTERITEM ( LAYER FILTER) 或 CLASSITEM ( CLASS EXPRESSION) LAYER FILTER 或 CLASS EXPRESSION.
正则表达式通常由具有特殊含义的字符和解释为它们的字符组成。字母数字字符(a-z、a-z和0-9)按原样处理。具有特殊含义的字符包括:
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 年, MM 月 DD -日期, 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。