在图表中使用 Arcade 表达式

Arcade 是一种为应用于 ArcGIS 而编写的表达式语言,可以执行数学计算、处理文本以及评估逻辑语句。 Arcade 表达式可用于计算新变量,而无需更新数据集的方案。 它还具有动态更新和数据驱动的优势,意味着如果表达式中使用的数据改变,表达式结果也会更新。

Arcade 可用于配置条形图饼图折线图直方图散点图。 要为支持 Arcade 的图表变量创建或编辑表达式,请单击 Arcade 表达式按钮 Arcade 表达式按钮 以打开表达式构建器窗口。

以下示例是使用 Arcade 配置图表时可能的用例:

文本示例

Arcade 提供许多函数,这些函数可用于处理文本值以创建和配置图表。 例如,将所有字母均为大写的字符串值 (CALIFORNIA) 设置为使用标题大小写格式 (California) 可以使图表更具可读性。 可以使用 Arcade 中的 Proper 函数完成此操作。


# Format "CALIFORNIA" as "California"
Proper($feature.STATE_NAME);

要将多个字符串字段串连为单个文本输出,可以使用 Concatenate 函数。 以下示例可以将各个要素的城市名称和州名称组合为单个字符串:


# Combine CITY_NAME (eg "LOS_ANGELES") and STATE_NAME (eg "CALIFORNIA") into "LOS_ANGELES, CALIFORNIA"
Concatenate($feature.CITY_NAME, ", ", $feature.STATE_NAME);

相反,有些情景下可能需要解析字符串,以查找文本中包含的特定部分。 例如,使用 Split 函数识别地址 (123 Main Street, Redlands, CA) 中的城市名称。 以下示例使用逗号分割地址,并使用数组索引识别城市名称:


# Split string on "," and return the second element (ie, the city name)
Split($feature.FULL_ADDRESS, ",")[1];

您也可以在 Arcade 中使用控制结构,以基于逻辑条件对文本值进行重新分类。 在以下示例中,Find 函数用于将与龙卷风相关的暴风雨事件分组至“龙卷风”类别,而将所有与龙卷风无关的事件分组至“其他”类别:


if (Find($feature.EVENT_TYPE, "TORNADO") >= 0) {
    return "Tornado";
} else { 
    return "Other";
}

日期示例

Arcade 提供许多用于处理日期相关字段的函数。 例如,一个数据集中可能包含多个提供日期信息的字段,但是,必须将这些字段组合起来才能创建一个用于时态图的日期字段。 Date 函数会获取相关的日期组成部分并输出一个日期值:


Date($feature.YEAR, $feature.MONTH, $feature.DAY);

要基于两个日期计算持续时间,可以使用 DateDiff 函数。 例如,假设服务请求数据集包含一个表示请求打开时间的日期字段和一个表示请求关闭时间的日期字段。 以下示例可计算两个日期值之间经过的天数:


DateDiff($feature.OPEN_DATE, $feature.CLOSE_DATE, "DAYS");

Arcade 还提供用于从日期字段解析详细信息的函数。 例如,要了解日期字段的星期模式,可以使用 ISOWeekday 函数返回日期是一周中的哪一天。


ISOWeekday($feature.DATE);

数值示例

Arcade 提供用于处理数值的函数运算符,可以将其用于创建图表。 例如,使用 AreaGeodetic 函数按照要素面积归一化人口。 以下示例使用 AreaGeodetic 函数和除法运算符:


$feature.POPULATION / AreaGeodetic($feature, 'square-miles')

Arcade 还提供用于常用数学运算的函数。 例如,可使用 Average 函数得到多个值的平均值:


Average([$feature.SCORE1, $feature.SCORE2, $feature.SCORE3])

在某些情况下,还可能需要对数字数据进行分类。 例如,对于与汽车特性相关的数据集,将每加仑英里数的数值转换为“良好”、“一般”和“较差”等类别:


if ($feature.MILES_PER_GALLON >= 30) {
    return "Good"
} else if ($feature.MILES_PER_GALLON >= 20) {
    return "Okay"
} else {
    return "Poor"
}