使用 ArcGIS Arcade 从另一个图层访问属性

设置

首先,您将在 Map Viewer 中设置 web 地图并添加一个新的 Arcade 表达式。 您将从一个预先存在的 web 地图开始,其中已经包含一些数据图层和 Arcade 表达式。 您需要将该地图复制到您的 ArcGIS Online 账户,以便您可以开始对其进行编辑并向其添加新元素。

  1. 在 web 浏览器中打开 Global Power Generation and Consumption web 地图。

    该地图将显示在 Map Viewer 中,其中图例窗格处于打开状态。

    初始视图

    图例窗格列出了 2 个图层:

    • Global Power Plants 包含世界各地发电厂的综合清单。
    • World Countries Electricity Consumption 包含有关世界各国家/地区的人口和用电量信息。
    注:

    如果您之前已完成 ArcGIS Arcade 入门教程,则可以改用该教程的结果地图。

  2. 单击登录按钮。

    登录按钮

  3. 登录到您的 ArcGIS 组织帐户
    注:

    如果您没有组织账户,请参阅软件访问权限选项

  4. 内容(深色)工具栏上,单击保存并打开,然后选择另存为

    “另存为”按钮

  5. 保存地图窗口中,对于标题,请在标题末尾添加您的姓名缩写以确保其在您的组织中唯一,然后单击保存

    保存地图窗口

    地图副本随即出现,现在可供您进行编辑。 接下来,您将向地图添加一个新的 Arcade 表达式,以用于 Global Power Plants 图层弹出窗口。

    注:

    ArcGIS Arcade 是一种可移植、轻量级的安全表达式语言,用于动态处理 ArcGIS 中的数据。 与其他编程语言类似,该语言可以执行数学运算、操作文本并评估逻辑语句。 它允许用户通过在 ArcGIS Pro、ArcGIS Runtime、ArcGIS OnlineArcGIS Enterprise 和 ArcGIS API for JavaScript 中创作、共享和执行自定义表达式来操作现有数据并获得新见解。 在 Map Viewer 中,Arcade 在使用弹出窗口和标注中的数据以及设置图层样式时非常有用。 有关 Arcade 的更多课程,请参阅此 Arcade 学习路径

  6. 内容工具栏上,单击图层

    图层按钮

    注:

    默认情况下,侧边工具栏可能只显示工具图标而不是名称。 您可以单击每个工具栏底部的展开按钮查看名称。 教程中的图像来自展开的工具栏。

    随即显示图层窗格。

  7. 图层窗格中,单击 Global Power Plants 图层以将其选中。

    Global Power Plants 图层

  8. 设置(浅色)工具栏中,单击弹出窗口

    配置弹出窗口按钮

    随即显示弹出窗口窗格和弹出窗口的预览。

    弹出窗口示例

    这是沙特阿拉伯 SMN Barka 发电厂的弹出窗口。 其中已包含一些有关此特定发电厂的有意义的信息。 您将在本教程中创建的 Arcade 表达式将在弹出窗口中再添加一段文本。

  9. 关闭弹出窗口。
    注:

    或者,可以打开地图上任何发电厂的弹出窗口。 在地图上,可以使用鼠标滚轮按钮以放大感兴趣区域,例如西班牙塞维利亚。 然后,单击其中一个发电厂点。

  10. 弹出窗口窗格中,单击属性表达式

    单击属性表达式。

    注:

    Global Power Plants 图层中的弹出窗口已存在两个现有表达式。 这些表达式用于确定能源类型的文本颜色,并计算发电厂可供电源的 60 瓦灯泡的数量,两者当前都显示在发电厂弹出窗口中。 借助 Arcade,可以在新表达式中重用全部或部分这些现有表达式。 这是您将在本教程中学习的内容之一。

    随即出现属性表达式窗格。

  11. 属性表达式窗格中,单击添加表达式以打开 Arcade 表达式编辑器。

    “添加表达式”按钮

    Arcade 表达式编辑器随即出现。 您将在此处创建和编辑 Arcade 表达式。 您将首先查看其组件。

    • 表达式窗口用于编写代码。
    • 配置文件变量选项卡提供了预定义变量列表,包括图层要素的属性字段和几何。
    • 函数选项卡列出了所有 Arcade 函数。 您可以单击各函数右侧的信息按钮来访问该函数关于参数、语法和用法的集成帮助。
    • 建议选项卡中,可以通过预定义变量列表来访问图层要素的属性和几何。 它还允许访问来自 web 地图中其他图层的要素,您将在本教程的后面部分执行此操作。
    • 帮助选项卡将打开 Arcade 帮助网页

    Arcade 表达式编辑器概览

    借助 Arcade 表达式编辑器,您还可以在开发表达式时使用运行按钮对其进行测试。

  12. 单击运行

    “运行”按钮

    随即出现输出控制台日志选项卡。 创建表达式后,您可以使用运行按钮来测试表达式的输出。 目前,您还没有编写任何 Arcade 代码,因此这些选项卡包含的内容不多。

    输出、控制台和日志选项卡

    • 输出选项卡将显示表达式的输出。
    • 您还可以将 Console() 函数添加到您的代码中,并在控制台选项卡中查看其值。

