使用 Arcade 设置图层样式
您将创建 Arcade 表达式,并使用此表达式设置地图中图层的样式。 Arcade 表达式将计算人均年用电量。 它将首先使用各国年用电量除以该国的总人口。 由于世界各国的人口数量范围很广,这种计算对于有意义的电力消耗比较非常重要。 然后,您将使用所得的人均年用电量值设置世界国家/地区图层的样式。
首先,您需要将图层添加到地图,并选择不同的底图。
添加图层并更改底图。
您将在 Map Viewer 中新建地图。 然后,您将向新地图添加两个图层 Global Power Plants 和 World countries Electricity Consumption,并更改底图。
注:
Map Viewer 为下一代 ArcGIS Online 地图制作工具。 其提供了关键制图工作流的增强体验,旨在激发实验研究和创造力。
- 登录到您的 ArcGIS 组织账户。
注:
如果您没有组织账户,请参阅软件访问权限选项。
- 单击功能区上的地图。
注:
根据您的组织和用户设置,您可能已打开 Map Viewer 经典版。ArcGIS Online 将提供两个地图查看器,用于查看、使用和创建地图。 有关可用和使用的地图查看器的详细信息,请参阅此常见问题解答。
本教程将使用 Map Viewer。
- 如有必要,在弹出窗口中,单击在 Map Viewer 中打开,或者在功能区上,单击在 Map Viewer 中打开。
Map Viewer 随即打开。
现在,您将想地图添加第一个图层 Global Power Plants。
- 在图层窗格中,单击添加。
- 单击我的内容并选择 ArcGIS Online。
- 在搜索栏中,输入 global power plants owner:Learn_ArcGIS。
Global Power Plants 图层将显示在搜索结果中。
- 对于 Global Power Plants 搜索结果,单击添加按钮。
新图层将显示在地图上。
此图层是世界各地发电厂的综合清单,以电力类型进行符号化。 现在,您将添加将在此工作流中使用的第二个图层。
- 在搜索栏中,复制并粘贴以下文本:electricity consumption owner:Learn_ArcGIS。
- 对于 World Countries Electricity Consumption 搜索结果,单击添加。
新图层将显示在地图上。
图层中包含世界各国家/地区的人口和电力消耗数据。
此图层将绘制在 Global Power Plants 图层的顶部,并部分覆盖它,因此您将更改图层的顺序。
- 在添加图层窗格中,单击返回按钮以返回到图层窗格。
- 在图层窗格中,将 World countries Electricity Consumption 图层拖到 Global Power Plants 图层下方。
现在可以在国家/地区图层的顶部看到发电厂要素。
世界上某些国家有许多发电厂彼此紧邻。 要更好地可视化发电厂的分布,您将在图层上启用聚类。
- 在图层窗格中,单击 Global Power Plants 图层以将其选中。
- 在设置(浅色)工具栏上,单击聚合。
- 在聚合窗格中,打开启用聚合。
将默认启用聚类。
- 对于聚类,单击选项。
聚类窗格随即打开。
- 在聚类窗格中,对于聚类半径,向靠近低的方向拖动滑块。 对于大小范围,向左拖动右侧滑块。
发电厂图层现在已使用聚类符号化。 当您进行缩放时,将重心配置聚类以适应当前的比例。 每个聚类都使用其所代表的发电厂数量进行标注。
您现在将选择不同的底图,以便在地图上更好地突出发电厂要素。 由于该图层中的点使用明亮符号表示,因此可以将其放置在深色和中性底图上来构建对比度。
- 单击返回并关闭聚合窗格。
- 在内容(深色)工具栏上,单击底图。 在底图窗格中,选择深灰色画布。
地图上的底图随即更新。
- 关闭底图窗格。
现在,您将折叠内容工具栏以显示更多地图内容。
- 在内容工具栏的底部,单击折叠。
接下来,您需要保存地图。
- 在折叠的内容工具栏上,单击保存并打开,然后选择另存为。
- 在保存地图窗口中,输入以下信息:
- 对于标题,输入 Global Power Generation and Consumption,然后加上您的姓名首字母。
- 对于标签,键入 electricity consumption, power plants,然后按每个标签后的 Enter 键。
- 对于摘要,输入 This map shows power plants around the world, categorized by electricity type.
- 单击保存。
浏览数据和 Arcade 表达式编辑器
接下来,您将探索 Arcade 表达式编辑器并使用它来设置 World countries Electricity Consumption 图层的样式。 您的目标是轻松比较各国家/地区的年用电量。 为此,您将构建一个 Arcade 表达式,通过将年用电量(以千瓦时为单位)除以总人口来返回年人均用电量。 这样可以对人口数量差异很大的国家的电力消耗进行有意义的比较。
注:
这种类型的计算称为归一化:对于每个国家/地区,您将按总人口对电力消耗进行归一化。
在开始构建 Arcade 表达式之前,您将检查图层的属性表。
- 在内容工具栏上,单击图层按钮。
- 在图层窗格中,对于 World countries Electricity Consumption 图层,单击选项按钮,然后单击显示表。
属性表随即出现。
注:
如需更多屏幕空间,可以关闭属性窗格。
该表包括列出国家/地区名称的 COUNTRY 字段、包括以千瓦时 (kWh) 为单位的值的 Annual Electricity Consumption 字段和包含每个国家/地区总人口的 Pop 字段。 这些是您将在 Arcade 表达式中使用的属性。
注:
千瓦时是衡量一段时间内用电量的最常见度量。 如果您仔细查看月电费单,您的月用电量很可能以千瓦时为单位。
您现在将熟悉 Arcade。 这是一种便携式轻量级的安全表达式语言,专为应用于 ArcGIS 而编写。 与其他表达式语言类似,该语言可以执行数学运算、操作文本并评估逻辑语句。 Arcade 专用于在 ArcGIS 中动态创建自定义可视化和标注。 它允许用户通过在 ArcGIS Pro、ArcGIS Runtime、ArcGIS Online、ArcGIS Enterprise 和 ArcGIS API for JavaScript 中创作、共享和执行自定义表达式来操作现有数据并获得新见解。
在 Map Viewer 中,Arcade 在使用弹出窗口和标注中的数据以及设置图层样式时非常有用。 您可以使用 Arcade 表达式编辑器来构建和应用 Arcade 表达式。 现在,您将打开并探索表达式编辑器 由于您的目标是为 World countries Electricity Consumption 图层设置样式,因此您将通过该图层的样式窗格打开表达式编辑器。
- 在图层窗格中,确保选中 World Countries Electricity Consumption 图层,然后在设置工具栏上,单击样式。
- 在样式窗格的选择属性下,单击表达式。
随即出现 Arcade 表达式编辑器窗口。
- 单击展开图标以查看侧选项卡。
查看编辑器窗口的不同部分。 表达式窗口用于构建表达式。 配置文件变量和函数选项卡用于查找您将在表达式中使用的元素。 帮助选项卡将打开 Arcade 帮助页面。
- 查看配置文件变量选项卡。
该选项卡提供了预定义变量列表,包括图层要素的属性字段和几何。
- 单击函数选项卡。
此选项卡列出了所有 Arcade 函数。 您可以单击各函数右侧的信息按钮来访问该函数关于参数、语法和用法的集成帮助。
- 单击帮助选项卡。
此选项卡将链接到 Arcade 文档。
- 单击运行按钮。
输出、控制台和日志选项卡将显示 null 结果。 创建表达式后,您可以使用运行按钮来测试表达式的输出。 目前,您还没有编写任何 Arcade 代码,因此输出和日志选项卡包含的内容不多。
创建用于人均用电量的 Arcade 表达式
现在,您将开始构建 Arcade 表达式以设置 World countries Electricity Consumption 图层的样式。 您将首先定义一个变量以访问年用电量 (KwH) 属性字段。
- 在表达式窗口的第 1 行中,键入(或复制粘贴)var annualConsumptionKwh =。
AnnualConsumptionKwh 为新变量的名称。 使用 var <variableName> 初始化内存中的变量以供之后在表达式中使用。 您将在下一步骤中指定变量值。
- 单击配置文件变量选项卡。 在配置文件变量窗格中,单击 $feature 旁的箭头。
- 在值下,单击 $feature.Annual_Electricity_Consumption_ 变量。
将字符串复制到表达式窗口中,以完成您的第一行代码。
注:
Year_Electricity_Consumption_ 是属性名称,而 Annual Electricity Consumption 是别名,这是一种对用户更友好的属性引用方式。
- 在表达式窗口中,按 Enter 键转到表达式的下一行。
变量 annualConsumptionKwh 的任何进一步引用都将访问图层中各要素的年用电量 (KwH) 属性值(在本情况下,即世界各个国家/地区)。
现在,您将测试表达式的第一行。 测试变量的一种便捷方法是要求 Arcade 返回其值。 可以使用 return 语句来实现这一点。
- 在表达式窗口中输入 return annualConsumptionKwh,然后按 Enter 键。
- 单击运行按钮。
在输出选项卡上,将显示值 157200000,Number 为数据类型。
注:
为了更便于测试表达式,Arcade 表达式编辑器将使用样本值填充填充图层第一个要素(按对象 ID 排序)的属性。 World Country Electricity Consumption 图层的第一个要素为美属萨摩亚,年用电量为 157,200,000 kWh,人口为 46,366。
您的表达式返回的结果确实是美属萨摩亚的年用电量值:157,200,000 (kWh)。 此为期望值,因此您的代码运行符合预期。
接下来,您将定义一个变量以访问人口字段。
- 在表达式窗口中,在第一行代码的末尾,按 Enter 键添加新行。 输入 var population =。
- 如有必要,在配置文件变量选项卡上,单击 $feature 选项卡旁的箭头。 在值下,选择 $feature.POP 以将人口属性值添加到表达式中。
现在,您将使用 return 语句来测试该新变量。
- 在 return 行中,将 annualConsumptionKwh 替换为 population。
注:
前一个属性使用了 ["field"] 注记,因为其包含下划线。 POP 字段不包含下划线,因此 Arcade 将使用更简单的注记。 通过配置文件变量选项卡添加属性而非键入属性的一个优势是可以选择正确格式。 这样还可以避免拼写错误。
- 单击运行。
输出为 46366,这确实是美属萨摩亚的人口值。 您的代码运行仍然符合预期。
下一步是计算人均用电量。 要执行此操作,您将使用存储在两个变量中的值,并将年用电量除以人口。 您将结果存储在名为 consumptionPerCapita 的第三个变量中。
- 在表达式窗口中,按 Enter 键在 return population 行之前新增一行。 键入 var consumptionPerCapita = annualConsumptionKwh / population。
- 在 return 行中,将 population 替换为 consumptionPerCapita。
- 单击运行。
输出为 3,390.415390587931,这确实是 157,200,000 除以 46,366 的结果。
要测试更多种其他情况,可以使用文本数值重新分配变量 population。
- 在表达式窗口中,按 Enter 键在 var population = $feature.POP 行之后新增一行。 键入 population = 40000。
- 单击运行。
结果将更新为 3930,即 157,200,000 除以 40,000 的结果。
- 同样,您可以使用不同的年用电量和人口字段值来测试您的表达式。
- 删除代码行 population = 40000。
注:
return 语句不仅用于测试,这也是在地图中提供表达式最终结果的方式。 例如,最终结果在您的表达式中返回后,您就可以使用它来设置国家/地区图层的样式。
最终表达式如下所示。
// Set variables var annualConsumptionKwh = $feature["Annual_Electricity_Consumption_"] var population = $feature.POP // Calculate the electricity consumption per capita var consumptionPerCapita = annualConsumptionKwh / population // Return the consumption per capita return consumptionPerCapita
为了使您的代码更具可读性,添加了注释。
注:
要使您的代码在将来更具可读性且更易于维护,最好添加注释,并通过在行开头处的 // 指定。 Arcade 将忽略注释,并且注释仅适用于阅读代码的人员。
现在,您将为表达式命名。 为表达式指定一个有意义的名称非常重要,因为其功能本质上与图层中新字段的名称类似。 它将在地图图例中使用,并且还有助于稍后在您引用它或需要对其进行编辑时识别该表达式。
- 单击新建表达式旁边的编辑按钮。
注:
您也可以直接单击表达式,以编辑标题。
- 在新建表达式文本框中,键入 Electricity consumption per capita (kWh),然后单击该文本框外部。
- 单击完成。
Arcade 编辑器窗口随即关闭,表达式将添加到可用于设置 World countries Electricity Consumption 图层样式的属性列表中。
- 在内容工具栏中,单击保存并打开,然后选择保存。
保存地图将保存您在地图中所做的所有操作,包括您创建的所有表达式。
设定图层样式
您现在已准备好使用刚刚创建的 Arcade 表达式为 World countries Electricity Consumption 图层设置样式。
- 在样式窗格中,查看当前设置。
在样式窗格中,已自动应用新表达式 Electricity consumption per capita (kWh),以对 World Countries Electricity Consumption 图层进行符号化。 默认情况下,绘制样式为计数和数量(颜色),即最终设置图层样式的方式。 但是,您需要将样式更改为计数和数量(大小)以查看差异。
- 对于选取样式,单击计数和数量(大小)。
由于难以查看图层,您将暂时关闭 Global Power Plants 图层。
- 在图层窗格中,对于 Global Power Plants,单击可见性按钮关闭该图层。
使用不同大小的点表示各国家/地区的人均用电量。
注:
由于各个国家的总用电量和人口字段值不同,因此即使 Arcade 表达式相同,各国家的人均结果也会有所不同。 这就是 Arcade 的强大功能 - 它可以查看特定要素的字段值,以动态地为每个要素返回新值。 此处演示的另一个 Arcade 功能是您无需拥有原始数据层即可生成新的派生信息。
为了更好地查看国家/地区图层和发电厂图层,您将使用不同的符号化。
- 在样式窗格中,关闭计数和数量(颜色)绘制样式。
为计数和数量样式自动选择了一个直观的色盲友好型的色带,以适用于深色背景。 人均用电量低的国家/地区显示为深蓝色,人均用电量高的国家/地区显示为亮蓝绿色。
注:
当地图使用深色背景时,最低值以较深颜色显示,最高值以较浅或较亮颜色显示。 这样可以突出显示最高值。
- 单击完成以关闭样式窗格。
- 在图层窗格中,再次打开 Global Power Plants 图层。
由于使用了新样式,现在可以同时可视化两个图层。
您将禁用国家/地区图层的信息弹出窗口,以便用户可以轻松选择发电厂要素。
- 在图层窗格中,确保选中 World Countries Electricity Consumption 图层,然后在设置工具栏上,单击弹出窗口。
- 在弹出窗口窗格中,关闭启用弹出窗口并关闭弹出窗口窗格。
- 保存地图。
您的地图现在具有直观的样式,可显示世界各地的人均用电量和发电量的模式。
- 查看地图内容。
您的国家/地区与其他国家/地区的对比一目了然。 西欧和北美高度工业化的国家/地区以及沿海的主要发电省的人均用电量更高。 可以看到,人均用电量较高的国家/地区往往发电厂的集中度较高,这是合理的。 在发展中国家,发电厂较少,人均用电量也较低。
您已经创建了一个地图并使用聚类符号化对发电厂进行了可视化。 然后,您使用 Arcade 表达式可视化了世界各地的人均年用电量。
使用 Arcade 配置弹出窗口
之前,您已经熟悉了 Arcade 并且已使用 Arcade 表达式对世界国家/地区图层进行了符号化。 接下来,您将使用 Arcade 表达式在信息性弹出窗口中显示来自发电厂图层的数据。 这将使您更好地了解发电厂的电力生产。
浏览 Global Power Plants 属性和弹出窗口
首先,您将浏览 Global Power Plants 属性并查看图层的弹出窗口。
在 Global Power Plants 图层中,有一个属性提供了每个发电厂的估计年发电量,以千兆瓦时 (gWh) 为单位。 该属性的名称为 estimated_generation_gwh。 此数据十分有用,但是您希望将发电量值以公众更容易理解的方式表示:该发电厂一年可以为多少个 60 瓦灯泡供电。 您将使用 Arcade 表达式以进行该转换,并在图层弹出窗口中用一句话显示新的值。 由于一些发电厂的 estimated_generation_gwh 属性缺少值,您还需要在 Arcade 表达式中处理这些缺失值。
首先,您将检查发电厂图层的属性表。
- 如有必要,请登录 ArcGIS Online。 在工具栏上,单击内容,然后浏览到您在模块 1 中创建的 Global Power Generation and Consumption 地图。
- 单击 Global Power Generation and Consumption Web 地图旁边的选项菜单,然后选择在 Map Viewer 中打开。
- 在图层窗格中,对于 Global Power Plants 图层,单击选项按钮,然后选择显示表。
- 在 Global Power Plants 属性表中,查看字段。 使用水平滚动条查看所有字段。
在图层的多个属性中,请注意以下属性:
- country_long 字段表示发电厂所在国家/地区的名称。
- name 字段包含发电厂的名称。
- fuel 字段表示发电厂的类型。
注:
您可能需要扩大列以查看完整的属性字段别名。
- 滚动到表的最后一列,estimated_generation_gwh。
如上所述,该字段包含发电厂的估计年发电量,以千兆瓦时 (gWh) 表示。 千兆瓦时是千瓦时电力的一百万倍。
- 关闭 Global Power Plants 属性表。
接下来,您将浏览图层的弹出窗口。
- 在地图上,放大到感兴趣的区域。
注:
由于您已对 Global Power Plants 图层启用了聚类,因此需要将地图缩放至聚类分解成单个要素,以便查看单个要素的弹出窗口。
- 在地图上,选择一个 Global Power Plants 图层的要素以查看该图层的原始弹出窗口。
弹出窗口已显示一些有用的信息,提到了发电厂类型及其容量。 还可以为弹出窗口补充其他信息:发电厂的年发电量。
使用 Arcade 转换发电量单位
您将打开 Arcade 表达式编辑器窗口以构建新表达式。 因为您的目标是自定义弹出窗口,所以将通过弹出窗口配置窗格打开表达式编辑器。
- 在图层窗格中,确保已选择 Global Power Plants 图层。
- 如有必要,请单击设置(浅色)工具栏中的弹出窗口。 在弹出窗口窗格中,单击属性表达式。
现在,您将创建新的 Arcade 表达式。
- 单击添加表达式以打开 Arcade 表达式编辑器窗口。
编辑器窗口随即出现。
注:
Global Power Plants 图层现已包含 Pop-up color 表达式。 它用于基于燃料类型生成符号化颜色。
您将为表达式命名。
- 将表达式的标题编辑为 Estimated Annual Generation in Lightbulbs。
您将开始构建 Arcade 表达式。 首先,您将创建变量 yearLightbulbPower,其中包含一个 60 瓦灯泡一年所需的千瓦时数。
一个 60 瓦的白炽灯泡每开一小时会消耗 60 瓦时或 0.06 千瓦时的电量。 要得出一个 60 瓦灯泡一年需要多少千瓦时的电量,您需要使用 0.06 千瓦时乘以 24 小时,再乘以 365 天。
- 在表达式窗口的第一行中,键入(或复制粘贴)var yearLightbulbPower = 0.06 * 24 * 365。
接下来,您将添加返回语句以测试变量。
- 按 Enter 键并添加 return yearLightbulbPower。
接下来,您将运行测试代码。
- 单击运行按钮。
在输出选项卡上,值为 525.6。 这确实是 0.06 * 24 * 365 的结果,因此您的代码可按预期运行。
接下来,您将使用 Global Power Plant 图层中的 name 字段创建一个包含发电厂名称的变量。
- 在表达式窗口中,在 return 语句前新增一行,然后键入 var plantName =。
- 在配置文件变量选项卡中,单击 $feature 旁的箭头。
随即显示发电厂图层的属性列表。
注:
配置文件变量选项卡的外观相比您在上一模块中为世界国家/地区图层配置符号系统时有所不同。 这是因为弹出窗口允许您使用额外的配置文件变量,例如 FeatureSets。
- 在值列表中向下滚动,然后单击 $feature.name 以完成代码行。
- 在 return 语句中,使用 plantName 替换 yearLightbulbPower 以测试您的第二个变量。
- 单击运行按钮。
在输出表中,值为 Kajaki Hydroelectric Power Plant Afghanistan。 这是属性表中列出的第一个发电厂的名称,此发电厂已被默认分配为示例数据。
在下一步中,您将创建变量 annualGenerationGwh,其中包含年发电量属性值。
- 在表达式窗口中,在 return 语句前新增一行,然后键入 var annualGenerationGwh =。
- 在配置文件变量窗格中,单击 $feature.estimated_generation_gwh。
- 在 return 语句中,使用 annualGenerationGwh 替换 plantName 以测试最新变量。
- 单击运行按钮。
在输出选项卡上,似乎没有值,且被列为 Null 值。 这不是预期的结果,因此您需要进一步调查。
您将检查该属性的当前示例值是否为空。 用于测试变量是否为空的 Arcade 函数为 IsEmpty。 如果提供的值为 null 或空文本(例如 ''),则 IsEmpty 函数将返回 true。 将为其他所有情况返回 false,包括空数组和字典。
- 在表达式窗口中,对于 var annualGenerationGwh = $feature["estimated_generation_gwh"],将 $feature["estimated_generation_gwh"] 替换为 IsEmpty($feature["estimated_generation_gwh"])。
- 单击运行。
在输出选项卡上,该值以布尔值显示且为 True。
这表示阿富汗卡加克水力发电厂的 estimated_generation_gwh 属性不包含值。 因此,测试先前产生了空结果。
注:
您将需要在 Arcade 表达式中处理那些缺少数据的特殊情况。 但是,在本教程中,您将稍后进行此操作。 现在,您将完成常规情况(即属性值存在)下的代码。
要继续开发您的 Arcade 表达式,您将手动设置 10 gwh 的示例值。
- 在表达式窗口中,对于 var annualGenerationGwh = IsEmpty($feature["estimated_generation_gwh"]),删除 IsEmpty 函数和开始和结束括号。
表达式恢复到以前的格式。
- 按 Enter 键在 行之后将新增一行 var annualGenerationGwh = $feature["estimated_generation_gwh"]。 键入 annualGenerationGwh = 10。
- 再次单击运行按钮。
在输出选项卡上,值现在是 10,符合预期,数据类型为数字。
接下来,在您的 Arcade 代码中,您希望基于 annualGenerationGwh 变量的值计算以 60 瓦灯泡数量表示的年发电量。 第一步是将值从千瓦时 (kWh) 转换为千兆瓦时 (gWh),并将结果存于新变量中。 一千兆瓦时等于一百万千瓦时,因此您需要将 annualGenerationGwh 变量乘以一百万以将其转换为千兆瓦时。
- 在 return 语句上方新增一行,键入 var annualGenerationKwh = annualGenerationGwh * 1000000。
- 在 return 语句中,使用 annualGenerationGwh 替换 annualGenerationKwh。
- 单击运行以评估表达式。
结果为 10,000,000,是预期的结果,因为您的示例值为 10。
在本部分中,您已开始开发第二个 Arcade 表达式。 您定义了多个变量并将年发电量值从 gWh 转换为 kWh。
执行计算并使用 Arcade 设置文本格式
现在,您将在 Arcade 表达式中执行主要计算。 然后,您将设置结果格式以将其显示为文本。
首先,您将计算发电厂一年可以为多少个 60 瓦灯泡供电,方法是将以 kWh 为单位的年发电量 (annualGenerationKwh) 除以一个 60 瓦灯泡一年所需的 kWh 数 (yearLightbulbPower)。
注:
请记住,变量 yearLightbulbPower 包含 0.06 * 24 * 365 的结果,即 525.6。
- 在 return 语句上方新增一行,键入 var annualGenInLightbulbs = annualGenerationKwh / yearLightbulbPower。
- 在 return 语句中,使用 annualGenerationKwh 替换 annualGenInLightbulbs。
- 单击运行以评估表达式。
结果值为 19025.87519025875,即 10000000 / 525.6 的预期结果。 约为 19,025.87 个灯泡。
但是,将灯泡数量返回为整数而不是小数将更加合理。 Arcade 可以帮助您使用 Round 函数实现此目的。
- 在 return 语句上方新增一行,键入 var annualGenInLightbulbsRounded =。
现在,您将在函数选项卡中查找 Round 函数。
- 单击函数选项卡。 在搜索文本字段中,输入 round。
Round 函数随即显示。
- 单击 Round 函数以将其插入表达式窗口。
Round 函数将添加至在括号中指示占位符参数的表达式。
您将在应用程序内置帮助中查看有关函数的信息,从而更好地理解预期参数。
- 在函数选项卡上,单击 Round 函数旁的箭头。
- 查看 Round 函数的信息。
第一个参数是要四舍五入的参数,在本例中为变量 annualGenInLightbulbs。 第二个参数指示要将数字四舍五入到的小数位数。 您将保留默认值 0,因此 19025.87519025875 应四舍五入到 19026,小数点后面有 0 个小数位。
- 查看 Round 函数的相关信息后,单击函数列表旁的箭头以退出应用程序内置帮助。
- 将 annualGenInLightbulbsRounded 代码行修改如下:
var annualGenInLightbulbsRounded = Round(annualGenInLightbulbs, 0)
注:
函数的参数应始终出现在括号之间,并以逗号分隔。
- 在 return 语句中,使用 annualGenInLightbulbs 替换 annualGenInLightbulbsRounded。
- 单击运行以评估表达式。
结果为 19026,符合预期。 即表示 19,026 个灯泡。
您已经成功计算出每个发电厂一年可以为多少个 60 瓦灯泡供电。 但是,您还没有完成。 接下来,您将设置数字格式以使其便于阅读,并创建一个句子以将数字置于上下文中。
与其他编程语言类似,Arcade 具有将数字转换为文本的方法。 此函数名为文本。 您将创建一个新变量,从而以文本形式保存灯泡的数量。
- 在 return 语句上方新增一行,键入 var annualGenInLightbulbsText =。
现在您将在函数选项卡中查找 Text 函数。
- 在函数选项卡中,搜索 text。 在 Text 函数列表下,单击 Text 函数以将其插入表达式窗口。
新代码行如下所示:
var annualGenInLightbulbsText = Text(value)
您将在应用程序内置帮助中查看有关此函数的信息,从而更好地理解预期参数。
- 在函数选项卡上,单击 Text 函数旁的箭头。
第一个参数是要转换为文本的数字,在本例中为变量 annualGenInLightbulbsRounded。 第二个参数是表示所需格式的模板。 例如,默认的“#,###”模板将添加一个逗号作为千位分隔符。 这意味着之前写作 9563 的数字将变成 9,563。
- 相关信息查看完成后,单击返回箭头以退出应用程序内置帮助。
- 将 annualGenInLightbulbsText 代码行修改如下:
var annualGenInLightbulbsText = Text(annualGenInLightbulbsRounded, '###,###,###,###')
注:
模板“###,###,###,###”将为比默认的“#,###”更大的数字添加分隔符。 由于您的预期值是数百万或更大的数值,因此需要更长的掩码。 例如,之前写作 735790325 的数字将变为 735,790,325。
- 在 return 语句中,使用 annualGenInLightbulbsRounded 替换 annualGenInLightbulbsText。
- 单击运行以评估表达式。
输出为 "19,026",已插入逗号,因此符合预期。 此外,类型现在为文本。
下一步是创建一个完整的句子,其中包含文本格式的数字并解释其含义。 您将使用模板文本实现此目的。
注:
模板文本是 Arcade 中的一种将变量值和表达式插入字符串的方式。 模板文本使用反引号括起来,并使用语法 ${variableName} 将变量、表达式或任何其他非字符串值插入字符串中。 您可以在 ArcGIS Arcade 结构和逻辑帮助主题中了解有关模板文本的详细信息。
- 在表达式窗口中的 return 语句前添加新行,然后复制粘贴以下内容:
var popupSentence = `It's estimated that ${ plantName } generates enough electricity to power ${ annualGenInLightbulbsText } 60-watt incandescent light bulbs for a year.`
注:
模板文本必须在 Arcade 编辑器中的单行中,因为移动到下一行将生成多行输出。
- 在 return 语句行中,使用 popupSentence 替换 annualGenInLightbulbsText 以测试最新变量。
- 单击运行按钮。
在输出选项卡上,值是整个句子,其中变量 ${plantName} 和 ${annualGenInLightbulbsText} 已使用其当前值替换。
- 在表达式窗口中,删除 annualGenerationGwh = 10 代码。
- 单击完成以保存您的表达式,并关闭 Arcade 表达式编辑器窗口。
- 在折叠的内容工具栏上,单击保存并打开,然后单击保存以保存您对地图所做的总体更改。
在本部分中,您计算了每个发电厂一年可以为多少个 60 瓦灯泡供电,设置了该数字的格式以使其更易于阅读,并且创建了一个句子以将该数字置于上下文中。
将 Arcade 表达式添加到弹出窗口
现在,您将把保存的 Arcade 表达式添加到弹出窗口中,并通过地图上的 Global Power Plants 图层对其进行测试。
- 在属性表达式窗格中,单击返回按钮。
- 在弹出窗口窗格中,单击文本,然后单击编辑文本。
弹出窗口文本编辑器随即打开,并显示当前在 Global Power Plants 图层的弹出窗口中显示的文本。 您要将 Arcade 表达式的结果添加到现有文本。
- 在弹出窗口文本编辑器中,将光标放置在现有文本的下一行。 输入单个括号:{.
可用字段列表和 Arcade 表达式随即显示。
- 找到并选择您刚刚创建的表达式 Estimated Annual Generation in Lightbulbs。
注:
您可以看到所创建的 Arcade 表达式与任何其他可用的属性字段一样被列出。 借助您之前为其提供的有意义的名称,可以轻松地找到该表达式。
- 添加的表达式具有唯一标识符 {expression/expr1}。
- 单击确定。
弹出窗口预览将更新为包含您之前配置的自定义 Arcade 表达式。
您将在地图上打开特定发电厂的弹出窗口以查看 Arcade 表达式的显示效果。
- 在地图的垂直工具栏上,单击搜索按钮。
- 在搜索框中,输入 Kitzingen, Bayern, Germany,然后按 Enter 键。
地图随即缩放到德国的基青根县。
- 单击基青根标注西侧的发电厂。 因为该发电厂为太阳能发电设施,所以已符号化为浅绿色。
弹出窗口将打开并显示您创建的消息。 此句子包含发电厂一年可以供电的 60 瓦灯泡数量:146,258。
- 关闭弹出窗口。
您已成功创建 Arcade 表达式,并将其显示在 Global Power Plants 图层的弹出窗口中。 但是,您仍然没有考虑特殊情况,即当发电厂的 estimated_generation_gwh 字段不包含值时。 您将在下一部分执行该操作。
测试缺失数据的特殊情况
现在,您将处理属性数据缺失时的情况。 首先,您将查看弹出窗口在此情况下的外观。
- 单击搜索按钮。 在搜索框中输入 Antananarivo, Analamanga, Madagascar,然后按 Enter 键。
地图将放大到马达加斯加的塔那那利佛市。
- 单击塔那那利佛标注西北部的发电厂。 因为该发电厂为石油发电设施,所以已符号化为红色。
弹出窗口将打开并显示您创建的消息。 但是,显示的 60 瓦灯泡数量为 0。
这可能令人误解,该发电厂一年的估计发电量不是 0 gWh,而是没有年发电量数据。 在这种情况下,最好有一个不同的消息,明确表示没有可用数据。 您将返回到 Arcade 表达式以实现这一更准确的行为。
- 关闭弹出窗口。
- 在图层窗格中,确认已选择 Global Power Plants 图层。
- 在设置工具栏中,单击弹出窗口。 在弹出窗口配置窗格中,单击属性表达式。
- 单击 Estimated Annual Generation in Lightbulbs 表达式以将其在编辑器窗口中打开。
- 在编辑器窗口中,单击运行按钮以验证是否得到与弹出窗口中相同的行为。
在输出选项卡中,值包含与弹出窗口中相同的句子,容易令人误解的 0 个灯泡。
注:
请记住,默认情况下,Arcade 编辑器将使用图层中的第一个发电厂,Kajaki Hydroelectric Power Plant Afghanistan,您在之前看到,此发电厂的 estimated_generation_gwh 字段不包含值。
添加代码以处理缺失数据
现在,您将向表达式中添加代码,以便更好地处理缺失数据的情况。
为了更好地处理缺失数据的情况,Arcade 表达式需要测试 estimated_generation_gwh 字段的值是否为空。
- 如果值为空,您将返回一条关于数据缺失的消息。
- 如果值不为空,您将继续构建关于 60 瓦灯泡的消息。
您将再次使用 IsEmpty 函数。 您要将测试结果存储在新变量 generationCheck 中。 您希望尽快执行测试,因此需将代码添加到读取 estimated_generation_gwh 字段值之后。
- 在表达式窗口中,在以 var annualGenerationGwh 开头的行后面新增一行。
- 键入 var generationCheck = 。
- 单击函数选项卡,然后搜索 IsEmpty 函数。
- 单击 IsEmpty 函数以将其添加到代码行。
- 在函数选项卡上,单击 IsEmpty 函数旁的箭头以了解其工作原理。
IsEmpty 可接收一个参数(在本例中,它将评估 estimated_generation_gwh 字段)。 如果值为 null 或空字符串,则函数返回 true;否则,返回 false。 您需将 IsEmpty 的输出存储在一个变量中,然后评估该变量以检查其为真还是假。
- 查看 isEmpty 的相关信息后,单击函数旁的返回箭头。
- 在表达式窗口中,使用 annualGenerationGwh 替换占位符文本 value。 整行应如下所示:
var generationCheck = isEmpty(annualGenerationGwh)
接下来,您将添加代码以根据 generationCheck 变量的值来决定要执行的操作。 为此,您将使用 if 语句(也称为条件语句)。 此语句的语法为 if(条件为真){执行某操作}。 您可以在 ArcGIS Arcade 结构和逻辑中了解有关条件语句的详细信息。
- 在以 var generationCheck 开头的行后面新增一行。
- 在新行中,键入 if (generationCheck) {。 按 Enter 键。 跳过一行并添加未缩进的右括号 }。
注:
由于 generationCheck 变量包含 true 或 false,实际上您在询问 Arcade if(true) 或 if(false)。 仅当 generationCheck 为 true 时,才会执行括号内的指示。
现在,您将编写代码,以在 estimated_generation_gwh 为空时执行所需操作。 您将在括号之间创建要显示的消息。 与之前相似,您将使用一个模板文本并将其存储在一个新变量中。
- 在括号之间键入或复制粘贴以下文本(全部位于一行):
var noGenerationTL = `${ plantName } does not have estimated annual generation data. Unable to return electricity generation in 60w incandescent light bulbs.`
表达式使用之前代码中设置的 plantName 变量。
最后,您将添加 return 语句以返回该消息。
- 在右括号上方新增一行,然后键入 return noGenerationTL。
- 单击运行以测试您的脚本。
此次,消息没有误导性地提示 0 个灯泡。 而是说明 Kajaki Hydroelectric Power Plant Afghanistan 发电站数据缺失。
注:
重要的是要理解当 Arcade 执行 return 语句时,会认为这是代码执行过程的结尾并忽略该语句下方的任何其余代码。 这是您需要的行为,因为其余代码仅适用于具有估计年发电量数据的要素。
使用 console 语句执行更多测试
作为在 Arcade 表达式编辑器窗口中的最后一项任务,您现在将学习一种不同的方法来测试 Arcade 表达式。 目前为止,您已使用 return 语句查看了脚本的输出。 但是,在某些情况下,您可能还希望可视化整个代码中变量的值。 要查看这些信息,您可以使用将感兴趣变量的值写入控制台选项卡的 console 语句。 例如,您可能希望查看变量 generationCheck 的值。
- 在表达式窗口中,在以 var generationCheck 开头的行后面新增一行。
- 在新行中,键入 console("generationCheck value:", generationCheck)。
第一个参数提供了您要记录到控制台的对象的一些解释。 第二个参数是对象本身。
- 单击运行按钮。
输出选项卡看起来与之前相同,显示 Arcade 表达式的最终结果。
- 切换到控制台选项卡以查看记录到控制台的变量值。
变量 generationCheck 中保留的值为 true,因为 estimated_generation_gwh 的值为空。
- 对 $feature["estimated_generation_gwh"] 尝试其他示例值,并针对每个示例值测试表达式,查看输出和控制台选项卡。 包括为 generationCheck 生成 true 或 false 值的示例。
注:
您可以根据需要添加任意数量的 console 语句,以帮助您开发和调试 Arcade 表达式。 但是,建议您在完成表达式后移除或注释掉这些语句。
由于这行代码用于测试,因此您现在需要注释掉 console 语句。
- 在 console 语句开头,键入 //。
console 语句现在是一个注释,不再作为命令运行。
以下显示了最终表达式的外观。 已添加注释来描述每个步骤。
// Calculate the kilowatt-hours (kWh) required to power a // 60w light bulb for a year var yearLightbulbPower = 0.06 * 24 * 365 // Save the power plant name and annual generation to a variable // for later use var plantName = $feature.name var annualGenerationGwh = $feature["estimated_generation_gwh"] // Check if there is a value in the estimated annual generation // attribute field. isEmpty(fieldOrValue) returns true if empty var generationCheck = isEmpty(annualGenerationGwh) // Write to the generationCheck value to the Message tab for // testing purposes (commented out) // console("generationCheck value:", generationCheck) // If there is not annual generation data, return a sentence for use // in the pop-up that informs the user about this. if (generationCheck) { var noGenerationTL = `${ plantName } does not have estimated annual generation data. Unable to return electricity generation in 60w incandescent light bulbs.` return noGenerationTL } // If the annual generation data is present, continue with the remainder of the script. // Convert the annual generation attribute from // gigawatt-hours to kilowatt-hours var annualGenerationKwh = annualGenerationGwh * 1000000 // Compute the annual electricity generation in light bulbs var annualGenInLightbulbs = annualGenerationKwh / yearLightbulbPower // Round the number var annualGenInLightbulbsRounded = Round(annualGenInLightbulbs, 0) // Format the number to add thousand separators var annualGenInLightbulbsText = Text( annualGenInLightbulbsRounded, '###,###,###,###') // Build the sentence for use in the pop-up // (Create a string using a template literal) var popupSentence = `It's estimated that ${ plantName } generates enough electricity to power ${ annualGenInLightbulbsText } 60-watt incandescent light bulbs for a year.` // Return the value return popupSentence
注:
由于处理缺失数据的句子在 if 语句内部,因此可以选择性地将 Arcade 表达式的其余部分包含在 else {<rest of expression>} 中。 但是如您所见,不明确写出 else {} 时,当不满足 if 语句中的条件时,表达式的其余部分将会继续执行。
现在,您将关闭 Arcade 表达式编辑器并测试地图上的弹出窗口。
- 单击完成保存表达式并关闭编辑器窗口。
Mandroseza 的弹出窗口预览现在显示适当的消息。
- 在弹出窗口表达式窗格中,单击返回按钮。 关闭弹出窗口窗格。
- 保存地图。
- 单击地图上的几个发电厂,以检查您的 Arcade 表达式是否正常运行。
注:
您可以搜索和之前相同的两个位置(Kitzingen, Bayern, Germany 和 Antananarivo, Analamanga, Madagascar)。 也可以尝试新位置。
您计算了一个 60 瓦灯泡一年所需的电量以及每个发电厂一年可以供电的 60 瓦灯泡数量。 您将值四舍五入为整数并添加了千位分隔符。 您创建了两个可以返回到弹出窗口的不同语句,一个用于发电厂年发电量数据存在时的场景,另一个用于数据不存在的场景。 然后,您使用 if 语句确保了地图上的发电厂要素显示适当的句子。
在本教程中,您熟悉了 Arcade 表达式编辑器。 使用 Arcade 按照人均用电量对世界各国进行了符号化。 您使用了 Arcade 来了解每个发电厂一年可以供电的 60 瓦灯泡数量,并在弹出窗口中显示结果。 所有 Arcade 代码均动态执行,不影响基础数据。
本教程仅介绍了您使用 Arcade 可以执行的一部分操作。 要了解有关在 Arcade 中标注表达式和计算字段的详细信息,请浏览使用 Arcade FeatureSets 和 Living Atlas 提升弹出窗口和使用 Arcade 将地图中的颜色用于弹出窗口。
您可以在教程库中找到更多教程。