计算字段工具使用 Arcade 表达式确定字段值。您可以执行应用于所有记录的简单计算和高级计算。该计算会应用于每个要素。以下各部分包括使用已计算表达式的若干示例。当分析在 ArcGIS GeoAnalytics Server 上运行时,会执行计算且总是创建新的图层。
在 ArcGIS Enterprise 10.6 及更高版本中,表达式使用 Arcade 进行格式化。在使用 Arcade 的情况下,字段名称的格式为 $feature["field name"] 或 $feature.fieldname。如果字段名称包含一个空格,则需要第一个选项 $feature["field name"]。以下所有示例都使用此选项。
GeoAnalytics Server 中的以下工具使用 Arcade 表达式:
数学运算和函数示例
表达式能够利用数学方式处理数字。下表显示了可用运算示例。
运算符 | 说明 | 示例 |
---|---|---|
a + b | 返回 a 加 b 的和。 | fieldname 包含数值 1.5 $feature["fieldname"] + 2.5 4.0 |
a - b | 返回 a 减 b 的差。 | fieldname 包含数值 3.3 $feature["fieldname"]- 2.2 1.1 |
a * b | 返回 a 乘以 b 的积。 | fieldname 包含数值 2.0 $feature["fieldname"] * 2.2 4.4 |
a / b | 返回 a 除以 b 的商。 | fieldname 包含数值 4.0 $feature["fieldname"] / 1.25 3.2 |
abs( a ) | 返回 a 的绝对(正)值。 | fieldname 包含数值 -1.5 abs($feature["fieldname"]) 1.5 |
log ( a ) | 返回 a 的自然对数(以 E 为底)。 | fieldname 包含数值 1 log($feature["fieldname"]) 0 |
sin ( a ) | 返回 a 的三角正弦值。 假设输入为以弧度为单位的角。 | fieldname 包含数值 1.5707 sin($feature["fieldname"]) 1 |
cos( a ) | 返回 a 的三角余弦值。 假设输入为以弧度为单位的角。 | fieldname 包含数值 0 cos($feature["fieldname"]) 1 |
tan( a ) | 返回 a 的正切值。 假设输入为以弧度为单位的角。 | fieldname 包含数值 0 tan($feature["fieldname"]) 0 |
sqrt( a ) | 返回 a 的平方根。 | fieldname 包含数值 9 sqrt($feature["fieldname"]) 3 |
min( a, b ) | 返回 a 和 b 间的最小数值。 | fieldname 包含数值 1.5 和 -3 min($feature["fieldname"], -3) -3 |
max( a, b ) | 返回 a 和 b 间的最大数值。 | fieldname1 包含数值 1.5,fieldname2 包含数值 -3 max($feature["fieldname1"], $feature["fieldname2"]) 1.5 |
constrain(<value>,<low>,<high>) | 如果结果在限制范围内,则返回输入值。如果该值小于低值,则返回低值。如果该值大于高值,则返回高值。 | 示例 1:constrain( $feature["distance"], 0, 10) 如果 distance 小于 0,则返回 0,如果 distance 大于 10,则返回 10,其余情况下返回 distance。 示例 2:constrain($feature['Store dist'], 6, distance) 如果 Store dist 小于 6,则返回 6,如果 distance 大于 Store dist,则返回 distance,其余情况下返回 Store dist。 |
文本函数示例
计算字段表达式能够处理文本。下表显示了可用运算示例。了解有关 Arcade 中可用文本函数的详细信息。
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
concatenate( <values>, <separator>) | 将值连接在一起,然后返回字符串。
| fieldname 包含数值 GeoAnalytics Concatenate ([$features["fieldname"], "is", "great!"], ' ') | GeoAnalytics is great! |
find(<searchText>, <text>, <startPos>) | 查找字符串中的字符串。不支持通配符。
| fieldname1 包含数值 14NorthStreet,fieldname2 包含数值 North find($feature["fieldname2"], $feature["fieldname1"]) | 2 |
lower(<value>) | 使字符串均为小写字母。
| fieldname 包含数值 GEOANALYTICS lower($feature["fieldname"]) | geoanalytics |
使用 find 和 lower 的文本示例。
find(("north"), lower("146NorthStreet"))
日期函数示例
计算字段表达式能够处理日期。下表显示了可用运算示例。在 Arcade 中,月份值范围从 0(1 月)到 11(12 月)、日期从 1 号到 31 号、小时从 0(上午 12:00)到 23(下午 11:00)、分和秒从 0 到 59,毫秒从 0 到 999。Arcade 日期返回您的 GeoAnalytics Server 所在位置处的时间值。
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
date( <value>, <month>, <day>, <hour>, <minute>) | 将值或值集解析成日期字符串。
| fieldname 包含数值 1476987783555 示例 1:Date($features["fieldname"]) 示例 2:Date(2017,0,14,0) 示例 3:Date() | 示例 1:20 Oct 2016 11:23:03 am 示例 2:14 Jan 2017 12:00:00 am 示例 3:返回当前时间 |
DateDiff(<date1>, <date2>, <units>) | 将两个日期相减,并以指定的单位返回差值。
| 示例 1:DateDiff(Date(2017,1,14,0), Date()) 示例 2:DateDiff(Date(2017,1,14,0), Date(), "Years") | 产生的结果会随运行此命令的时间而变化。 示例 1:-20532129137 示例 2:-0.6546783768647119 |
Year(<dateValue>) | 返回给定日期中的年份。
| 示例 1:fieldname 是一个类型为 Date、值为 09 Oct 2017 04:30:43 pm 的字段 Year($feature["fieldname"]) 示例 2:fieldname 是一个值为 2012-09-27 的 ISO 8601 字符串格式的字符串字段 | 示例 1:2017 示例 2:2012 |
逻辑函数示例
除简单的数学表达式外,还可将更多高等函数应用于缓冲区表达式。
功能 | 说明 | 示例 | 结果 |
---|---|---|---|
iif(<condition>,<true value>,<false value>) | 如果条件评估为 true,则返回一个值,如果条件评估为 false,则返回另外一个值。 <true value> 和 <false value> 可为以下内容:
| iif($feature["field1"] > $feature["field2"], $feature["field1"], 0) iif($feature["field1"] > $feature["field2"], iif($feature["field2"] = 0, $feature["field3"], $feature["field4"]), 0) | 如果 field1 大于 field1,则返回 field2,其余情况下返回 0。 如果 iif 大于 field1,则返回第二个 field2 函数的结果,其余情况下返回 0。 |
when(<expression1> , <result1> , <expression2> , <result2> , ... , <expressionN> , <resultN>, <default>) | 按顺序评估一系列表达式,直至一个表达式评估为 true。
| when(($feature["field1"] + 10) > 1, 1,($feature["field2"] + 10) > 2 , 2, $feature["field3"]) | 如果 field1 + 10 大于 1,则返回 1。否则,检查 field2 + 10 是否大于 2。如果是,则返回 2。否则,返回 field3。 |
decode(<conditional val> , <case1> , <result1>, <case2>, <result2>, ... <caseN>, <resultN>, <defaultValue> ) | 将对表达式进行评估,并将其值与后续参数进行比较。如果表达式匹配,则返回下一个参数值。如果均不匹配,则可以选择将最后一个参数作为默认返回值。
| decode($feature["field1"] + 3 , $feature["field1"], 1, $feature["field2"], 2, 0) | 比较条件 val field1 + 3 和 case1 field1 是否相等。如果 true,则返回 1。如果 false,则比较 field1 + 3 和 field2 是否相等。如果 true,则返回 2;否则,返回 0。 |
条件运算符
条件语句可使用以下运算符:
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
a > b a < b | a 大于 b a 小于 b | 10 > 2 | False |
a >= b a <= b | a 大于或等于 b a 小于或等于 b | abs(-10) >= 10 | True |
a != b | a 不等于 b | abs(-3) != -3 | True |
a == b | a 等于 b | abs(-5) == 5 | True |
<condition1> || <condition2> | 满足条件 1 或条件 2。 | (abs(-5) == 5) || (10 < 2) | True |
<condition1> && <condition2> | 满足条件 1 和条件 2。 | (abs(-5) == 5) && (10 < 2) | False |
跟踪感知型示例
此外,一些 GeoAnalytics 工具(例如检测事件和计算字段)也可以使用 Arcade 形式的跟踪感知型方程。在计算字段中,如果输入图层已启用时间、表达式为追踪感知型并使用一个或多个字段来标识轨迹,可以使用轨迹方程。
在 ArcGIS Enterprise 10.6 中使用以下追踪表达式。
功能 | 说明 | 示例 | 结果 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$track.field["fieldname"].history(<value1>) | 在指定字段中返回指定时间索引的值数组。
| MyField 具有按顺序排列的值 [10, 20, 30, 40, 50, 60, 70, 80]。值 10 位于索引 0 处,值 80 位于索引 7 处。将在每个索引处对表达式进行评估,示例概述了用于示例的索引。n 表示序列中的要素数,k 表示要评估的索引。 示例 1:$track.field["MyField"].history(3)) 示例 2:$track.field["MyField"].history(-3) 示例 3:mean($track.field["MyField"].history(-2)) 示例 4:$track.field["MyField"].history(-3)[0] | 在索引 k 处评估示例 1 时,将返回索引 3 到 k 处的值数组。如果在索引 6 (70) 处进行评估,将返回索引 [3,4,5,6] 处的值数组,以使数组为 [40, 50, 60, 70]。 示例 2 会返回按照索引 k 减去给定值减 1 (k-2) 计算的值数组。如果在索引 6 (value = 70) 处评估此值,k-2、k-1 和 k 的值将返回为 [50, 60, 70]。 示例 3 返回位于索引 k-1 处和 k 处的值的平均值。如果在索引 4 (value = 50) 处评估此值,您将发现 value 40(索引 3)和 value 50(索引 4)的平均值等于 45。如果您在索引 7 处评估此值,结果将为 70 和 80 的平均值 75。 示例 4 返回在示例 2 中创建的数组的首个项目(索引 0):50。 | ||||||||||||
$track.field["fieldname"].history(<value1>, <value2>) | 返回起自 index1 (<value1>) 终至 index2 (<value2>) 的值数组。 | MyField 已对 [10, 20, 30, 40, 50, 60, 70, 80] 的值按顺序排列。10 位于索引 0 处,80 位于索引 7 处。本例的表达式求值结果位于索引 7 (80) 处。 示例 1:$track.field["MyField"].history(-3, -2)) 示例 2:$track.field["MyField"].history(-5, -2)) | 示例 1:[60] 示例 2:[40, 50, 60] | ||||||||||||
$track.time.start | 计算轨迹的起始时间,以从新纪元开始的微秒为单位。 | 使用 2017 年 1 月 2 日起始的轨迹。 $track.time.start | 1483315200000 | ||||||||||||
$track.time.duration | 计算轨迹从起始到当前时间步长的持续时间,以微秒为单位。 | 使用 2017 年 1 月 2 日起始、当前时间为 2017 年 1 月 4 日的轨迹。 $track.time.duration | 172800000 | ||||||||||||
$track.time.current | 计算轨迹的当前时间。 | 使用发生于 2017 年 1 月 3 日 9:00 a.m 的要素。 $track.time.current | 1483434000000 | ||||||||||||
$track.index | 返回正在计算的要素的时间索引。 | 根据轨迹中的第一个要素计算此值。 $track.index | 0 | ||||||||||||
$track.T(<value>, "<units>") | 返回要素时间以及使用数字 <value> 和给定 <units> 创建的时间。
| 使用 2017 年 1 月 2 日下午 2 点的要素。 示例 1:$track.T(1, "hours") 示例 2:$track.T(-2, "days") | 示例 1:返回 1 月 2 日下午 3 点:1483369200000 示例 2:返回 12 月 31 日下午 2 点:1483192800000 | ||||||||||||
$track.field["fieldname"].window(<value1>, <value2>) | 在指定字段中返回指定时间索引的值数组。window 函数可用于使时间前进和后退。将在轨迹中的每个要素处评估该表达式。
ArcGIS Enterprise 10.6.1 及更高版本中包含 window 函数。 | MyField 具有按顺序排列的值 [10, 20, 30, 40, 50]。将在轨迹中的每个要素处评估该表达式。返回的结果包括起点要素,但不包括终点要素。 示例 1:$track.field["MyField"].window(-1,2) 示例 2:$track.field["MyField"].window(-2,0)[0] 示例 3:$track.field["MyField"].window(0,3)[2] | 示例 1:在每个要素处进行评估时,该表显示以下结果。
示例 2:在索引 2(值为 30)处进行评估时,将返回 10。 示例 3:在索引 2(值为 30)处进行评估时,将返回 50。 | ||||||||||||
$track.geometry.window(<value1>, <value2>) | 返回表示指定时间索引的几何的值数组。window 函数可用于使时间前进和后退。将在轨迹中的每个要素处评估该表达式。
ArcGIS Enterprise 10.6.1 及更高版本中包含 window 函数。 | MyField 具有按顺序排列的值 [10, 20, 30, 40, 50]。要素的几何为 [{x: 1, y: 1},{x: 2, y: 2} ,{x: null, y: null},{x: 4, y: 4}, {x: 5, y: 5}]。将在轨迹中的每个要素处对表达式进行评估。返回的结果包括起点要素,但不包括终点要素。 示例 1:$track.geometry.window(-1,2) 示例 2:折线数据集上的 $track.geometry.window(0,1)[0] 示例 3:面数据集上的 $track.geometry.window(0,1)[0] 示例 4:查找上一个点的 X 值 $track.geometry.window(-1,0)[0]["x"] | 示例 1:在每个要素处进行评估时,该表显示以下结果。
示例 2:将通过以下格式返回折线: [{"paths":[[[-180,-22.88],[-177.6,-23.6]],[[180,-18.099999999999994],[179.7,-18.4],[179.4,-18.7],[178.9,-18.9],[178.5,-19.3],[178.2,-19.7],[178.4,-20],[178.8,-20.2],[178.9,-21.8],[179,-22.2],[179.4,-22.7],[180,-22.88]],[[-178,-17],[-178.8,-17.3],[-179.2,-17.5],[-179.6,-17.8],[-179.9,-18],[-180,-18.099999999999994]]]}] 示例 3:将通过以下格式返回面:[{"rings":[[[-7882559.1197999995,6376090.883500002],[-7893142.474300001,6042715.216800004],[-8544018.775999999,6045361.0554000065],[-8544018.775999999,6376090.883500002],[-7882559.1197999995,6376090.883500002]]]}] 示例 4:在索引 2(值为 30)处评估:2 | ||||||||||||
$track.window(<value1>, <value2>) | 返回表示指定时间索引的几何和所有属性的值数组。window 函数可用于使时间前进和后退。
ArcGIS Enterprise 10.6.1 及更高版本中包含 window 函数。 | 除了 objectID、globalID 和 instant_datetime 字段之外,MyField 还具有按顺序排列的值 [10, 20, 30, 40, 50]。要素的几何为 [{x: 1, y: 1},{x: 2, y: 2} ,{x: null, y: null},{x: 4, y: 4}, {x: 5, y: 5}]。将在轨迹中的每个要素处评估该表达式。返回的结果包括起点要素,但不包括终点要素。 示例 1:$track.window(-1,0)[0] 示例 2:geometry($track.window(-1,0)[0]["x"] | 示例 1:在每个要素处进行评估时,该表显示以下结果。
示例 2:在索引 2(值为 30)处评估:2 |
在 ArcGIS Enterprise 10.6.1 或更高版本中使用以下追踪表达式。
功能 | 说明 | 示例 | 结果 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TrackStartTime() | 计算轨迹的起始时间,以从新纪元开始的微秒为单位。 | 使用 2017 年 1 月 2 日起始的轨迹。 TrackStartTime() | 1483315200000 | ||||||||||||
TrackDuration() | 计算轨迹从起始到当前时间步长的持续时间,以微秒为单位。 | 使用 2017 年 1 月 2 日起始、当前时间为 2017 年 1 月 4 日的轨迹。 TrackDuration() | 172800000 | ||||||||||||
TrackCurrentTime() | 计算轨迹的当前时间。 | 使用发生于 2017 年 1 月 3 日 9:00 a.m 的要素。 TrackCurrentTime() | 1483434000000 | ||||||||||||
TrackIndex | 返回正在计算的要素的时间索引。 | 根据轨迹中的第一个要素计算此值。 TrackIndex | 0 | ||||||||||||
TrackFieldWindow(<fieldName>, <startIndex>, <endIndex>) | 在指定字段中返回指定时间索引的值数组。window 函数可用于使时间前进和后退。将在轨迹中的每个要素处评估该表达式。
| MyField 具有按顺序排列的值 [10, 20, 30, 40, 50]。将在轨迹中的每个要素处评估该表达式。返回的结果包括起点要素,但不包括终点要素。 示例 1:TrackFieldWindow("MyField,-1,2) 示例 2:TrackFieldWindow("MyField,-2,0)[0] 示例 3:TrackFieldWindow("MyField,0,3)[2] | 示例 1:在每个要素处进行评估时,该表显示以下结果。
示例 2:在索引 2(值为 30)处进行评估时,将返回 10。 示例 3:在索引 2(值为 30)处进行评估时,将返回 50。 | ||||||||||||
TrackGeometryWindow(<startIndex>, <endIndex>) | 返回表示指定时间索引的几何的值数组。window 函数可用于使时间前进和后退。将在轨迹中的每个要素处评估该表达式。
| MyField 具有按顺序排列的值 [10, 20, 30, 40, 50]。要素的几何为 [{x: 1, y: 1},{x: 2, y: 2} ,{x: null, y: null},{x: 4, y: 4}, {x: 5, y: 5}]。将在轨迹中的每个要素处对表达式进行评估。返回的结果包括起点要素,但不包括终点要素。 示例 1:TrackGeometryWindow(-1,2) 示例 2:折线数据集上的 TrackGeometryWindow(0,1)[0] 示例 3:面数据集上的 TrackGeometryWindow(0,1)[0] 示例 4:查找上一个点的 X 值 TrackGeometryWindow(-1,0)[0]["x"] | 示例 1:在每个要素处进行评估时,该表显示以下结果。
示例 2:将通过以下格式返回折线: [{"paths":[[[-180,-22.88],[-177.6,-23.6]],[[180,-18.099999999999994],[179.7,-18.4],[179.4,-18.7],[178.9,-18.9],[178.5,-19.3],[178.2,-19.7],[178.4,-20],[178.8,-20.2],[178.9,-21.8],[179,-22.2],[179.4,-22.7],[180,-22.88]],[[-178,-17],[-178.8,-17.3],[-179.2,-17.5],[-179.6,-17.8],[-179.9,-18],[-180,-18.099999999999994]]]}] 示例 3:将通过以下格式返回面:[{"rings":[[[-7882559.1197999995,6376090.883500002],[-7893142.474300001,6042715.216800004],[-8544018.775999999,6045361.0554000065],[-8544018.775999999,6376090.883500002],[-7882559.1197999995,6376090.883500002]]]}] 示例 4:在索引 2(值为 30)处评估:2 | ||||||||||||
TrackWindow(<value1>, <value2>) | 返回表示指定时间索引的几何和所有属性的值数组。window 函数可用于使时间前进和后退。
| 除了 objectID、globalID 和 instant_datetime 字段之外,MyField 还具有按顺序排列的值 [10, 20, 30, 40, 50]。要素的几何为 [{x: 1, y: 1},{x: 2, y: 2} ,{x: null, y: null},{x: 4, y: 4}, {x: 5, y: 5}]。将在轨迹中的每个要素处评估该表达式。返回的结果包括起点要素,但不包括终点要素。 示例 1:TrackWindow(-1,0)[0] 示例 2:geometry(TrackWindow(-1,0)[0]["x"] | 示例 1:在每个要素处进行评估时,该表显示以下结果。
示例 2:在索引 2(值为 30)处评估:2 |
在 ArcGIS Enterprise 10.9 或更高版本中,使用以下追踪表达式可以计算轨迹上的距离、速度和加速度。
所有距离计算均以米为单位,速度计算以米/秒为单位,加速度计算以米/秒的平方为单位。使用测地线距离测量距离。
功能 | 说明 |
---|---|
TrackCurrentDistance() | 从第一个观测点到当前观测点的观测点之间的距离总和。 |
TrackDistanceAt(value) | 从第一个观测点到当前观测点的观测点之间的距离总和加上给定值。 |
TrackDistanceWindow(value1, value2) | 关于当前观测点 (0) 的窗口中的第一个值(包括)到最后一个值(不包括)之间的距离。 |
TrackCurrentSpeed() | 之前的观测点与当前观测点之间的速度。 |
TrackSpeedAt(value1) | 相对于当前观测点的观测点速度。例如,在值 2 处,这是当前观测点之后两个观测点处的观测点速度。 |
TrackSpeedWindow(value1, value2) | 围绕当前观测点 (0) 的窗口中的第一个值(包括)到最后一个值(不包括)之间的速度值。 |
TrackCurrentAcceleration() | 之前的观测点与当前观测点之间的加速度。 |
TrackAccelerationAt(value1) | 相对于当前观测点的观测点加速度。 |
TrackAccelerationWindow(value1, value2) | 围绕当前观测点 (0) 的窗口中的第一个值(包括)到最后一个值(不包括)之间的加速度值。 |
距离、速度和加速度的示例计算使用以下图像中的示例。
功能 | 示例结果 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TrackCurrentDistance() |
| ||||||||||||||
TrackDistanceAt(2) |
| ||||||||||||||
TrackDistanceWindow(-1, 2) |
| ||||||||||||||
TrackCurrentSpeed() |
| ||||||||||||||
TrackSpeedAt(2) |
| ||||||||||||||
TrackSpeedWindow(-1, 2) |
| ||||||||||||||
TrackCurrentAcceleration() |
| ||||||||||||||
TrackAccelerationAt(2) |
| ||||||||||||||
TrackAccelerationWindow(-1, 2) |
|