初始化变量

接下来,您将开始为 Arcade 表达式编写代码。 将分为三个部分:

  • 首先,您将初始化(创建)多个变量以保存稍后将在 Arcade 表达式中需要的值。
  • 接下来,您将根据 World countries Electricity Consumption 图层创建一个 FeatureSet,以便能够在您的表达式中使用该图层中的属性。
  • 最后,您将使用所有这些数据以获取新信息,从而计算每个发电厂能够供电的居民人数。

在本部分中,您将侧重于初始化和测试变量。

  1. 表达式窗口中,键入(或复制并粘贴)var countryName =

    创建 countryName 变量。

    您将创建第一个变量 countryName,以包含发电厂所在国家/地区的名称。 在 Arcade 中,可以使用语法 Var <variableName> = <someValue> 来设置变量以供稍后在表达式中使用。您将通过获取 Global Power Plants 图层中的相应属性来指定变量的值。

  2. 如有必要,单击配置文件变量选项卡。 通过单击箭头展开 $feature 项目。

    展开 $feature 项目。

    随即显示 Global Power Plants 图层的属性列表。

    注:

    如前所述,当用户单击地图上的特定发电厂并显示该要素的信息性弹出窗口时,将运行此 Arcade 表达式。 通过 $feature 项目,可以访问 Global Power Plants 图层中该特定发电厂要素的数据。 将包含其所有属性和几何。

    这与 $layer 项目不同,该项目将访问图层中的所有要素,而非单个要素。 例如,可以使用 $layer 以获取要素图层中所有要素属性值的平均值。

  3. 在属性列表中,向下滚动并单击 $feature.country_long

    单击 $feature["country_long"]。

    您的第一行代码已完成。

    第一行代码

    该表达式还需要相应变量,用于保存发电厂的名称及其估计年发电量。 您将从预先存在的 Arcade 表达式之一复制现有代码,无需从头开始创建这两个变量。

  4. Enter 键以开始表达式的下一行。

    添加行回车。

  5. 高亮显示以下两行代码,然后按 Ctrl+C 以进行复制。

    var plantName = $feature.name

    var annualGenerationGwh = $feature["estimated_generation_gwh"]

    注:

    您还可以通过右键单击突出显示的文本并选择复制来复制相应行。

  6. 表达式窗口中,按 Ctrl+V 以粘贴代码。 单击行 3,然后按 Backspace 键。

    粘贴变量定义。

    注:

    您还可以通过右键单击插入点并选择粘贴来粘贴相应行。

    您现在将测试这些变量语句以确保其正常运行。 您将从第一个变量开始,通过在代码末尾添加一个 return 语句来执行此操作。

  7. 单击行 3 末尾,按 Enter 键以开始下一行代码并键入 return countryName。 单击运行

    添加 return countryName 行。

    输出窗口中,随即显示脚本的最终输出。 即 return 语句的值,显示 Afghanistan

    “结果”窗口显示了 Afghanistan

    这是因为,出于测试目的,表达式编辑器将使用属性表中的第一个要素。 在本例中,第一个要素是阿富汗的一座发电厂。 您现在将测试第二个变量的值。

  8. 表达式窗口中,将脚本的最后一行编辑为 return plantName。 单击运行

    输出窗口中,随即显示值 Kajaki Hydroelectric Power Plant Afghanistan,即同一默认阿富汗发电厂的名称。

    “结果”窗口显示了 Kajaki Hydroelectric Power Plant Afghanistan

    您现在将测试第三个变量的值。

  9. 表达式窗口中,再次将该行编辑为 return annualGenerationGwh,然后单击运行

    输出窗口中,不会列出任何值并且结果为 Null

    “结果”窗口显示了 Null 结果

    这是因为默认发电厂 Kajaki Hydroelectric Power Plant Afghanistan 没有估计的年度发电数据。 在这种情况下,可以手动指定不同的值以进行测试。

  10. return annualGenerationGwh 一行上方,添加函数 annualGenerationGwh = 10,然后单击运行

    添加一行代码

    输出窗口中,将返回值 10(gigawatt-hours 或 GWh)。 您将在教程的后续部分中使用此测试值

  11. 表达式窗口中,删除行 return annualGenerationGwh,因为您不再需要该行。

    移除 return 语句

    在进一步开发表达式之前,您需要命名并保存该表达式。 命名您创建的任何表达式非常重要,由此可以更轻松地标识并在地图中使用该表达式。

  12. 在编辑器窗口顶部,单击并高亮显示新建表达式,然后删除文本。 键入 Number of Citizens the Power Plant can Supply Annually

    表达式的新标题

  13. 在编辑器窗口底部,单击完成以关闭表达式编辑器。

    表达式随即显示在属性表达式窗格中。

    属性表达式列表

  14. 内容工具栏上,单击保存并打开,然后选择保存以保存您的地图和 Arcade 表达式。

    “保存”按钮

    注:

    建议您定期保存 Arcade 表达式和地图。

