使用 Arcade 表达式

ArcGIS Arcade 是一种可移植、轻量级的安全表达式语言,可以执行数学计算、处理文本以及评估逻辑语句。 它还支持多语句表达式、变量和流程控制语句。 与其他表达式和脚本语言相比,Arcade 的独特之处在于其包含要素和几何数据类型。 Arcade 的常见用例是使用图层字段和几何执行计算。

用法说明

使用 Arcade 表达式时,应谨记以下信息:

  • 检测事件计算字段按表达式过滤映射字段连接要素创建缓冲区重新构建轨迹工具支持 Arcade 表达式。
  • 表达式可以包含来自输入来源的属性,以及描述配置表达式的分析的值。
  • 在表达式构建器中,配置文件变量可以展开以显示字段列表、时间值、目标字段和连接字段。 ArcGIS Velocity 表达式利用以下配置文件变量:
    • $feature - 在除了连接要素外的所有工具中,此变量均包含来自源和来源的传入要素的属性字段。 您可以通过从该变量中选择字段来构建利用要素属性值的表达式。
    • $analytic - 此变量包含特定于分析的值,例如 $analytic.AnalyticStartTime$analytic.AnalyticLastEndTime
      • 要将这些分析变量值从时间整型 (1646409900000) 转换为日期,使用 Arcade Date() 函数。 有关详细信息,请参阅 ArcGIS Arcade 文档中的日期函数
    • $target - 在连接要素工具中,对于连接条件表达式,此配置文件变量包含来自目标源或来源的属性字段。
    • $join - 在连接要素工具中,对于连接条件表达式,此配置文件变量包含来自连接源的属性字段。
  • 访问 Arcade 表达式构建器中的字段和方案组件。
    • 配置文件变量选项卡中,访问与该类别相关的字段、变量和方案组件,例如,$feature$analytic$target$join

      访问字段和变量

    • 这将显示与该变量相关的字段或变量。

      列出与类别相关的字段和变量

  • 提供您自己的示例值以进行 Arcade 表达式测试。
    • 根据传入方案,Arcade 为每个工具提供了默认示例值。 在为每个工具构建表达式时,可以更新示例值。
    • 要调整示例值以进行 Arcade 表达式测试,请执行以下操作:
      • 根据传入方案,如果单击以编辑 Arcade 表达式,则会打开配置 Arcade 表达式窗口。
      • $feature 选项卡上,请注意对于每个传入字段,都会根据其数据类型显示一个示例值。 例如,每个字符串字段的示例值为 Pacific。 要构建和测试用于不同数据集的有效表达式,必须更改为字段提供的示例值,以便 Arcade 表达式将评估该表达式并返回由该表达式返回的正确数据类型。

        访问 $feature 选项卡以更改示例值

      • 调整用于 Arcade 表达式测试和评估的示例值。

        编辑用于 Arcade 表达式逻辑的示例值

      • 单击配置 Arcade 表达式窗口左上角的运行,以运行 Arcade 表达式。 表达式将基于提供的已更新样本数据进行评估。
  • 构建 Arcade 表达式以处理空值和 0。
    • 在数学运算中,Arcade 表达式语言将空值视为 0 以进行求值。 因此,应创建 ArcGIS Velocity 中的 Arcade 数学表达式,以在数据中考虑空值。
    • 通过处理空值来考虑数据中的空值。 考虑表达式 $feature.DistanceToFeature <= 5。 需要使用 Arcade 语言构建此表达式,才能处理 $feature.DistanceToFeature != null && $feature.DistanceToFeature <= 5 等空值。 在这些表达式中,<= 5 是数学运算,如果 DistanceToFeature 字段值为空,则其将求值为 0,从而传递该表达式。

数学运算符和函数示例

表达式能够利用数学方式处理数字。 下表提供了可用运算的示例。 有关 Arcade 中数学运算的详细信息,请参阅数学函数

运算符

说明

示例

结果

a + b

