指定标注文本

标注文本字符串可从一个或多个要素属性中获得。 标注是动态的,随要素属性值的变化而变化。 当开启标注时,最初会基于单个字段来标注要素;例如,在气象地图上,使用日降雨量对气象站进行标注。 要设置基于单个字段的标注,请右键单击内容窗格中的要素类,然后单击标注 启用标注

注:

默认的标注字段为类型为字符串的第一个字段,并且其字段名中包含文本名称(不区分大小写)。 如果任何字段的名称中均不包含该文本,则标注字段则默认为第一个类型为字符串类型的字段,然后默认为第一个类型为整数类型字段,最后默认为第一个类型为任意类型字段。

您可将多个属性字段添加到标注中。 例如,您可同时使用日降雨量和最大风速对气象站进行标注。 无论标注是基于单个属性字段还是多个属性字段,用于确定标注文本的语句均被称为标注表达式。 每个标注类具有其自己的标注表达式。

在标注表达式中,可插入您自己的文本,使它与标注一同显示在地图上。 例如,在气象地图上,您可将缩写测量单位添加到每个标注中(例如,in 为英寸的缩写,MPH 为每小时英里数的缩写)。 您还可在标注表达式中使用 ArcadePython、VBScript 或 JScript 更改文本的显示方式。 例如,可以插入一个函数,以使降雨量值显示在文本的某一行中,使风速值显示在第二行中。

通过使用文本格式化,可以进一步控制文本在地图上的显示方式。 通过文本格式化标签,您可以为标注文本的不同部分指定不同的文本显示属性。

标注表达式

通过高级标注表达式,您能够将任何 ArcadePython、VBScript 或 Jscript 逻辑添加到标注表达式中,包括条件逻辑和循环。 例如,您可生成一种标注形式,标注中的每个单词仅第一个字母是大写,而不必考虑文本字符串在属性字段中的存储方式。 通过使用格式化标签,您还可以使用标注表达式来调整标注格式。 这些是用来更改全部或部分标注外观的特殊字符。 例如,您可以使用粗体格式化标签使第一行在一个堆叠的多行标注中显示为粗体。

提示:
Arcade 表达式可在整个 ArcGIS 平台上使用。 Arcade 表达式可在 Runtime、ArcGIS Pro 以及 ArcGIS Runtime SDK 中运行,而其他语言则不能。

标注表达式可以是简单的单行表达式,也可以是跨多个代码行并使用解析程序的程序设计逻辑的更为复杂的表达式。 Arcade 默认启用复杂表达式。 当使用 Python、VBScript 或 JScript 时,必须选中高级复选框,并且必须将代码包含在函数中以启用多行表达式。

如果数据中包含编码值描述,则可以使用使用编码值描述选项在标注而非编码中显示这些描述。

字段值自动转换为文本字符串。 如果想要使用算数运算中的数值或进行比较时,必须将其转换回数值数据类型。

注:

NULL 值不会转换为文本字符串。 它们将作为 NULL 传递到表达式。

使用 Arcade 时,字段值将保留其数据类型。

下面的实例添加了两个整型字段:

Arcade
$feature.FIELD1 + $feature.FIELD2
Python
int([FIELD1]) + int([FIELD2])
VBScript
cint([FIELD1]) + cint([FIELD2])
JScript
parseInt([FIELD1]) + parseInt([FIELD2])

其他 Maplex 标注引擎 选项

Maplex 标注引擎 提供了控制标注中使用的空白区这一附加功能。

使用移除多余空格选项可移除标注文本中的附加空格字符。 这些额外空格包括所有前导空格、后导空格和内部空格字符。 如果此选项不可用,这些空格将用于格式调整,例如,允许在堆叠标注中缩进文本。

使用移除多余换行符选项可移除标注文本中的附加换行符。 如果此选项不可用,则可在堆叠标注中使用多行间距。

写入标注表达式

要写入标注表达式,请完成以下步骤:

  1. 右键单击内容窗格中的图层,然后单击标注属性 标注属性

    标注分类窗格随即显示。

  2. 语言菜单中选择一种语言。
  3. 键入 ArcadePython、VBScript 或 JScript 表达式。 您也可以创建一个表达式,方法是双击字段将其添加到表达式中,或选择该字段,单击右键并选择追加以将该字段追加到单击的位置,并用空格隔开。 双击所提供的文本函数将其添加到表达式。

    使用 Python、VBScript 和 JScript 时,字段用方括号 [ ] 括起来,无需考虑图层数据源的数据类型。 Arcade 使用不同的方法指定字段。

    字段语法
    $feature.fieldname
    连接字段语法
    $feature['tablename.fieldname']
    编码值属性域字段语法
    DomainName($feature, 'fieldname')

    警告:

    使用 Arcade 时,请勿使用与字段名称相同的变量名称。 在这种情况下,不会创建标注。

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

    (可选)在表达式框中输入 ArcGIS Pro 文本格式化标签,将格式设置应用到一部分标注文本上。

    注:

    使用 Arcade 时,图层上的字段格式不会转移到标注中。 必须使用 Arcade 格式化方法。

    如果表达式要跨多个代码行,请选中高级复选框,然后输入标注表达式。 当使用 Arcade 时,这不是必需的。

  4. 单击验证以确保没有语法错误,然后单击应用

    如果存在语法错误,则将在错误中引用行号和原因。 要查看这些数字,请右键单击标注表达式输入框,然后选择显示行号

    可同时将常规和高级的标注表达式导出为标注表达式文件 (.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 查询(而不是通过标注表达式)的方式进行。