从不同的图层获取数据

要在 Global Power Plants 弹出窗口中找到发电厂可为其供电的居民人数,您需要将发电厂的估计年发电量除以发电厂所在国家/地区的人均用电量。

您已在上一部分中获得了第一个数字,并将其存储在 annualGenerationGwh 变量中。 可以根据 World countries Electricity Consumption 图层中的人口和总用电量属性得出第二个数字。 这意味着您需要访问 Global Power Plants 弹出窗口中的 World Countries Electricity Consumption 属性。 您将通过创建 FeatureSet 来完成此操作。

借助 FeatureSet,可以从地图内的任何图层或者从地图外部的要素服务访问要素。 然后,可以根据相关性条件来过滤访问的要素。 在本例中,您将访问 World Countries Electricity Consumption 要素(即,世界所有国家/地区及其属性的列表),并且您将查找当前发电厂所在的一个国家/地区。 例如,对于 Kajaki Hydroelectric Power Plant,您需要在列表中过滤出单个 Afghanistan 要素。 通过这种方式,由于匹配的国家/地区名称属性值,Global Power Plants 要素将连接到相关的 World Countries Electricity Consumption 要素。 在 Arcade 文档中了解有关 FeatureSet 的详细信息。

注:

由于返回大量数据的查询的处理时间,FeatureSets 在处理较大的数据集时可能表现不佳。

您现在将使用 FeatureSetByName 创建 FeatureSet。

注:

FeatureSetByName 是创建 FeatureSet 的多个选项之一。

  1. 属性表达式窗格中,单击 Number of Citizens the Power Plant can Supply Annually 以在 Arcade 表达式编辑器中重新打开该表达式。

    重新打开该表达式。

  2. 表达式窗口的下一个空行中,键入 var countriesGenFset =
  3. 单击配置文件变量选项卡。 通过单击箭头展开 $map 项目。

    展开 $map。

    随即显示地图中包含的所有图层的列表。

  4. 图层下,单击箭头展开 World Countries Electricity Consumption

    展开 World Countries Electricity Consumption 图层。

  5. World Countries Electricity Consumption 下,单击 FeatureSetByName($map, "World Countries Electricity Consumption")

    单击 FeatureSetByName。

    随即将 FeatureSetbyName 函数添加至表达式窗口。 在表达式窗口中,语句如下所示:

    var countriesGenFset = FeatureSetByName($map, "World Countries Electricity Consumption")

    定义 countriesGenFset 变量。

    FeatureSetByName() 将使用 $map 值作为其第一个参数,实质上要在当前地图中查找该图层。 第二个参数是图层本身的名称。 它必须与图层窗格中的图层名称相匹配。

    您现在将向 FeatureSetByName() 函数添加一些可选参数,以使 FeatureSet 定义更加具体。

    注:

    可以指定感兴趣的特定属性以避免加载整个属性表。 例如,在本教程中,您仅对国家/地区的名称、年总用电量和总人口感兴趣。 仅请求所需字段将提高性能,因为需要发送的数据更少。

    您还可以请求在 FeatureSet 中包含几何,以便能够访问每个国家/地区的面。 可以通过布尔值(true 或 false 值)来执行此操作。 在本教程中,您不需要几何,因此可将布尔值设置为 false。 不请求几何也可以提高性能,并且作为一般规则,应该仅在需要时将几何包含在表达式中。

    如果将这些参数留空,则所有属性和几何都会包含在 FeatureSet 中。

    接下来,您将修改 FeatureSetByName() 行,以使 FeatureSet 仅包含所需的三个字段,而不包含几何。

    注:

    由于语句较长,建议您将其分为多行,以提高可读性。 您应该在参数之间添加换行符(在每个逗号之后)。

  6. 对于 FeatureSetByName() 一行,在 "World Countries Electricity Consumption" 后,删除末尾括号并键入逗号。 复制并粘贴以下文本:

    ['COUNTRY', 'Annual_Electricity_Consumption_', 'POP'], false)

    向 FeatureSetByName() 添加参数。

    您将添加一个 return 语句以测试并检查 FeatureSet

  7. 表达式窗口的下一个空行中,键入 return countriesGenFset

    键入 return countriesGenFset。

  8. 单击运行

    输出窗口中,将返回 FeatureSet。 它是 World countries Electricity Consumption 图层中所有要素的集合,仅包含您请求的属性。

    结果显示了 FeatureSet 表

    您现在将使用 Filter() 函数来过滤 FeatureSet 行,其中使用 countryName 变量中存储的值。 Filter() 将接受两个参数:要过滤的图层或 FeatureSet,以及执行过滤的 SQL 表达式。

  9. 表达式窗口中的 return countriesGenFset 语句上方,按 Enter 键以添加新行并键入 var filteredCountryFSet =
  10. 单击功能选项卡,在搜索框中键入 Filter。 在搜索结果中,单击 Filter(features, sqlExpression) 以将其添加到您的语句中。

    Filter 函数

    随即将 Filter() 添加至表达式编辑器,其中包含两个参数占位符:featuressqlExpression

    Filter() 函数随即添加至表达式。

    注:

    函数选项卡上,通过单击函数名称旁边的箭头按钮,可以获取有关任何函数的详细信息。

    单击箭头了解有关函数的详细信息。

  11. 编辑 Filter() 参数占位符以形成以下语句:

    var filteredCountryFSet = Filter(countriesGenFset, 'COUNTRY = @countryName')

    @countryName 中的 @ 表示 countryName 是之前已在表达式中定义的变量。 此 SQL 表达式将查找 FeatureSet 中的所有行,并仅保留 COUNTRY 属性与 countryName 变量(例如,Afghanistan)具有相同值的行。 变量 filteredCountryFSet 将仅包含通过该测试的 FeatureSet 行。

  12. 将 return 语句修改为 return filteredCountryFSet,然后单击运行

    键入 return filteredCountryFSet。

    输出窗口中,该窗口现在仅包含 Afghanistan 行。

    “结果”窗口显示了 Afghanistan 一行

    注:

    还可以通过其他方法来过滤 FeatureSet 中的要素。 如果 FeatureSet 包含要素的几何,则 Arcade 函数 Intersects()Contains() 可以实现将 FeatureSet 中的要素与弹出窗口图层中的要素进行连接的相同最终目标。 对于两个图层不共享公共属性,但图层的要素以有意义的方式在空间相交的情况,这将非常有用。

    即使变量 filteredCountryFset 仅包含一行,它仍然是一个FeatureSet,并且该行被包装成一个表结构。 接下来,您将从表中提取数据,以便您更加轻松地使用该数据。 在 Arcade 中,通常会在这种情况下使用函数 First()。 它将从 FeatureSet 中取出第一个要素并将其返回。

  13. 表达式窗口中,在 return filteredCountryFSet 语句上方添加新行,然后键入 var filteredCountry =

    键入 var filteredCountry =。

  14. 函数选项卡的搜索框中键入 first。 在 FeatureSet 函数下,单击 First(features) -> Feature 将其添加到表达式中。

    单击 First() 函数。

    随即添加具有参数占位符的函数:First(features)

  15. 将参数占位符替换为如下所示:

    var filteredCountry = First(filteredCountryFset)

  16. 将 return 语句修改为 return filteredCountry,然后单击运行

    形成语句 return filteredCountry。

    输出窗口中,数据现在显示为单个要素。

    “结果”窗口显示了单个要素

    您将在接下来的多个 Arcade 表达式语句中使用此数据。