a 加 b。

fieldname 包含数值 1.5

$target["fieldname"] + 2.5

4.0

a - b

a 减 b。

fieldname 包含数值 3.3

$target["fieldname"]- 2.2

1.1

a * b

a 乘以 b。

fieldname 包含数值 2.0

$join["fieldname"] * 2.2

4.4

a / b

a 除以 b。

fieldname 包含数值 4.0

$join["fieldname"] / 1.25

3.2

abs( a )

返回 a 的绝对(正)值。

fieldname 包含数值 -1.5

abs($target["fieldname"])

1.5

log( a )

返回 a 的自然对数(以 E 为底)。

fieldname 包含数值 1

log($join["fieldname"])

0

sin( a )

返回 a 的三角正弦值。 假设输入为以弧度为单位的角。

fieldname 包含数值 1.5707

sin($target["fieldname"])

1

cos( a )

返回 a 的三角余弦值。 假设输入为以弧度为单位的角。

fieldname 包含数值 0

cos($join["fieldname"])

1

tan( a )

返回 a 的正切值。 假设输入为以弧度为单位的角。

fieldname 包含数值 0

tan($target["fieldname"])

0

sqrt( a )

返回 a 的平方根。

fieldname 包含数值 9

sqrt($join["fieldname"])

3

min( a, b )

返回 a 和 b 间的最小数值。

fieldname 包含数值 1.5 和 -3

min($join["fieldname"], -3)

-3

max( a, b )

返回 a 或 b 间的最大数值。

fieldname1 包含数值 1.5,fieldname2 包含数值 -3

max($target["fieldname1"], $join["fieldname2"])

1.5

constrain(<value>,<low>,<high>)

如果输入值在限制范围内,则返回输入值。 如果输入值小于低值,则返回低值。 如果输入值大于高值,则返回高值。

constrain($target["distance"], 0, 10)

constrain($join['Store dist'], 6, distance)

如果 distance 小于 0,则返回 0,如果 distance 大于 10,则返回 10,其余情况下返回 distance。

如果 Store dist 小于 6,则返回 6,如果 Store dist 大于 distance,则返回 distance,其余情况下返回 Store dist。

连接条件表达式的以下乘法示例将使用目标数据集中的字段:

$target["Distance"] * 2 > $join["DistField"]

文本函数示例

Arcade 表达式可以处理文本。 下表提供了可用运算的示例。 有关 Arcade 中文本函数的详细信息,请参阅文本函数

运算符

说明

示例

结果

concatenate(<values>, <separator>)

将值连接在一起,然后返回字符串。

  • values - 要串连的字符串值数组。
  • separator(可选)- 如果值参数为数组,则为用于连接的分隔符;如果第一个参数为单个值,则为要连接的字符串。 如果未提供,则为空。

fieldname 包含值 ArcGIS Velocity

concatenate([$target["fieldname"], "is", "great!"], ' ')

ArcGIS Velocity is great!

find(<searchText>, <text>, <startPos>)

查找字符串中的字符串。 不支持通配符。

  • searchText - 要搜索的子字符串。
  • text - 要搜索的文本。
  • startPos(可选)- 要在其中进行搜索的字符串中基于零的位置索引。

fieldname1 包含值 14NorthStreet,fieldname2 包含值 North

find($target["fieldname2"], $join["fieldname1"])

2

lower(<value>)

使字符串均为小写字母。

  • value - 要转换为小写形式的字符串。

fieldname 包含值 ANALYTICS

lower($join["fieldname"])

分析

以下文本示例将使用 find 和 lower:

find(("north"), lower("146NorthStreet")) == False

日期函数示例

Arcade 可以处理日期。 在 Arcade 中,月份值范围从 0(1 月)到 11(12 月)、日期从 1 到 31、小时从 0(上午 12:00)到 23(下午 11:00)、分和秒从 0 到 59 以及毫秒从 0 到 999。

