Skip To Content

字段计算器处理器

汇总

字段计算器处理器可用来计算值。该处理器可评估一个表达式以生成所需的值。表达式可包括文本字符串和数值常量,以及从正在处理的 GeoEvent 的命名字段中获取的事件数据。可将计算所得值写入现有字段,同时覆盖该字段中的现有数据,或者将该值写入由处理器创建的新字段中。

示例

  • 字段计算器处理器可用于在日期/时间值中加上或减去时间,以使时间戳与本地时区对齐。可以通过在表示为新纪元毫秒(长整数)的事件记录时间戳中加上或减去以毫秒为单位的新纪元值(同样为长整数)来完成上述操作。然后,可以在新日期类型字段中填充经过修改的新纪元时间戳值。
  • 处理器可以转换许多单位,例如距离、速度、时间、温度、高度、重量等。
  • 该处理器适用于外业工作人员的实时数据校正。字符串函数(例如 replace()toLowerCase()toUpperCase()concat())可用于确保外业数据能够实时满足特定条件或规范。例如,concat() 可用于从采集的数据中移除空格。同样,toLowerCase() 可用于对所有采集的数据强制使用小写字母。然后,可以将这些字符串函数的输出实时写回要素服务层。
  • 处理器可用于从 Survey123 for ArcGIS 要素图层的注释字段(字符串)中递归搜索关键字或短语。通过使用字符串函数 contains(),可以对用户提交的评论进行审核,以了解路况内容,例如坑洼、碎石、水浸、开裂或阻塞。如果存在上述类型的内容,则字段计算将返回布尔型 true 值。然后,可以对真实事件记录进行过滤和实时处理,以立即通知公共事业部门或其他一些机构进行响应。

用法说明

  • 字段计算器处理器是一款通用处理器。给定一段用英尺表示的距离后,可使用 Distance * 0.3048 等相对常量表达式计算以米为单位的等效距离。该处理器还支持多种 Java 字符串函数,例如,表达式 replaceAll(Description, 'foo', 'bar') 可用于在每个事件记录的描述字段中用子字符串 bar 来代替子字符串 foo。处理器还支持多个数学函数。例如,可以使用 max(Time1, Time2) 识别两个 GeoEvent 字段中哪一字段包含更大值,或者使用 random() 生成随机数。
  • 可以使用目标字段参数将处理器配置为在现有字段或新字段中存储输出计算: 通过添加新字段来更改事件记录的方案将需要 GeoEvent Server 创建一个新的 GeoEvent 定义。新的 GeoEvent 定义将由 GeoEvent Server 管理,并且如果处理器或者使用该处理器的 GeoEvent 服务发生改变,则该定义将被删除。
  • 指定要写入计算值的现有字段时,无需首先指定 GeoEvent 定义。从定义菜单中选择 GeoEvent 定义仅用于缩小要从字段菜单中选择的可用字段列表的范围。

字段计算器处理器支持的运算符和函数如下所示。

字段计算器支持的运算符和函数

操作运算符示例

+
Odom1 + Odom2

表达式会将字段 Odom1Odom2 中的数值相加,以获得简单总和。同时,支持字符串串联(例如,'Hello' + 'World')。

-
VALUEA - VALUEB

表达式会将标记为 VALUEAVALUEB 的字段中的数值相减,以获得简单差值。

与支持字符串串联的加法不同,您不能使用减法计算两个字符串间的差值。

*
Altitude * 0.3048

表达式会将名为 Altitude 字段中的数值和常数 0.3048 相乘,以获得简单乘积(此案例是将以英尺计的值转换为以米计的等效值)。

/
Distance / 1.609344

表达式会用名为 Distance 的字段中的数值除以常数 1.609344,以获得简单的商(将以千米计的值转换为以英里计的等效值)。

%
VALUEA % VALUEB

表达式用标记为 VALUEA 的字段中的数值除以标记为 VALUEB 的字段中的数值,并以双精度值形式返回余数。

逻辑与 (AND)

&&
Flag1 && Flag2

表达式对名为 Flag1Flag2 的字段中的布尔值执行逻辑与 (AND) 运算,以获得布尔型结果。输入字段必须为布尔型。表达式中的文本字符串(如 TRUE)和常量值(如 1)不会转换为属于评估一部分的等效布尔值。

逻辑或 (OR)

||
Flag1 || Flag2

