为符号系统设置自定义表达式
可通过 Arcade 脚本语言使用数据中的一个或多个字段编写表达式,用于修改或指定要素符号系统的外观。
表达式可以是单行代码或多行代码。 可以在表达式构建器对话框中创建或导入和修改表达式。 如果要素的属性发生变化,刷新符号系统值,方法为在符号系统窗格的更多下拉菜单中选择刷新值。
将表达式应用于要素图层的符号系统字段
要将表达式应用于要素图层的符号系统字段,执行以下操作:
如有必要,在内容窗格中选择要素图层。
在要素图层选项卡的绘制组中,单击符号系统
打开符号系统窗格(如果尚未打开)。选择主符号系统。
在字段下拉菜单中,单击设置表达式按钮
。在表达式构建器对话框中,执行以下操作:
(可选)为自定义表达式添加标题文本。
在字段下,双击字段名称将其添加至表达式。 如果数据中的字段数较大,单击高级按钮
过滤出列表以查找所需字段。在函数下,查看基于数学、文本和日期的函数库。 单击助手类型按钮
过滤函数列表,然后双击函数将其添加至表达式。在选择字段后,单击插入值下拉菜单浏览至特定值,然后将其添加至表达式。
在表达式下,使用 Arcade 语言语法编写自定义表达式。
注意:
符号化名称包含特殊字符或以数字开头的字段时,Arcade 使用与连接字段语法相同的格式,例如,
$feature['33field']、$feature['acres²']和$feature['st_area(SHAPE)']。单击验证
验证表达式。验证错误消息会在表达式无效时提供指导。 还可以在 ArcGIS Pro 外部单击导入
导入表达式或单击导出
导出表达式。
单击确定设置字段表达式。
符号系统将更新以反映更改。
如果将自定义表达式用于符号系统,则表达式标题将在内容窗格和字段下拉菜单中显示。 如果图层主符号系统保持不变,将保存表达式。
符号系统表达式基础知识
使用表达式定义符号系统时,假设您熟悉 Arcade。 Arcade 在整个 ArcGIS 软件中提供一致的功能。 这包括 ArcGIS Pro、ArcGIS 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;
此示例基于 stationID 和 stationPrice 这两个字段确定结果值。
分类唯一值
可以编写自定义表达式以构建唯一值符号系统,尤其当值正确定义且符号系统跨多个工程使用时。 为唯一值符号系统编写的大多数表达式会将变量分配给类并应用 if-else 或 when 逻辑函数来定义符号类标注。 在下面的示例中,返回的唯一值取决于其是否属于示例数组。
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'
可通过自定义表达式灵活测量和动态调整符号系统比例,尤其当符号不基于模板时。 有关详细信息,请参阅基于比例的符号大小调整。