下表提供了可用运算的示例。 有关 Arcade 中日期函数的详细信息,请参阅日期函数

运算符

说明

示例

结果

date( <value>, <month>, <day>, <hour>, <minute>)

将值或值集解析成日期字符串。

  • value(可选)- 自 1970 年 1 月 1 日 (UTC) 以来的毫秒数,或者代表年的数字。 如果指定了某一年,则也必须在后续参数中提供月和日。 该值可以是日期字符串或者是待转换成日期的 ISO 8601 字符串。
  • month(可选)- 月份 (0-11),其中 0 是一月,11 是十二月。
  • day(可选)- 一月中的某天 (1-31)。
  • hour(可选)- 一天中的某小时 (0-23)。
  • minute(可选)- 一小时中的某分钟 (0-59)。
  • second(可选)- 一分钟中的某秒 (0-59)。
  • millisecond(可选)- 一秒中的某毫秒 (0-999)。

fieldname 包含数值 1476987783555

示例 1:Date($target["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>)

将两个日期相减,并以指定的单位返回差值。

  • date1 - 从中减去第二个日期的日期值。
  • date2 - 要从第一个给定日期中减去的日期值。
  • startpos(可选)- 返回两个给定日期差值的单位。 受支持的单位类型为毫秒、秒、分钟、小时、天、月和年。 默认值为毫秒。

示例 1:DateDiff(Date(2017,1,14,0), Date())

示例 2:DateDiff(Date(2017,1,14,0), Date(), "Years")

产生的结果会随运行此命令的时间而变化。

示例 1:-20532129137

示例 2:-0.6546783768647119

Year(<dateValue>)

返回给定日期中的年份。

  • value - 从中获取年份的日期值。

示例 1:fieldname 是一个值为 09 Oct 2017 04:30:43 pm 的日期类型的字段

Year($join["fieldname"])

示例 2:fieldname 是一个值为 2012-09-27 的 ISO 8601 字符串格式的字符串字段

示例 3:fieldname 是一个值为 Year(Date($target["fieldname"])) 的 ISO 8601 字符串格式的字符串字段。

示例 1:2017

示例 2:2012

条件运算符

条件语句可使用以下运算符:

运算符

说明

示例

结果

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

缓冲区表达式的以下示例将使用高级函数和条件:

iif(field1 > field2, iif(field2 = 0, field3, field4), 0)

以下是连接条件的乘法示例:

iif(field1 > field2, iif(field2 = 0, field3, field4), 0) > $join["Distance"] * 2

逻辑运算符示例

除了条件运算符之外,还可以使用如下表提供的更高级的逻辑运算符来创建表达式。 有关 Arcade 中逻辑函数的详细信息,请参阅逻辑函数

函数

说明

示例

结果

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 大于 field2,则返回 field1,否则返回 0。

如果 field1 大于 field2,则返回第二个 iif 函数的结果,其余情况下返回 0。

when(<expression1> , <result1> , <expression2> , <result2> , ... , <expressionN> , <resultN>, <default>)

按顺序评估一系列表达式,直至一个表达式评估为 true。

  • expression - 表达式。
  • result - 表达式的结果。 可以为数值或字段。
  • default - 表达式均不匹配时的可选值。

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> )

将对表达式进行评估,并将其值与后续参数进行比较。 如果表达式匹配,则返回下一个参数值。 如果均不匹配,则可以选择将最后一个参数作为默认返回值。

  • conditional val - 条件值。 可以为字段或表达式。
  • case - 要与条件值进行对比的值。
  • result - 相应实例与条件值相匹配时的结果。
  • defaultValue - 其他值均不是 true 时的可选值。

decode($feature["field1"] + 3 , $feature["field1"], 1, $feature["field2"], 2, 0)

比较 conditional val field1 + 3 和 case1 field1 是否相等。 如果为 true,则返回 1。 如果为 false,则比较 field1 + 3 和 field2 是否相等。 如果为 true,则返回 2;否则,返回 0。