标注文本字符串可从一个或多个要素属性中获得。标注是动态的,随要素属性值的变化而变化。当开启标注时,最初会基于单个字段来标注要素;例如,在气象地图上,使用日降雨量对气象站进行标注。此基于单个字段的标注在标注选项卡上进行设置。
注:
默认的标注字段为类型为字符串的第一个字段,并且其字段名中包含文本名称(不区分大小写)。如果任何字段的名称中均不包含该文本,则标注字段则默认为第一个类型为字符串类型的字段,然后默认为第一个类型为整数类型字段,最后默认为第一个类型为任意类型字段。
您可将多个属性字段添加到标注中。例如,您可同时使用日降雨量和最大风速对气象站进行标注。无论标注是基于单个属性字段还是多个属性字段,用于确定标注文本的语句均被称为标注表达式。每个标注分类都具有自己的标注表达式。
在标注表达式中,可插入您自己的文本,使它与标注一同显示在地图上。例如,在气象地图上,您可将缩写测量单位添加到每个标注中(例如,in 为英寸的缩写,MPH 为每小时英里数的缩写)。您还可在标注表达式中使用 Arcade、Python、VBScript 或 JScript 更改文本的显示方式。例如,您可通过插入某个函数来将降雨量值显示在文本的某一行上,而将风速值显示在另一行上。上面的两个示例都显示在下图中:
您可使用 ArcGIS Pro 文本格式化标签进一步控制文本在地图上的显示方式。通过文本格式化标签,您可以为标注文本的不同部分指定不同的文本显示属性。例如,您可使用斜体的蓝色文本显示降雨量值,使用常规的黑色文本显示风速值,如下图所示:
标注表达式
通过高级标注表达式,您能够将任何 Arcade、Python、VBScript 或 Jscript 逻辑添加到标注表达式中,包括条件逻辑和循环。例如,您可生成一种标注形式,标注中的每个单词仅第一个字母是大写,而不必考虑文本字符串在属性字段中的存储方式。您还可以使用标注表达式来调整使用 ArcGIS Pro 格式化标签的标注格式。这些是用来更改全部或部分标注外观的特殊字符。例如,您可能使用粗体格式化标签使第一行在一个堆叠的多行标注中显示为粗体。
提示:
将在整个 ArcGIS 平台中使用 Arcade 表达式。Arcade 表达式适用于 Runtime、ArcGIS Pro 和 ArcGIS Runtime SDK,而其他语言不适用。标注表达式可以是简单的单行表达式,也可以是跨多个代码行并使用解析程序的程序设计逻辑的更为复杂的表达式。Arcade 默认启用复杂表达式。当使用 Python、VBScript 或 JScript 时,必须选中高级复选框,并且必须将代码包含在函数中以启用多行表达式。
如果数据中包含编码值描述,则可以使用使用编码值描述选项在标注而非编码中显示这些描述。
字段值自动转换为文本字符串。因此,如果想要使用算数运算中的数值或进行比较时,必须将其转换回数值数据类型。
注:
NULL 值不会转换为文本字符串。它们将作为 NULL 传递到表达式。
使用 Arcade 时,字段值将保留其数据类型。
下面的实例添加了两个整型字段:$feature.FIELD1 + $feature.FIELD2
int([FIELD1]) + int([FIELD2])
cint([FIELD1]) + cint([FIELD2])
parseInt([FIELD1]) + parseInt([FIELD2])
其他 Maplex Label Engine 选项
Maplex Label Engine 提供了控制标注中使用的空白区这一附加功能。
使用移除多余空格选项可移除标注文本中的附加空格字符。这些额外空格包括所有前导空格、后导空格和内部空格字符。如果此选项不可用,这些空格将用于格式调整,例如,允许在堆叠标注中缩进文本。
使用移除多余换行符选项可移除标注文本中的附加换行符。如果此选项不可用,则可在堆叠标注中使用多行间距。
写入标注表达式
- 确保按标注列出是显示内容窗格的活动方式。单击按标注列出 。
- 在内容窗格中选择标注分类,然后单击标注选项卡。
- 在标注选项卡上的标注分类组中,单击表达式。
- 从语言菜单中选择一种语言。
- 键入 Arcade、Python、VBScript 或 JScript 表达式。也可以创建一个表达式,方法是双击字段将其添加到表达式中,或选择该字段,右键单击并选择追加将该字段追加到单击的位置,并用空格隔开。双击所提供的文本函数将其添加到表达式。
使用 Python 时,VBScript 和 Jscript 字段用方括号 [ ] 括起来,无论图层数据源的数据类型为何。Arcade 使用其他方式指定字段。
字段语法 $feature.fieldname
连接字段语法 $feature['tablename.fieldname']
编码值属性域字段语法 DomainName($feature, 'fieldname')
提示:
使用 Arcade 时,可使用控制台函数帮助调试标注表达式。当您单击校验 时,如果表达式中包含控制台函数,则会显示查看控制台消息链接。单击此链接以打开控制台消息窗口。使用 Arcade 时,还可以为表达式提供标题。
警告:
使用 Arcade 时,请勿使用与字段名称相同的变量名称。在这种情况下,不会创建标注。
标注字段时,若字段名称包含特殊字符或以数字开头,则 Arcade 使用与连接字段语法相同的格式,例如,$feature['33field']、$feature['acres²']、$feature['st_area(SHAPE)']。
或者,在表达式框中输入 ArcGIS Pro 文本格式化标签,将格式设置应用到一部分标注文本上。
注:
使用 Arcade 时,图层上的字段格式不会转移到标注中。必须使用 Arcade 格式化方法。
如果表达式要跨多个代码行,请选中高级复选框,然后输入标注表达式。当使用 Arcade 时,这不是必需的。
- 单击验证以确保没有语法错误,然后单击应用。
如果存在语法错误,则将在错误中引用行号和原因。要查看这些数字,请右键单击标注表达式输入框,然后选择显示行号。
可同时将常规和高级的标注表达式导出为标注表达式文件 (.lxp),该文件可加载到其他图层或地图中。
表达式示例
以下是标注表达式示例:
- 将字符串串联到字段的值上;例如,以下表达式将创建一个标注,其中 PARCELNO 字段值的前面会加上文本 "Parcel no:":
Arcade "Parcel no: " + $feature.PARCELNO
Python "Parcel no: " + [PARCELNO]
VBScript "Parcel no: " & [PARCELNO]
JScript "Parcel no: " + [PARCELNO]
- 将小数四舍五入至设定的小数数位;例如,以下表达式可将 AREA 字段的值四舍五入为保留一个小数位:
Arcade round(number($feature.AREA), 1)
Python round(float([AREA]), 1)
VBScript Round ([AREA], 1)
JScript function FindLabel ( [AREA] ) { var ss; var num= parseFloat([AREA]); ss = num.toFixed(1); return (ss); }
- 将文本标注全部转换为大写形式或小写形式;例如,以下表达式可将 NAME 字段中的文本全部转换为小写形式:
Arcade lower($feature.NAME)
Python def FindLabel ( [NAME] ): S = [NAME] S = S.lower() return S
VBScript LCase ([NAME])
JScript [NAME].toLowerCase()
- 将文本标注转换为正确的大小写形式;例如,以下表达式会处理以大写形式显示的 NAME 字段并将其转换为正确的大小写形式:
Arcade Proper($feature.NAME, 'firstword')
Python def FindLabel ( [NAME] ): S = [NAME] S = S.title() return S
VBScript Function FindLabel ( [NAME] ) FindLabel = UCase(Left([NAME],1)) & LCase(Right([NAME], Len([NAME]) -1)) End Function
JScript function FindLabel ( [NAME] ) { var str = [NAME]; var iLen = String(str).length; var upper = (str.substring(0,1)).toUpperCase(); var lower = (str.substring(1, iLen)).toLowerCase() return upper + lower; }
- 创建堆叠文本;例如,以下表达式创建一个标注,该标注中的 NAME 字段和两个地址字段都在单独的行上:
Arcade "Name: " + $feature.NAME + TextFormatting.NewLine + $feature.ADDRESS_1 + TextFormatting.NewLine + $feature.ADDRESS_2
Python "Name: " + [NAME] + '\n' + [ADDRESS_1] + '\n' + [ADDRESS_2]
VBScript "Name: " & [NAME] & vbCrLf& [ADDRESS_1] & vbCrLf& [ADDRESS_2]
JScript "Name: " + [NAME] + "\r" + [ADDRESS_1] + "\r" + [ADDRESS_2]
- 创建基于某字段文本的堆叠文本;例如,以下表达式用逗号来指定堆叠之处:
Arcade replace($feature.LABELFIELD, ', ', '\n')
Python def FindLabel ( [LABELFIELD] ): S = [LABELFIELD] S = S.replace(', ', '\n') return S
VBScript Function FindLabel ( [LABELFIELD] ) FindLabel = replace([LABELFIELD], ", ", vbnewline) End Function
JScript function FindLabel ( [LABELFIELD] ) { var r, re; var str = [LABELFIELD]; re = /,/g; r = str.replace(re, "\r"); return r; }
- 格式化标注;例如,以下表达式将以货币格式显示标注:
Arcade "Occupancy Revenue: $" + round($feature.MAXIMUM_OC * $feature.RATE, 2)
Python def FindLabel ( [MAXIMUM_OC], [RATE] ): import locale locale.setlocale(locale.LC_ALL, '') S = locale.currency(float([MAXIMUM_OC]) * float([RATE])) return S
VBScript "Occupancy Revenue: " & FormatCurrency ([MAXIMUM_OC] * [RATE])
JScript function FindLabel ( [MAXIMUM_OC], [RATE] ) { var ss; var num1 = parseFloat([MAXIMUM_OC]); var num2 = parseFloat([RATE]); var num3 = num1 * num2 ss = num3.toFixed(2); return ("$" + ss); }
- 仅将部分字段用于标注;例如,该表达式显示第 3 个到第 5 个字符。
Arcade mid($feature.LABELFIELD, 2, 3)
Python def FindLabel ( [LABELFIELD] ): S = [LABELFIELD] return S[2:5]
VBScript Mid([LABELFIELD], 3, 3)
JScript function FindLabel ( [LABELFIELD] ) { var S; var str = [LABELFIELD]; S = str.substring(2, 5); return S; }
- 指定 if-else 条件语句。如果城市人口等于或超过 25 万,这些函数会用大的红色字体标注该城市名称;如果城市人口少于 25 万,则用默认标注字体标注该城市名称:
Arcade if ($feature.POPULATION >=250000) { return "<CLR red='255'><FNT size = '14'>" + $feature.NAME + "</FNT></CLR>" } else { return $feature.NAME }
Python def FindLabel ( [NAME], [POPULATION] ): if int([POPULATION]) >= 250000: return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>" else: return [NAME]
VBScript Function FindLabel ([NAME], [POPULATION]) if (cLng([POPULATION]) >= 250000) then FindLabel = "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>" else FindLabel = [NAME] end if End Function
JScript function FindLabel ( [NAME], [POPULATION] ) { if (parseFloat([POPULATION]) >= 250000){ return ("<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"); } else return ([NAME]); }
注:
要标注一个基于字段值的要素子集,请以在标注分类中创建 SQL 查询(而不是通过标注表达式)的方式进行。以下是其他资源:
(一些信息并非存放在 Esri 所创建、拥有或维护的网页上。Esri 不能保证这些网页的可用性,也不对网页中的内容负责。)