计算发电量

现在,您将使用从 FeatureSet 中提取的信息来计算发电厂可为其供电的居民人数。 然后,您将格式化结果数字。

首先,您将获得发电厂所在国家/地区的年用电量。 此数据存储在 filteredCountry 要素的 Annual_Electricity_Consumption_ 属性字段中。 要在 Arcade 中访问要素的属性,请使用语法 feature["attribute"]feature.attribute

您在之前的测试结果中看到,此属性名为 Annual_Electricity_Consumption_。 但是,另一种查找此信息的方法是在全局窗格中以交互方式浏览字段。

  1. 单击配置文件变量选项卡。 如有必要,请单击返回按钮。 通过单击箭头展开 $map 项目。
  2. 图层组下,单击箭头展开 World Countries Electricity Consumption

    随即显示该图层的属性列表,其中包含 Annual_Electricity_Consumption_ 属性。

    Annual_Electricity_Consumption_ 属性

    确定地标识感兴趣属性的名称后,您将编写语句以将其添加至变量。

  3. 表达式窗口的 return filteredCountry 行上方添加新行,然后键入以下内容:

    var electricityConsumption = filteredCountry.Annual_Electricity_Consumption_

  4. 将 return 语句修改为 return electricityConsumption,然后单击运行

    形成语句 return electricityConsumption。

    输出窗口中,由于测试国家为阿富汗,因此您将看到返回的阿富汗年用电量:5526000000(千瓦时或 kWh)。

    “结果”窗口显示了值 5526000000

    类似地,您将访问存储在 filteredCountry 要素中的人口数据。

    由于您设置了 annualGenerationGwh = 10,因此输出为 0。 必须从代码中删除该值才能基于属性表中的给定值运行。

  5. 删除 annualGenerationGwh = 10 一行,然后单击运行
  6. 表达式窗口中的 return 语句上方添加新行,然后键入 var population = filteredCountry.POP;
  7. 将 return 语句修改为 return population,然后单击运行

    形成语句 return population。

    输出窗口中,您可以看到阿富汗的总人口:37466414

    “结果”窗口显示了值 37466414

    接下来,您将计算人均用电量,即估计的年用电量除以人口。

  8. 表达式窗口中的 return 语句上方添加新行,然后键入以下内容:

    var consumptionPerCapita = electricityConsumption / population

  9. 将 return 语句修改为 return consumptionPerCapita,然后单击运行

    形成语句 return consumptionPerCapita。

    输出窗口中,您可以看到人均用电量为 147.4920978559624 (kWh)。

    “结果”窗口显示了值 147.4920978559624

    要获得发电厂每年可供电的估计居民人数,您需要将发电厂的估计年发电量数据(通过乘以 1000000 从 gWh 转换为 kWh)除以您刚刚计算的国家/地区的人均用电量(以 kWh 为单位)。

    相应的公式将为 annualGenerationGwh * 1000000) / consumptionPerCapita

    然后,您将使用 Round() 函数以返回一个整数,而非小数,因为人们应该用整数表示。

  10. 表达式窗口中的 return 语句上方添加新行,然后键入 var numCitizensAnnually =
  11. 函数选项卡上,搜索 Round 函数,然后单击该函数以将其插入到您的语句中。

    随即添加具有参数占位符的函数:Round(value, )。 您将插入上述公式来代替 value

  12. 对于 Round 函数,在括号中将 value 替换为 (annualGenerationGwh * 1000000) / consumptionPerCapita

    第二个 Round() 参数 numPlaces 指示要将数字四舍五入到的小数位数。

  13. 在表达式后面键入一个逗号、一个空格和一个 0
  14. 将 return 语句修改为 return numCitizensAnnually,然后单击运行
    注:

    如果结果为 0,请在 var NumCitizensAnnually = Round 行上方添加 annualGenerationGwh = 10

    形成语句 return numCitizensAnnually。

    输出窗口中,您可以看到此公式的结果:67800(居民)。

    “结果”窗口显示了值 67800

    现在,您将使用 Text() 函数来格式化此四舍五入的数字以添加千位分隔符。

  15. 表达式窗口的 return 语句上方添加新行,然后键入 var displayNumCitizensAnnually = 并添加一个空格。
  16. 单击函数选项卡,搜索 Text 函数,然后单击该函数以将其插入到您的语句中。

    文本函数

    随即添加具有参数占位符的函数:value

  17. value 替换为 numCitizensAnnually 并在后面键入 , '###,###,###' 以容纳最多 9 位数的值。
  18. 将 return 语句修改为 return displayNumCitizensAnnually,然后单击运行

    形成语句 return displayNumCitizensAnnually。

    结果窗口中,67800 将变为 67,800,即您的目标格式。

    “结果”窗口显示了值 67,800

    Kajaki Hydroelectric Power Plant Afghanistan 发电厂每年可为大约 67,800 位阿富汗居民供电。

    计算发电厂每年可供电的估计居民人数后,您需要在一个将显示在弹出窗口中的语句中返回该值。 要执行此操作,您将使用模板文本并合并一些更多的文本格式。 模板文本由反引号 (`) 分隔,并使用语法 ${variableName} 将变量或表达式插入到字符串中。 这意味着返回的语句将有所不同,具体取决于地图中每个发电厂的变量值。

  19. 表达式窗口中的 return 语句上方添加新行,然后复制粘贴以下行:

    var dataTL = `On average, a citizen in ${ countryName } consumes ${ text(round(consumptionPerCapita, 0), '###,###,###,###') } kilowatt-hours of electricity per year. ${ plantName } supplies electricity for ${ displayNumCitizensAnnually } citizens in ${ countryName } annually.`

    注:

    您不应添加换行符,因为它们将显示在输出中。

  20. 将 return 语句修改为 return dataTL,然后单击运行

    形成语句 return dataTL。

    输出窗口中,您可以看到输出语句,其中变量已替换为其估计值。

    “结果”窗口显示了输出语句

管理缺失值

您的 Arcade 表达式基本准备就绪。 但是,您仍然需要解决某些属性值缺失的异常情况。 存在三种重要的情况:

  • 发电厂要素可能没有估计的年度发电数据。
  • Global Power Plants 图层中的电厂要素可能会涉及 World countries Electricity Consumption 图层中不存在的国家/地区。
  • World countries Electricity Consumption 图层中的国家/地区可能没有用电量数据。

首先,您将解决发电厂没有估计年度发电数据的情况。 您在教程的先前部分中已遇到此案例,其中包含测试发电厂要素 Kajaki Hydroelectric Power Plant Afghanistan。 您将重用已在预先存在的表达式 Estimated Annual Generation in Lightbulbs 中完成的工作来解决这些缺失值。

  1. 单击建议选项卡。 对于 Estimated Annual Generation in Lightbulbs,请单击箭头展开并查看代码预览。
  2. 高亮显示从 var generationCheck 开始并以 return noGenerationTL 后的右大括号结尾的表达式摘录。 按下 Ctrl+C 以进行复制。

    复制 generationCheck 代码。

  3. 表达式窗口中,找到声明 annualGenerationGwh 变量的行并添加新行,然后按 Ctrl+V 以粘贴复制的文本。

    粘贴 generationCheck 代码。

    注:

    // 开头的多行为注释,不会影响表达式的行为。 或者,您也可以将其删除。

    已插入的代码将根据 IsEmpty() 函数的值创建一个布尔变量(true 或 false)。 IsEmpty() 将检查变量是否为空或 null,如果是,则将返回 True。 因此,您需要检查包含估计年发电量字段值的 annualGenerationGwh 变量是否为空。 如果是,则 if 语句将返回一个解释该问题的句子。 可以在 ArcGIS Arcade 入门教程中了解有关刚刚重用的代码的详细信息。

    您将修改模板文本以更好地反映 Arcade 表达式所解决的特定场景。

  4. 在刚刚粘贴的文本中,高亮显示 var noGenerationTL = 后的文本并将其替换为以下文本:

    `${ plantName } does not have estimated annual generation data. Unable to calculate the number of citizens the power plant can supply electricity for annually.`

    要测试此案例,您需要移除已添加至 $feature.estimated_annual_generation 属性的测试值 10

  5. 在代码中找到 annualGenerationGwh = 10 一行并在前面键入 // 以注释。
  6. 单击运行

    结果将显示缺失数据语句,这是有意义的,因为测试要素没有估计的年发电量数据。

    “结果”窗口显示了缺失数据语句

  7. 在代码中,删除 annualGenerationGwh = 10 一行的注释。

    最后,您将处理第三种缺失值的情况:当 World Countries Electricity Consumption 图层中的国家/地区没有用电量数据时。 您将利用以下知识:如果该国家/地区没有估计年用电量数据,则 electricityConsumption 变量将为 null

  8. 表达式窗口中声明 electricityConsumption 变量的行之后,添加新行并键入以下内容:

    if (electricityConsumption == null) {

    var noConsumptionTL = `There is no annual electricity consumption data for ${ countryName }. Unable to calculate the number of citizens the power plant can supply electricity for annually.`

    return noConsumptionTL

    }

    添加 electricityConsumption 测试。

    注:

    使用 IsEmpty() 函数具有相同效果,但使用 == null 将专门测试变量是否为 null。

    为了测试此案例,您将使用吉布提 Boulaos 的示例,World countries Electricity Consumption 图层中没有吉布提的年用电量数据。

  9. 在表达式窗口中单击完成
  10. 在地图中单击搜索按钮,搜索 Djibouti,然后单击 Global Power Plant 点符号以打开弹出窗口。

    Boulaos 发电厂的弹出窗口

    解决各种缺失数据的情况后,您可以确信您的表达式将始终向用户返回有意义的消息。 您的 Arcade 表达式现已完成。

  11. 内容工具栏上,单击保存并打开,然后选择保存以保存您的地图和 Arcade 表达式。

    作为参考,教程中的完整表达式如下。 添加了注释以使读者了解代码的含义。


// Save the country and power plant name to variables for later use
var countryName = $feature["country_long"]

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

// If there is not annual generation data, return a sentence for use
// in the pop-up that informs the user about this.
// The below expression uses conditional logic and a template literal:
if (generationCheck) {
  var noGenerationTL = `${ plantName } does not have estimated annual generation data. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
  return noGenerationTL
}

