Arcmap高级标注(通过表达式设置颜色/字体/换行等)
python下多字段换行堆叠不同字体颜色显示:
def FindLabel ( [bz], [Id] ):
return "<CLR red='255'><FNT size='20'>"+[bz]+"</FNT></CLR>"+'\n'+"<CLR green='255'><FNT size='16'>"+ [Id] +"</FNT></CLR>"
构建标注表达式
可以使用标注表达式来调整标注的格式。除了插入字符和脚本函数以外,您还可以使用标注表达式中的 ArcGIS 格式化标签。这些是用来更改全部或部分标注外观的特殊字符。例如,您可能使用粗体格式化标签使第一条线在一个堆叠、多行的标注中显示为粗体。
如果未选中标注表达式 对话框上的高级框,则标注表达式将限制为单行代码。如果选中高级框,您可以输入包含编程逻辑并跨多个代码行的函数。
字段值自动转换为文本字符串。因此,如果想要使用算数运算中的数值或要进行比较时,需要将其转换回数值数据类型。下面的实例添加了两个整型字段:
int([FIELD1]) + int([FIELD2])
cint([FIELD1]) + cint([FIELD2])
parseInt([FIELD1]) + parseInt([FIELD2])
步骤:
- 单击标注 工具条上的标注管理器按钮 。
- 单击标注分类列表中的标注分类。
- 单击表达式按钮。
- 选择解析程序菜单中的一种语言。
- 输入 Python、VBScript 或 JScript 表达式。也可以创建一个表达式,方法是双击相应字段,将其添加到表达式中,或选择相应字段并单击追加按钮将该字段追加到表达式的末尾,并用空格隔开。
字段用方括号 [ ] 括起来,无需考虑图层数据源的数据类型。
或者,在表达式框中输入 ArcGIS 文本格式化标签,将格式设置应用到一部分标注文本上。
如果表达式要跨多个代码行,请选中高级复选框,然后输入标注表达式。
- 单击验证以确保没有语法错误。
- 单击每个对话框上的确定。
表达式示例
以下是标注表达式示例:
- 将字符串串联到字段的值上。例如,以下表达式将创建一个标注,其中 PARCELNO 字段值的前面会加上文本 "Parcel no:":
Python
"Parcel no: " + [PARCELNO]
VBScript"Parcel no: " & [PARCELNO]
JScript"Parcel no: " + [PARCELNO]
- 将小数四舍五入至设定的小数数位。例如,以下表达式可将“Area”字段的值四舍五入为保留一个小数位:
Python
round(float([AREA]), 1)
VBScriptRound ([AREA], 1)
JScriptfunction FindLabel ( [AREA] ) { var ss; var num= parseFloat([AREA]); ss = num.toFixed(1); return (ss); }
- 将文本注记全部转换为大写形式或小写形式。例如,以下表达式可将“Name”字段中的文本全部转换为小写形式:
Python
def FindLabel ( [NAME] ): S = [NAME] S = S.lower() return S
VBScriptLCase ([NAME])
JScript[NAME].toLowerCase()
- 将标注文本转换为正确的大小写形式。例如,以下表达式会处理全部以大写字母显示的“Name”字段并将其转换为正确的大小写形式:
Python
def FindLabel ( [NAME] ): S = [NAME] S = S.title() return S
VBScriptFunction FindLabel ( [NAME] ) FindLabel = UCase(Left([NAME],1)) & LCase(Right([NAME], Len([NAME]) -1)) End Function
JScriptfunction 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; }
- 创建堆叠文本。例如,以下表达式创建一个标注,该标注中的“名字”字段和两个地址字段都在单独的行上:
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]
- 创建基于某字段文本的堆叠文本。例如,以下表达式用逗号来指定堆叠之处:
Python
def FindLabel ( [LABELFIELD] ): S = [LABELFIELD] S = S.replace(', ', '\n') return S
VBScriptFunction FindLabel ( [LABELFIELD] ) FindLabel = replace([LABELFIELD], ", ", vbnewline) End Function
JScriptfunction FindLabel ( [LABELFIELD] ) { var r, re; var str = [LABELFIELD]; re = /,/g; r = str.replace(re, "\r"); return r; }
- 格式化标注。例如,以下表达式将以货币格式显示标注:
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])
JScriptfunction 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); }
指定 if-else 条件语句。如果城市人口等于或超过 25 万,这些函数会用大的红色字体标注该城市名称,如果城市人口少于 25 万,则用默认标注字体标注该城市名称:
def FindLabel ( [NAME], [POPULATION] ):
if long([POPULATION]) >= 250000:
return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
else:
return [NAME]
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
function FindLabel ( [NAME], [POPULATION] )
{
if (parseFloat([POPULATION]) >= 250000){
return ("<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>");
}
else
return ([NAME]);
}
使用文本格式化标签
ArcGIS 文本格式化标签可用于修改部分文本的格式。这样,您就可以创建具有混合格式的文本,例如,为句子中的一个词语添加下划线。在 ArcMap 中,地图中或地图周围任何放置文本的位置几乎都可以使用文本格式化标签。也就是说,在任何可以指定文本字符串和文本符号的位置都可以使用标签。例如,您可以在动态标注表达式、 注记、 图例文本、 地图标题以及用于标注要素的字段值中使用标签。ArcMap 的内容列表、表 窗口、或识别结果 窗口并不对标签进行解析,因此,在这些窗口中,添加到字段值的标签将显示为纯文本。
请查看 ArcMap 中可用的文本格式化标签列表以获取详细信息。
动态文本是另一种类型的格式化标签,可根据图形文本各个属性的当前值动态更改图形文本。它仅用于布局视图。动态文本标签可以和文本格式化标签一起使用,从而在页面布局上创建动态混合格式文本。
格式化标签语法
格式化标签具有不同的语法,这取决于是在注记还是在标注表达式中使用它们。在注记中,标签直接与文本字符串串联而不使用任何特殊字符:
<BOL>Text</BOL>
在标注表达式中,格式化标签必须用双引号括起并使用 & 运算符将其串连到表达式的其他部分:
"<BOL>" & "Text" & "</BOL>"
"<BOL>" & [LABELFIELD] & "</BOL>"
以下语法规则适用于 ArcMap 中的格式化标签:
- ArcMap 文本格式化标签遵守 XML 语法规则。每个起始标签必须有对应的结束标签。标签可以嵌套,但必须先结束内部标签,然后再结束外部标签:
注记
<BOL><UND>Text</UND></BOL>
标注表达式"<BOL><UND>" & [LABELFIELD] & "</UND></BOL>"
- 标签属性可使用单引号或双引号括起。以下语句是等效的:
注记
<FNT name='Arial' size='18'>My text</FNT> <FNT name="Arial" size="18">My text</FNT>
标注表达式"<FNT name=""Arial"" size=""18"">" & [LABELFIELD] & "</FNT>" "<FNT name='Arial' size='18'>" & [LABELFIELD] & "</FNT>"
- 标签对的大小写必须完全一致。所以,<BOL>...</BOL> 是有效的,<bol>...</bol> 也有效,而 <Bol>...</bol> 是无效的。
- 解析程序将忽略任何无法识别的对应标签对。例如,尽管 <notag> 不是 ArcGIS 的有效格式化标签,但以下字符串是有效的,并且可以正确显示:
注记
<notag><BOL>State College<BOL></notag>
标注表达式"<notag><BOL>" & "State College" & "<BOL></notag>"
- “与”号 (&) 和尖括号 (<) 为特殊字符,在使用格式化标签时,不能在文本中使用这些字符。可改用相应的字符代码 & 和 <。
注记
不要使用 <ITA>John & Paul</ITA>,而应该使用:
<ITA>John & Paul</ITA>
标注表达式此表达式显示位于 < > 字符之间的标注字段的值:
"<ITA><" & [LABELFIELD] & "></ITA>"
标注表达式如果标注字段值中嵌入了特殊字符,您可以使用一个简单的标注脚本动态替换这些特殊字符:
Function FindLabel ([LABELFIELD]) NewString = Replace([LABELFIELD],"&","&") FindLabel = "<ITA>" & NewString & "</ITA>" End Function
- 地图中的每段文本都包含一个绘制时使用的符号。格式化标签的工作原理是:临时修改该基础文本符号并按照标签中指定的格式化设置绘制文本的指定部分。绘图 工具条和符号选择器 中的按钮和命令始终反映所选文本段的基础文本符号的属性,不会反映使用格式化标签所做的修改。例如,如果使用 <FNT> 标签更改某段文本的字体,则在地图中选中该文本时,绘图 工具条中的字体菜单不会反映此更改,它会显示文本基础符号的字体。
- 如果标签只是重复基础文本符号的现有属性,则标签对文本段不起作用。一般说来,这种行为很好理解;例如,如果文本字符串中包含一个 <BOL> 标签,但基础文本符号已经为粗体,此时字符串中的 <BOL> 标签将不起作用。此外,由于标签遵守 XML 规则,因此尝试使用 </BOL> 标签“关闭”基础文本符号的粗体属性为非法操作。但可以使用 <_BOL> 标签进行此操作。
注记
This is bold if the base text symbol is bold <_BOL>, but this is not: </_BOL>
标注表达式"This is bold if the base text symbol is bold<_BOL>, but this is not: </_BOL>"
构建标注表达式的其他提示
以下提示将有助于构建标注表达式:
- 要检查包含文本格式化标签的表达式是否有效,请单击检验按钮或应用更改并在地图中查看标注。如果格式化标签或语法无效,则标签会在检验 窗口和地图标注中显示为纯文本。
- 标签的解析不是由 Python/VBScript/JScript 来完成,而是作为纯文本传递到 ArcMap 框架,从而在绘制时动态设置格式。对于包含在加引号的字符串中的标签,不必再加引号:
"Current <BOL>status</BOL> of parcel: " & [LABELFIELD]
- 无论是否使用标注表达式,您都可以将格式化标签嵌入到用于标注图层要素的字段值中。这样一来,对于标注字段中的特定值,您可以更改其任意部分的格式。只有字符串类型的标注字段支持嵌入格式化标签。字段值中使用的标签和标签属性不必用引号括起,因此以下标签字段值有效:
<ITA>Rochester</ITA> <FNT size='14'>C</FNT>olorado
可在 ArcMap 中使用的格式化标签
ArcGIS 文本格式化标签可用于修改部分文本的格式。这样,您就可以创建具有混合格式的文本,例如,为句子中的一个词语加下划线。在 ArcMap 中,地图中或地图周围任何放置文本的位置几乎都可以使用文本格式化标签。也就是说,在任何可以指定文本字符串和文本符号的位置都可以使用标签。例如,您可以在动态标注表达式、 注记、 图例文本、 地图标题、 动态文本以及用于标注要素的字段值中使用标签。
ArcMap 支持以下格式化元素和标签。该表提供了注记和标注的语法示例。注记语法适用于数据框和页面布局中所使用的所有文本,以及用于标注要素和注记的字段值。标记语法适用于动态的标注表达式。在所有标注语法示例中,格式化文本均可使用标注字段进行替代。
有关其他语法示例,请参阅使用文本格式化标签。
可在 ArcMap 中使用的格式化标签元素描述
起始标签
结束标签
有效的属性/值
注
示例语法
示例输出
字体名称和/或字号
<FNT>
</FNT>
name = {TrueType font} size = {1} scale = {1-}
设置名称、大小和比例,或全部设置。
注记
<FNT name = "Arial" size = "12">Text size = 12</FNT> <FNT name = "Arial" scale="200">Text scale = 200</FNT>
标注
"<FNT name = 'Arial' size = '12'>" & "Text size = 12" & "</FNT>" & "<FNT name = 'Arial' scale='200'>" & "Text scale = 200" & "</FNT>"
颜色 (RGB)
<CLR>
</CLR>
red, green, blue = {0-255}
缺失的颜色属性假定为 0
注记
<CLR red = "255">Text</CLR>
标注
"<CLR red = '255'>" & "Text" & "</CLR>"
颜色 (CMYK)
<CLR>
</CLR>
cyan, magenta, yellow, black = {0-100}
缺失的颜色属性假定为 0
注记
<CLR magenta = "100">Text</CLR>
标注
"<CLR magenta = '100'>" & "Text" & "</CLR>"
粗体
<BOL>
</BOL>
无
注记
<BOL>Text</BOL>
标注
"<BOL>" & "Text" & "</BOL>"
斜体
<ITA>
</ITA>
无
注记
<ITA>Text</ITA>
标注
"<ITA>" & "Text" & "</ITA>"
下划线
<UND>
</UND>
无
注记
<UND>Text</UND>
标注
"<UND>" & "Text" & "</UND>"
全部大写
<ACP>
</ACP>
无
注记
<ACP>Text</ACP>
标注
"<ACP>" & "Text" & "</ACP>"
小型大写字母
<SCP>
</SCP>
无
注记
<SCP>Text</SCP>
标注
"<SCP>" & "Text" & "</SCP>"
上标
<SUP>
</SUP>
无
注记
E = mc<SUP>2</SUP>
标注
"E = mc" & "<SUP>" & "2" & "</SUP>"
下标
<SUB>
</SUB>
无
注记
H<SUB>2</SUB>O
标注
"H" & "<SUB>" & "2</SUB>" & "O"
字符间距
<CHR>
</CHR>
spacing = {1-}
表示相对于常规字符间距的调整百分比;0% 表示没有调整。
注记
<CHR spacing = "200">Text</CHR>
标注
"<CHR spacing = '200'>" & "Text" & "</CHR>"
字符宽度
<CHR>
</CHR>
表示相对于常规字符宽度的调整百分比;0% 表示没有调整。
注记
<CHR width="150">Text</CHR>
标注
"<CHR width='150'>" & "Text" & "</CHR>"
词间距
<WRD>
</WRD>
spacing = {1-}
表示词间的间距百分比;100% 表示常规间距。
注记
<WRD spacing = "200">Extra Word Spacing</WRD>
标注
"<WRD spacing = '200'>" & "Extra Word Spacing" & "</WRD>"
行间距
<LIN>
</LIN>
leading = {1-}
表示相对于常规行间距的调整(单位为磅);0 磅表示没有调整。
注记
<LIN leading = "25">Text with a leading value of 25 points</LIN>
标注
"<LIN leading = '25'>" & "Text with a leading value of 25 points" & "</LIN>"
不加粗
<_BOL>
</_BOL>
无
注记
The base text symbol is bold, <_BOL> but this part is not.</_BOL>
标注
"The base text symbol is bold, " & "<_BOL>" & " but this part is not."& "</_BOL>"
不倾斜
<_ITA>
</_ITA>
无
注记
The base text symbol is italic, <_ITA> but this part is not.</_ITA>
标注
"The base text symbol is italic, " & "<_ITA>" & " but this part is not."& "</_ITA>"
不加下划线
<_UND>
</_UND>
无
注记
The base text symbol is underlined, <_UND> but this part is not.</_UND>
标注
"The base text symbol is underlined, " & "<_UND>" & " but this part is not."& "</_UND>"
不加上标
<_SUP>
</_SUP>
无
注记
<SUP><_SUP> This text is regular, but </_SUP> this text is superscript.</SUP>
标注
"<SUP><_SUP>" & "This text is regular, but" & "</_SUP>" & " this text is superscript."& "</SUP>"
不加下标
<_SUB>
</_SUB>
无
注记
<SUB><_SUB>This text is regular, but </_SUB> this text is subscript.</SUB>
标注
"<SUB><_SUB>" & "This text is regular, but" & "</_SUB>" & " this text is subscript."& "</SUB>"