为符号系统设置自定义表达式

可通过 Arcade 脚本语言使用数据中的一个或多个字段编写表达式,用于修改或指定要素符号系统的外观。

表达式可以是单行代码或多行代码。 可以在表达式构建器对话框中创建或导入和修改表达式。 如果要素的属性发生变化,刷新符号系统值,方法为在符号系统窗格的更多下拉菜单中选择刷新值

注:

单一符号图表符号系统不支持使用 Arcade 表达式。

将表达式应用于要素图层的符号系统字段

要将表达式应用于要素图层的符号系统字段,执行以下操作:

  1. 如有必要,在内容窗格中选择要素图层。
  2. 要素图层选项卡的绘制组中,单击符号系统 符号系统 打开符号系统窗格(如果尚未打开)。
  3. 选择主符号系统
  4. 字段下拉菜单中,单击设置表达式按钮 设置表达式
  5. 表达式构建器对话框中,执行以下操作:
    1. (可选)为自定义表达式添加标题文本。
    2. 字段下,双击字段名称将其添加至表达式。 如果数据中的字段数较大,单击高级按钮 Advanced 过滤出列表以查找所需字段。
    3. 函数下,查看基于数学、文本和日期的函数库。 单击助手类型按钮 Helper Type 过滤函数列表,然后双击函数将其添加至表达式。
    4. 在选择字段后,单击插入值下拉菜单浏览至特定值,然后将其添加至表达式。
    5. 表达式下,使用 Arcade 语言语法编写自定义表达式。
      警告:

      符号化名称包含特殊字符或以数字开头的字段时,Arcade 使用与连接字段语法相同的格式,例如,$feature['33field']$feature['acres²']$feature['st_area(SHAPE)']

    6. 单击验证 验证 验证表达式。

      验证错误消息会在表达式无效时提供指导。 还可以在 ArcGIS Pro 外部单击导入 Import 导入表达式或单击导出 导出 导出表达式。

  6. 单击确定设置字段表达式。

    符号系统将更新以反映更改。

如果将自定义表达式用于符号系统,则表达式标题将在内容窗格和字段下拉菜单中显示。 如果图层主符号系统保持不变,将保存表达式。

符号系统表达式基础知识

使用表达式定义符号系统时,假设您熟悉 ArcadeArcade 在整个 ArcGIS 软件中提供一致的功能。 这包括 ArcGIS ProArcGIS API for JavaScript 和其他相关应用程序。

符号系统 Arcade 表达式使用可视化配置文件。 每个配置文件包含一组已定义全局(配置文件)变量。 这将为表达式的变量和返回值提供上下文。 拉伸表达式还使用可视化配置文件。 有关详细信息,请参阅可视化

简单表达式包含字段值定义和数学运算。 例如,可以使用 $feature 全局变量引用要素图层属性表中的字段,例如 2020 年某区域的人口,然后减去 2010 年人口总数以确定差值。 将返回表达式的结果值,然后将其用于确定要素的符号。

$feature.2020POP - $feature.2010POP

更复杂的表达式可以使用变量并横跨多行代码。 例如,可以设置变量来表示当前时间和字段中表示的日期之间的差值。

var days_from_today = DateDiff(Now(), date_field, “days”);

可视化配置文件变量