// If there is average annual generation data, the script continues:
// Create a FeatureSet from the World Countries Electricity Consumption layer
var countriesGenFset = FeatureSetByName($map,
"World Countries Electricity Consumption",
['COUNTRY', 'Annual_Electricity_Consumption_', 'POP'], false)

// Filter the countries feature set. COUNTRY is attribute field in World
// Countries Population and Annual Electricity Consumption
// filteredCountryFset will be a FeatureSet with only one feature,
// because the powerplant country value is only equal to one country
var filteredCountryFset = filter(countriesGenFset,
'COUNTRY = @countryName')

// Select the first country in the filtered FeatureSet
// This essentially changes the data type from FeatureSet to a feature
// because in this case, there is only one feature in each FeatureSet
var filteredCountry = first(filteredCountryFset)

}
// Access the electricity consumption value for the country
// from the countries layer
// Note: bracket [] and . notation are both accepted
var electricityConsumption = filteredCountry.Annual_Electricity_Consumption_;

// Check if there is annual electricity consumption data for the country
// Instead of using isEmpty, we will check if the value is null
// If it isn't, return a sentence indicating this and exit the script
if (electricityConsumption == null) {
  var noConsumptionTL = `There is no annual electricity consumption data for ${ countryName }. Unable to calculate the number of citizens the power plant can supply electricity for annually.`
  return noConsumptionTL
}