表达式对名为 Flag1Flag2 的字段中的布尔值执行逻辑或 (OR) 运算,以获得布尔型结果。

逻辑非 (NOT)

!
!(Flag1)

表达式对字段 Flag1 中的布尔值执行逻辑非运算,以获得布尔型结果。支持嵌套表达式,如 !(Flag1 && Flag2)

大于

>
Altitude > 12500

表达式会执行逻辑评估,以确定字段 Altitude 中的值是否大于指定的常数(结果为布尔值)。

大于等于

>=
Altitude >= 12500

表达式会执行逻辑评估,以确定字段 Altitude 中的值是否大于或等于指定的常数(结果为布尔值)。

小于

<
Altitude < 1500

表达式会执行逻辑评估,以确定字段 Altitude 中的值是否小于指定的常数(结果为布尔值)。

小于等于

<=
Altitude <= 1500

表达式会执行逻辑评估,以确定字段 Altitude 中的值是否小于或等于指定的常数(结果为布尔值)。

等于

==
VALUEA == VALUEB

表达式会执行逻辑评估,以确定标记为 VALUEAVALUEB 的字段中的值是否相等(结果为布尔值)。只有初始产品版本 (10.2.0) 中的数字类型支持相等运算。

不等于

!=
VALUEA != VALUEB

表达式会执行逻辑评估,以确定标记为 VALUEAVALUEB 的字段中的值是否不相等(结果为布尔值)。只有初始产品版本 (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()

返回输入连接器创建事件时的时间戳

currentOffsetUTC()

返回本地服务器的当前日期/时间与 UTC 之间的差异

字段计算器处理器的常用函数

函数描述

abs(value)

返回参数的绝对值

ceil(double)

返回指定双精度值的上限(接近的最大整数)

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 的双精度值

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

示例:trim (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)

将以度为单位的角转换为以弧度为单位的近似角

参数

参数描述

名称

用于在 GeoEvent Manager 中引用的处理器的描述性名称。

处理器

所选处理器的名称。

表达式

处理器要针对每个传入事件记录进行评估的表达式。表达式可以为数学表达式或词汇表达式。此参数的可能输入包括:

  • 字符串 - 可以使用单引号来标识文本字符串。
    • ‘Hello’
    • ‘World’
  • 整型 - 可以使用整数来标识数值。
    • 123.456
    • 100
  • 字段 - 可以使用传入 GeoEvent 定义中的字段名称来标识字段及其相应的值。调用字段用于字段计算时,请考虑其数据类型。
    • Speed
    • Altitude
  • 标签 - 可以使用 GeoEvent Server 标签来标识字段。调用已标记字段用于字段计算时,请考虑其数据类型。
    • TRACK_ID
    • GEOMETRY
  • 运算符 - 可以使用运算符来执行逻辑评估。
    • +
    • >=
  • 函数 - 可以使用函数来返回、标识或更改值。有些函数为字符串保留,而其他函数则为整数保留。使用处理器时,请考虑由函数调用的字段的数据类型。
    • currentTime()
    • replace()

有关可用作处理器表达式一部分的受支持运算符和函数的完整列表,请参阅以上受支持的运算符和函数

注:

下面是一个简单的表达式示例:Altitude + 100。将写入表达式以评估名为 Altitude 的字段的值,然后将其加上 100。如果事件记录中的 Altitude 字段具有存储值 12500,则表达式将得出新值 12600 (12500 + 100 = 12600)。可以将其存储在字符串或整型字段中。

如果将类似表达式指定为 ‘Altitude’ + 100,则将写入该表达式以获取文本字符串 Altitude,然后将其加上 100。由于支持字符串串联,因此如果用于存储表达式结果的新字段为字符串,则输出将为 Altitude100。但是,如果用于存储表达式输出的新字段为整型数据类型,则该表达式在逻辑上无效,并且将不会得出值。

如果表达式使用字符串函数,例如 length(Altitude),则将写入该表达式以计算 Altitude 字段中字符串的总字符数。如果将高度表示为整型数据类型(例如 12500),则上述表达式在逻辑上无效,并且不会得出值。原因为:length() 是一个应在括号中包含字符串值的字符串表达式,而非整数。但是,如果将高度表示为字符串,则以上表达式将返回值 5,因为字符串 12500 包含 5 个字符)。

目标字段