通过符号系统窗格访问的表达式构建器对话框将独占使用 Arcade 以在地图、工程和其他应用程序之间提供一致性。 有关其他信息,请参阅 Arcade 文档

  • Arcade 全局文档 $view.scale 会参考视图(地图、场景或布局)的当前比例。 如果将变量设置为 $view.scale 作为符号系统表达式的一部分,符号系统可根据视图的当前比例进行变化。 下面是一个介绍性示例。

    var mapscale = $view.scale;
    var weight = $feature.STROKEWGHT;
    var size;
    var normal = 1000000;
    
    size = normal/mapscale*weight
    return size

    在此表达式中,创建的 mapscale 变量用于存储比例值。 表达式会将比例乘以根据 STROKEWGHT 字段中的值获得的笔划 weight,然后将此乘积除以自定义值 normal。 当您放大和缩小视图时,结果将更改符号的笔划权重。 这可用于替代符号类缩放

  • 当地图上启用时间滑块时,$view.timeProperties 全局变量允许访问时间滑块设置。 使用变量的表达式应该适应时间滑块未启用的情况。 下面的示例输出以 HasKey 语句开头,检查 $view 中是否存在时间滑块。 如果返回 true,则读取 else 语句。
    if (HasKey($view, 'timeProperties') == false || $view.timeProperties.currentEnd == null)
      return -1
    else
      return (
        DateDiff($view.timeProperties.currentEnd, $view.timeProperties.currentStart, 'days') 
        -
        DateDiff($view.timeProperties.currentEnd, $feature.Date_time, 'days') 
      )
  • $feature 全局变量引用要素图层的符号系统字段。

    提示:

    如果字段名称包含的字符无法使用点标记进行访问,则将名称置于括号内,例如 $feature.["joinKey.fieldName"]

可视化配置文件变量示例

下面的配置文件示例包含如何使用可用变量实现某些类型的符号系统。

创建符号系统类

在大多数情况下,可以手动设置图层以使用分级符号分级色彩符号系统。 但是,如果要引用来自频繁变化的另一个来源的信息(例如,商品的国内平均价格),则每次必须刷新或重置符号系统设置。 为了避免这种情况,可以设置表达式进行计算并将结果用于现有分类方法。

	var stationID = $feature.stationID; //ID number for gas station
var stationPrice = $feature.stationPrice; //Price at gas station
var avgPrice = '4.164' //National average price of gas

var priceDiffUL = Round(avgPrice - stationPrice, 2); //Calculate the difference

return priceDiffUL;

此示例基于 stationIDstationPrice 这两个字段确定结果值。

分类唯一值

可以编写自定义表达式以构建唯一值符号系统,尤其当值正确定义且符号系统跨多个工程使用时。 为唯一值符号系统编写的大多数表达式会将变量分配给类并应用 if-elsewhen 逻辑函数来定义符号类标注。 在下面的示例中,返回的唯一值取决于其是否属于示例数组。

var example_array = [1, 2, 3, 4];
if (IndexOf(example_array, $feature.VALUE) > -1) {
return “Value is 1, 2, 3 or 4”;
} else {
return “Other value”;
}

在另一个示例中,值根据龙卷风改良藤田级数进行分组。 此示例类似于上述基于比例的符号系统示例,但是此表达式不使用 $view.scale 变量。

var WindSpeed = $feature.WINDSPEED
when (
WindSpeed > 261, “F5”,
WindSpeed > 207, “F4”,
WindSpeed > 158, “F3”,
WindSpeed > 113, “F2”,
WindSpeed > 73, “F1”, 
“F0”
)

基于比例的符号系统

在第一个示例中,变量 vs 用于存储当前比例值。 wind 变量用于存储要素的风速值,以确定符号的精确大小。 该值存储为 windSize,随后将根据地图比例调整大小。

var vs = $view.scale
var wind = $feature.WINDSPEED

var windSize = When(
    wind > 136, 24, //Category 5
    wind > 112, 23, //Category 4
    wind > 95, 22, //Category 3
    wind > 82, 21, //Category 2
    wind > 63, 20, //Category 1
    wind > 33, 18, //Tropical Storm
    16) //Tropical Depression

when(
    vs >=37000000, windSize,
    vs >=18500000, 1 + windSize,
    vs >=9300000, 2 + windSize,
    vs >=4700000, 4 + windSize,
    vs >=2000000, 6 + windSize, 8 + windSize)

在第二个示例中,仅当当前比例大于 1:30000 时,才会通过 EXAMPLE 字段符号化要素。

Var scale = $view.scale
var feature = $feature.EXAMPLE
if(scale > 30000 && feature == 10){
return 'Feature equals 10'
}
return 'Feature is not equal to 10'

可通过自定义表达式灵活测量和动态调整符号系统比例,尤其当符号不基于模板时。 有关详细信息,请参阅基于比例的符号大小调整

相关主题