字段计算器处理器可用来计算值。该处理器可评估一个表达式以生成所需的值。表达式可包括文本字符串和数值常量,以及从正在处理的 GeoEvent 的命名字段中获取的事件数据。可将计算所得值写入现有字段,同时覆盖该字段中的现有数据,或者将该值写入由处理器创建的新字段中。
字段计算器处理器是一款通用处理器。给定一段用英尺表示的距离后,可使用 Distance * 0.3048 等相对常量表达式计算以米为单位的等效距离。该处理器还支持多种 Java 字符串函数,例如,表达式 replaceAll(Description, 'foo', 'bar') 可用于在每个 GeoEvent 的描述字段中用子字符串“bar”来代替子字符串“foo”。处理器还支持许多数学函数。例如,可以使用 max(Time1, Time2) 识别两个 GeoEvent 字段中哪一字段包含更大值,或者使用 random() 生成随机数。
使用字段计算器处理器时应考虑以下内容:
- 表达式可以是数学性的或词汇性的(基于字符串,而非数值)。
- 使用文本字符串时,确保使用单引号将这些字符串引起来:'Cat' + ' ' + 'Dog'。
- 如果类型转换失败或无法评估表达式,则处理器将输出空值。
- 表达式中的操作数可以是 GeoEvent 定义中的文字字段名称或者是应用到字段中的标签。例如,表达式 Odom1 + Odom2 可用于将 Odom1 和 Odom2 字段中的值相加,以获得简单总和。如果 Odom1 字段标记为 MILEAGEA 且 Odom2 字段标记为 MILEAGEB,则可以使用表达式 MILEAGEA + MILEAGEB。
- 可以很好地处理表达式中不同类型的数据。例如,325 + 0.125 将转换为等效的 325.0 + 0.125。如果指定输出字段预计为一个长整型值,则计算出的双精度值将被截断。
- 创建表达式时应小心溢出。例如,表达式 60 * 60 * 80 * 10000 中的每一项均为短整型,但结果超出常规整型的 32 位范围。如果以诸如 60.0 * 60.0 * 80.0 * 10000.0 等双精度值表示每一项,则将避免上述问题。
- 将计算值写入新字段会更改 GeoEvent 的方案,这需要 GeoEvent Server 创建新的 GeoEvent 定义。在使用该处理器创建新字段时,必须指定字段名称和数据类型。可以为 GeoEvent 定义指定名称以及可选标签,如果指定了名称,则应将此名称应用于所得 GeoEvent 定义中的新字段。
字段计算器处理器支持的运算符和函数如下所示。
字段计算器支持的运算符和函数
操作 | 运算符 | 示例 |
---|---|---|
加 |
|
表达式会将字段 Odom1 和 Odom2 中的数值相加,以获得简单总和。同时,支持字符串串联(例如,'Hello' + 'World')。 |
减 |
|
表达式会将标记为 VALUEA 和 VALUEB 的字段中的数值相减,以获得简单差值。 与支持字符串串联的加法不同,您不能使用减法计算两个字符串间的差值。 |
乘 |
|
表达式会将名为 Altitude 字段中的数值和常数 0.3048 相乘,以获得简单乘积(此案例是将以英尺计的值转换为以米计的等效值)。 |
分支 |
|
表达式会用名为 Distance 的字段中的数值除以常数 1.609344,以获得简单的商(将以千米计的值转换为以英里计的等效值)。 |
模 |
|
表达式用标记为 VALUEA 的字段中的数值除以标记为 VALUEB 的字段中的数值,并以双精度值形式返回余数。 |
逻辑与 (AND) |
|
表达式对名为 Flag1 和 Flag2 的字段中的布尔值执行逻辑与 (AND) 运算,以获得布尔型结果。输入字段必须为布尔型。表达式中的文本字符串(如 TRUE)和常量值(如 1)不会转换为属于评估一部分的等效布尔值。 |
逻辑或 (OR) |
|
表达式对名为 Flag1 和 Flag2 的字段中的布尔值执行逻辑或 (OR) 运算,以获得布尔型结果。 |
逻辑非 (NOT) |
|
表达式对字段 Flag1 中的布尔值执行逻辑非运算,以获得布尔型结果。支持嵌套表达式,如 !(Flag1 && Flag2)。 |
大于 |
|
表达式会执行逻辑评估,以确定字段 Altitude 中的值是否大于指定的常数(结果为布尔值)。 |
大于等于 |
|
表达式会执行逻辑评估,以确定字段 Altitude 中的值是否大于或等于指定的常数(结果为布尔值)。 |
小于 |
|
表达式会执行逻辑评估,以确定字段 Altitude 中的值是否小于指定的常数(结果为布尔值)。 |
小于等于 |
|
表达式会执行逻辑评估,以确定字段 Altitude 中的值是否小于或等于指定的常数(结果为布尔值)。 |
等于 |
|
表达式会执行逻辑评估,以确定标记为 VALUEA 和 VALUEB 的字段中的值是否相等(结果为布尔值)。只有初始产品版本 (10.2.0) 中的数字类型支持相等运算。 |
不等于 |
|
表达式会执行逻辑评估,以确定标记为 VALUEA 和 VALUEB 的字段中的值是否不相等(结果为布尔值)。只有初始产品版本 (10.2.0) 中的数字类型支持不等于运算。 |
注:
显示混合类型时,字段计算器处理器会试图自动转换值。例如,表达式 10.0 + 5 会自动转换为将总和处理为两个浮点值相加的结果。将数值和字符串值混合(例如 codeValue + 'SomeString',其中 codeValue 是数值)会生成未指定的结果。正确的方法为使用字符串函数(例如下述的 codeValue)将 valueOf(object) 明确转换为字符串。注:
字段计算器处理器等于和不等于运算符不应该直接应用于浮点值。为正确比较两个十进制值是否相等,必须首先对数值进行进位运算,将数值取整为长整数,然后比较这些长整数值。
- 不比较 MyFloat1 == MyFloat2。
- 而比较 round(MyFloat1*1000) == round(MyFloat2*1000)。
字段计算器处理器包括可对 java.lang.Math 中所得结果进行镜像处理的函数。有关完整的技术规范和函数列表,请参考 Java 开发者文档。最常用函数的汇总如下。
字段计算器中的常数
函数 | 说明 |
---|---|
E() | 返回以欧拉数 (e) 为底并以指定双精度值为指数的幂 |
PI() | 返回以双精度表示的 pi(圆的周长与直径之比) |
字段计算器的时间函数
函数 | 说明 |
---|---|
currentTime() | 以毫秒为单位返回本地服务器的当前系统时间作为某一点的时长 |
receivedTime() | 返回输入连接器创建事件时的时间戳 |
字段计算器的常用函数
函数 | 说明 |
---|---|
abs(value) | 返回参数的绝对值 |
ceil(double) | 返回指定双精度值的上限(接近的最大整数) |
currentTime() | 以长整型返回系统的当前日期/时间(以新纪元毫秒为单位) |
floor(double) | 返回指定双精度值的下限(接近的最小整数) |
hypot(double x, double y) | 返回不含中间溢出或下溢的 sqrt((x*x) + (y*y)) |
max(value a, value b) | 返回 2 个指定参数值中较大的值 |
min(value a, value b) | 返回 2 个指定参数值中较小的值 |
random() | 返回大于等于 0.0 并小于 1.0 的双精度值 |
receivedTime() | 以长整型检索由输入连接器收到的事件记录的日期/时间(以新纪元毫秒为单位) |
round(value) | 返回最接近参数的长整数(假设参数为双精度值) |
注:
字段计算器处理器会在可能的情况下处理数值类型转换。例如,当为函数(例如 max(3.14159,25))提供的数值类型不同时,为执行比较,会将这些值转换为可比类型(整型、浮点型或双精度型)。将计算值写入事件的属性字段时,处理器会对这些值进行转换(例如,在事件字段的类型为双精度时,6 + 7 将作为 13.0 写入)。
字段计算器的指数
函数 | 说明 |
---|---|
sqrt(double) | 返回指定双精度值的平方根 |
cbrt(value) | 返回指定双精度值的立方根 |
exp(double) | 返回以欧拉数 (e) 为底并以指定双精度值为指数的幂 |
pow(double, double) | 返回以第一个参数为底并以第二个参数为指数的幂 |
字段计算器的对数
函数 | 说明 |
---|---|
log(double) | 返回双精度值的自然对数(以 e 为底) |
log10(double) | 返回双精度值的以 10 为底的对数 |
字段计算器的字符串函数
函数 | 说明 |
---|---|
对于参考,下面的语法示例使用以下示例输入数据: | |
length(string) 返回:integer 示例:'TrackID length: ' + length(TrackID) | 返回字符串的长度。 结果:"TrackID length: 7" |
isEmpty(string) 返回:boolean 示例:isEmpty(EmptyStr) | 如果源的长度为 0,则返回 true。 结果:true |
isNull(string) 返回:boolean 示例:isNull(NullValue) | 如果源值为空,则返回 true。 结果:true |
equals(string, string) 返回:boolean 示例:equals(TrackID, EmptyStr) | 如果给定的字符串属性值相等,则返回 true。如果字符串不相等,则返回 false;如果提供值而非字符串作为输入,则返回空值。 结果:false |
equalsIgnoreCase(string, string) 返回:boolean 示例:equalsIgnoreCase(TrackID, toString(TrackNum)) | 不考虑大小写的情况下,将源字符串与另一字符串进行比较。不考虑大小写的情况下,如果给定的字符串属性值相等,则返回 true。如果字符串不相等,则返回 false;如果提供值而非字符串作为输入,则返回空值。 结果:false 说明: "AA-1234" 不等于 "1234" |
compareTo(string, string) 返回:integer 示例:compareTo('ABCXD', 'ABCZD') | 按字母顺序将两个字符串进行比较。如果两个字符串相等,则返回值 0;如果按字母顺序第一个字符串小于第二个字符串,则返回负值;如果按字母顺序第一个字符串大于第二个字符串,则返回正值。 结果:-2 说明: int('X') - int('Z') 将返回 -2,因为 'X' 在字母表中比 'Z' 小两个位置。 |
compareToIgnoreCase(string, string) 返回:integer 示例:compareToIgnoreCase('abcde', 'ABCDE') | 按字母顺序对两个字符串进行比较,不区分大小写。 结果:0 |
startsWith(string, value) 返回:boolean 示例:startsWith('Programming', 'Program') | 如果字符串以指定前缀开头,则返回 true;否则返回 false。第二个参数 value 可以是字符串或者可以隐式转换为字符串的整数值。 结果:true |
endsWith(string, value) 返回:boolean 示例:endsWith(TrackID, TrackNum) | 如果字符串以指定后缀结尾,则返回 true;否则返回 false。第二个参数 value 可以是字符串或者可以隐式转换为字符串的整数值。 结果:true 说明:"AA-1234" 以 "1234" 结尾 |
indexOf(string, string, startIndex) 返回:integer 示例:indexOf('ABCDABCBCA','BC',3) | 从指定索引开始,返回在搜索字符串内找到指定子字符串的第一个索引。对于从字符串开头开始搜索的索引,请指定搜索从索引 0 开始。 结果:5 说明:从位置 3 处的字符开始,在位置 5 处第一次出现子字符串 "BC"。 |
lastIndexOf(string, string, startIndex) 返回:integer 示例:lastIndexOf(TrackID,'-',length(TrackID)) | 从指定索引向后搜索,返回在搜索字符串内找到指定子字符串的最后一个索引。对于从字符串结尾开始搜索的索引,请指定搜索从 length(source) 开始。 结果:2 说明:从字符串结尾开始向后搜索,在位置 2 处找到子字符串 '-'。 |
substring(string, intIndexBegin, intIndexEnd) 返回:string 示例:substring('ABCDABCXYZABCDABC',7,10) | 将从源字符串中提取的子字符串作为新字符串返回。该子字符串在指定的 intIndexBegin 处开始,并扩展到索引 (intIndexEnd - 1) 处的字符。第三个参数可以表示为嵌套函数 length(source) 或者 -1(指字符串结尾)。 结果:"XYZ" 说明:从字符索引 7 ('X') 处开始,返回位置 7、8 和 9 处的三个字符。 |
concat(string, string) 返回:string 示例:concat('Hello', 'World') | 将指定的字符串连接在源字符串的末尾。 结果:"HelloWorld" |
matches(string, regex) 返回:boolean 示例:matches(TrackID, '[A-Z]+[-][0-9]+') | 如果指定的正则表达式模式与指定的字符串相匹配,则返回 true;否则,返回 false。指定正则表达式模式 regex 作为第二个字符串。 结果:true 说明:整个 TrackID 与模式“一个或多个字母,后跟一个破折号,后跟一个或多个数字”相匹配。 |
contains(string, substring) 返回:boolean 示例:contains(TrackID,'-') | 如果源字符串包含指定子字符串,则返回 true。 结果:true 说明:TrackID 字符串值内某处包含文本 "-"。 |
replaceFirst(string, regex, replacement) 返回:string 示例:replaceFirst(TrackID,'[0-9]+','nnnnn') | 用指定的替换字符串替换与指定正则表达式模式相匹配的第一个子字符串,并将结果作为新字符串返回。 结果:"AA-nnnnn" 说明:使用文本字符串 "nnnnn" 替换与模式“一个或多个数字”相匹配的第一个子字符串。 |
replaceAll(string, regex, replacement) 返回:string 示例:replaceAll('ABABCABABABD','AB','X') | 用给定的替代替换与给定的正则表达式相匹配的源字符串的每个子字符串。将结果字符串作为新字符串返回。 结果:"XXCXXXD" 说明:每次出现正则表达式模式 "AB" 时,使用文本字符串 "X" 进行替换。 |
replace(source, target, replacement) 返回:string 示例:replace('2017-12-31','-','/') | 每次出现的子字符串(指定为文本字符串)将替换为指定的替换子字符串(也指定为文本字符串)。将结果字符串作为新字符串返回。 结果:" 2017/12/31" |
toLowerCase(string) 返回:string 示例:TrackID + ' to lower: ' + toLowerCase(TrackID) | 使用默认区域规则将源字符串中的所有字符转换成小写形式。将该字符串转换为小写形式后,将其作为新字符串返回。 结果:"AA-1234 to lower: aa-1234" |
toUpperCase(string) 返回:string 示例:TrackID + ' to upper: ' + toUpperCase(TrackID) | 使用默认区域规则将源字符串中的所有字符转换成大写形式。返回该字符串,将其转换为大写形式。 结果:"AA-1234 to upper: AA-1234" 说明:在本示例中,TrackID 的字母部分已经为大写形式。 |
trim(string) 返回:string 示例: | 返回源字符串的副本,忽略前导或尾随空白区。 结果:"GeoEvent Server" |
toString(fieldName) 返回:string 示例:toString(Geometry) 示例:toString(Epoch) | 返回指定事件属性字段中的值的字符串表示。这些函数旨在允许将日期和几何属性的字符串表示嵌套在其他函数(例如子字符串)内,以便实时分析能够从较高阶数据类型中提取信息。 结果:"{""x"":32.125,""y"":-117.125,""spatialReference"":{""wkid"":4326}}" 结果:"Fri Nov 03 17:07:56 PDT 2017" |
valueOf(fieldName) 返回:string 示例:valueOf(Geometry) 示例:valueOf(Epoch) | 返回指定事件属性字段中的值的字符串表示。toString( ) 和 valueOf( ) 函数可包装相同的实现。 |
字段计算器的三角函数
函数 | 说明 |
---|---|
acos(double) | 返回值的反余弦值(返回角度范围为从 0.0 到 pi) |
asin(double) | 返回值的反正弦值(返回角度范围为从 -pi/2 到 pi/2) |
atan(double) | 返回值的反正切值(返回角度范围为从 -pi/2 到 pi/2) |
atan2(double y, double x) | 返回由直角坐标 (x, y) 转换为极坐标 (r, theta) 而得到的角 theta |
cos(double) | 返回角的三角余弦值 |
cosh(double) | 返回双精度值的双曲余弦值 |
sin(double) | 返回角的三角正弦值 |
sinh(double) | 返回双精度值的双曲正弦值 |
tan(double) | 返回角的三角正切值 |
tanh(double) | 返回双精度值的双曲正切值 |
toDegrees(double) | 将以弧度为单位的角转换为以度为单位的近似角 |
toRadians(double) | 将以度为单位的角转换为以弧度为单位的近似角 |