用于指定由处理器计算的值的目标字段。目标字段是将写入表达式结果的位置。默认为现有字段

  • 现有字段 - 目标字段为现有字段。由处理器计算的值将存储在事件记录的现有字段中。
  • 新字段 - 目标字段为新字段。由处理器计算的值将存储在新字段中。通过添加新字段来更改事件记录的方案将需要新的 GeoEvent 定义。

新字段名称

(条件分析)

将写入由处理器计算的值的新字段名称。

此属性在目标字段设置为新字段时显示,设置为现有字段时隐藏。

新字段类型

(条件分析)

用于指定由处理器创建的新字段的数据类型。默认为布尔型。可用数据类型包括:

  • 布尔型
  • 日期型
  • 双精度型
  • 浮点型
  • 几何
  • 整型
  • 长整型
  • 短整型
  • 字符串

此属性在目标字段设置为新字段时显示,设置为现有字段时隐藏。

新字段标签

(条件分析)

将应用于新字段的现有字段标签的名称。此参数没有默认值。

注:

标签必须已存在,才能为新字段添加标签。处理器将不会动态创建标签。有关管理和创建标签的详细信息,请参阅管理标签

此属性在目标字段设置为新字段时显示,设置为现有字段时隐藏。

新建 GeoEvent 定义名称

(条件分析)

分配给新 GeoEvent 定义的名称。新 GeoEvent 定义将组合入站事件记录的方案和用于存储计算值的新字段。

此属性在目标字段设置为新字段时显示,设置为现有字段时隐藏。

现有字段名称

将写入由处理器计算的值的现有字段名称。此参数没有默认值。

注:

可以使用定义菜单来标识入站事件记录的 GeoEvent 定义。选择 GeoEvent 定义将缩小可用字段的范围以供选择。可以使用字段菜单来标识将写入由处理器计算的值的现有字段的特定名称。

注意事项和限制

  • 以下是使用字段计算器处理器时的一些注意事项:
    • 表达式可以是数学性的或词汇性的(基于字符串,而非数值)。
    • 使用文本字符串时,确保使用单引号将这些字符串引起来:'Cat' + ' ' + 'Dog'
    • 如果类型转换失败或无法评估表达式,则处理器将输出空值。
    • 表达式中的操作数可以是 GeoEvent 定义中的文字字段名称或者是应用到字段中的标签。例如,表达式 Odom1 + Odom2 可用于将 Odom1Odom2 字段中的值相加,以获得简单总和。如果 Odom1 字段标记为 MILEAGEAOdom2 字段标记为 MILEAGEB,则可以使用表达式 MILEAGEA + MILEAGEB
    • 可以很好地处理表达式中不同类型的数据。例如,325 + 0.125 将转换为等效的 325.0 + 0.125。如果指定输出字段预计为一个长整型值,则计算出的双精度值将被截断。
    • 创建表达式时应小心溢出。例如,表达式 60 * 60 * 80 * 10000 中的每一项均为短整型,但结果超出常规整型的 32 位范围。如果以诸如 60.0 * 60.0 * 80.0 * 10000.0 等双精度值表示每一项,则将避免上述问题。
    • 将计算值写入新字段会更改事件记录的方案,这需要 GeoEvent Server 创建新的 GeoEvent 定义。在使用处理器创建新字段时,必须指定字段名称和数据类型。可以为 GeoEvent 定义指定名称以及可选标签,如果指定了名称,则应将此名称应用于所得 GeoEvent 定义中的新字段。
  • 如果包含处理或过滤作为任何 GeoEvent 服务的一部分,则事件记录的总吞吐量由于计算开销将下降。在设计实现字段计算器处理器或与此相关的任何其他处理器的 GeoEvent 服务时,请考虑上述情况。要提高 GeoEvent 服务或整个 GeoEvent Server 站点的性能,在可能的情况下,请考虑事先对实时数据进行预处理或过滤。
  • 在字段计算器处理器中构造表达式时,请考虑字段或已标记字段的数据类型。由于字段的数据类型,有时表达式在逻辑上无效,并且将不会返回值。而其他时候,表达式在逻辑上有效,但由于涉及的数据类型,可能会产生意外结果。例如,对于两个表示为字符串的数值,尝试计算其数学和以存储在双精度数据类型的新字段中将无效。但是,如果接收该值的新字段为字符串,则相同表达式将有效,但是可能不会得到期望的结果值。每个数值将串联在一起,而非在数学上相加在一起。