// Access the population value for the country from the countries layer
var population = filteredCountry.POP;
// Compute the consumption per capita for that country
var consumptionPerCapita = electricityConsumption / population

// Calculate the number of citizens the plant can supply annually
var numCitizensAnnually = round(
  (annualGenerationGwh * 1000000) /
  (consumptionPerCapita), 0)

// Change the number to text so we can add thousand separators
var displayNumCitizensAnnually = Text(numCitizensAnnually,"###,###,###");

// Use a template literal to return the string we will display
// in the pop-up
var dataTL = `On average, a citizen in ${ countryName } consumes ${ text(round(consumptionPerCapita, 0), '###,###,###,###') } kilowatt-hours of electricity per year. ${ plantName } supplies electricity for ${ displayNumCitizensAnnually } citizens in ${ countryName } annually.`
return dataTL

在弹出窗口中显示结果

Arcade 表达式完成后,即可用于 Global Power Plants 图层弹出窗口的文本中。

  1. 图层窗格中,确保已选择 Global Power Plants 图层。
  2. 属性表达式窗格中,单击返回按钮。

    “返回”按钮

  3. 弹出窗口窗格底部,单击文本,然后单击编辑文本

    “编辑文本”按钮

    弹出窗口文本编辑器窗口随即打开,其中显示了当前在 Global Power Plants 图层中显示的文本。 您要将 Arcade 表达式的结果添加到现有文本。

  4. 在弹出文本编辑器中,将光标放置在 {expression/expr1} 的末尾,然后按 Enter 键。
  5. 键入一系列破折号 (-------------------------------) 以在段落之间创建分隔线。 按 Enter 键。

    键入一系列破折号。

  6. 输入单个括号:{.

    可用字段列表和 Arcade 表达式随即显示。

    输入单个括号。

  7. 单击您刚刚创建的表达式 Number of Citizens the Power Plant can Supply Annually

    选择表达式 Number of Citizens the Power Plant can Supply Annually。

    注:

    您可以看到所创建的 Arcade 表达式与任何其他可用的属性字段一样被列出。 借助您之前为其提供的有意义的名称,可以轻松地找到该表达式。

    表达式已使用唯一标识符 {expression/expr2} 添加至文本元素。

    新表达式已添加至文本元素

    注:

    如果您已添加或移除任何其他表达式,则唯一标识符可能会使用不同于 2 的数字,例如 {expression/exp3}

  8. 单击确定以关闭弹出文本编辑器。
  9. 保存地图。

    您现在将测试弹出窗口。

  10. 关闭弹出窗口图层窗格以释放更多地图空间。
  11. 放大至感兴趣区域,例如西班牙塞维利亚。
  12. 单击发电厂以显示弹出窗口。

    最终弹出窗口

    弹出窗口现在显示 Arcade 表达式生成的新文本段落。

  13. 在弹出窗口中,查看有关每位居民的用电量以及发电厂服务的居民人数的信息。
  14. 单击其他发电厂以查看其弹出窗口。

在本教程中,您开发了一个 ArcGIS Arcade 表达式来计算发电厂年供电居民数。 您学习了如何使用 FeatureSetsFilter() 函数访问来自多个图层的数据。 然后,您在一些计算中使用了该数据,解决了多种缺失数据的情况,并在弹出窗口中使用了该表达式。 将动态执行 Arcade 表达式,对底层数据没有任何影响。 本教程仅介绍了您使用 Arcade 可以执行的一部分操作。 有关详细信息,请探索 Arcade 学习路径

您可以在教程库中找到更多教程。