標注文本字符串可從一個或多個要素屬性中獲得。標注是動態的,隨要素屬性值的變化而變化。當開啟標注時,最初會基於單個字段來標注要素;例如,在氣象地圖上,使用日降雨量對氣象站進行標注。此基於單個字段的標注在標注選項卡上進行設置。
注:
默認的標注字段為類型為字符串的第一個字段,並且其字段名中包含文本名稱(不區分大小寫)。如果任何字段的名稱中均不包含該文本,則標注字段則默認為第一個類型為字符串類型的字段,然后默認為第一個類型為整數類型字段,最后默認為第一個類型為任意類型字段。
您可將多個屬性字段添加到標注中。例如,您可同時使用日降雨量和最大風速對氣象站進行標注。無論標注是基於單個屬性字段還是多個屬性字段,用於確定標注文本的語句均被稱為標注表達式。每個標注分類都具有自己的標注表達式。
在標注表達式中,可插入您自己的文本,使它與標注一同顯示在地圖上。例如,在氣象地圖上,您可將縮寫測量單位添加到每個標注中(例如,in 為英寸的縮寫,MPH 為每小時英里數的縮寫)。您還可在標注表達式中使用 Arcade、Python、VBScript 或 JScript 更改文本的顯示方式。例如,您可通過插入某個函數來將降雨量值顯示在文本的某一行上,而將風速值顯示在另一行上。上面的兩個示例都顯示在下圖中:
您可使用 ArcGIS Pro 文本格式化標簽進一步控制文本在地圖上的顯示方式。通過文本格式化標簽,您可以為標注文本的不同部分指定不同的文本顯示屬性。例如,您可使用斜體的藍色文本顯示降雨量值,使用常規的黑色文本顯示風速值,如下圖所示:
標注表達式
通過高級標注表達式,您能夠將任何 Arcade、Python、VBScript 或 JScript 邏輯添加到標注表達式中,包括條件邏輯和循環。例如,您可生成一種標注形式,標注中的每個單詞僅第一個字母是大寫,而不必考慮文本字符串在屬性字段中的存儲方式。您還可以使用標注表達式來調整使用 ArcGIS Pro 格式化標簽的標注格式。這些是用來更改全部或部分標注外觀的特殊字符。例如,您可能使用粗體格式化標簽使第一行在一個堆疊的多行標注中顯示為粗體。
提示:
Arcade 表達式可在整個 ArcGIS 平台上使用。Arcade 表達式可在 Runtime、 ArcGIS Pro 以及 ArcGIS Runtime SDK 中運行,而其他語言則不能。標注表達式可以是簡單的單行表達式,也可以是跨多個代碼行並使用解析程序的程序設計邏輯的更為復雜的表達式。Arcade 默認啟用復雜表達式。當使用 Python、VBScript 或 JScript 時,必須選中高級復選框,並且必須將代碼包含在函數中以啟用多行表達式。
如果數據中包含編碼值描述,則可以使用使用編碼值描述選項在標注而非編碼中顯示這些描述。
字段值自動轉換為文本字符串。因此,如果想要使用算數運算中的數值或要進行比較時,需要將其轉換回數值數據類型。
注:
使用 Arcade 時,字段值將保留其數據類型。
下面的實例添加了兩個整型字段:
Arcade
$feature.FIELD1 + $feature.FIELD2
Python
int([FIELD1]) + int([FIELD2])
VBScript
cint([FIELD1]) + cint([FIELD2])
JScript
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 使用與連接字段語法相同的格式,例如,$feature['33field']、$feature['acres²']、$feature['st_area(SHAPE)']。
或者,在表達式框中輸入 ArcGIS Pro 文本格式化標簽,將格式設置應用到一部分標注文本上。
注:
使用 Arcade 時,圖層上的字段格式不會轉移到標注中。必須使用 Arcade 格式化方法。
如果表達式要跨多個代碼行,請選中高級復選框,然后輸入標注表達式。當使用 Arcade 時,這不是必需的。
- 單擊驗證以確保沒有語法錯誤,然后單擊應用。
可同時將常規和高級的標注表達式導出為標注表達式文件 (.lxp),該文件可加載到其他圖層或地圖中。
表達式示例
以下是標注表達式示例:
- 將字符串串聯到字段的值上;例如,以下表達式將創建一個標注,其中 PARCELNO 字段值的前面會加上文本 "Parcel no:":Arcade
"Parcel no: " + $feature.PARCELNO
"Parcel no: " + [PARCELNO]
"Parcel no: " & [PARCELNO]
"Parcel no: " + [PARCELNO]
- 將小數四舍五入至設定的小數數位;例如,以下表達式可將 AREA 字段的值四舍五入為保留一個小數位:Arcade
round(number($feature.AREA), 1)
round(float([AREA]), 1)
Round ([AREA], 1)
function FindLabel ( [AREA] ) { var ss; var num= parseFloat([AREA]); ss = num.toFixed(1); return (ss); }
- 將文本標注全部轉換為大寫形式或小寫形式;例如,以下表達式可將 NAME 字段中的文本全部轉換為小寫形式:Arcade
lower($feature.NAME)
def FindLabel ( [NAME] ): S = [NAME] S = S.lower() return S
LCase ([NAME])
[NAME].toLowerCase()
- 將文本標注轉換為正確的大小寫形式;例如,以下表達式會處理以大寫形式顯示的 NAME 字段並將其轉換為正確的大小寫形式:Arcade
Proper($feature.NAME, 'firstword')
def FindLabel ( [NAME] ): S = [NAME] S = S.title() return S
Function FindLabel ( [NAME] ) FindLabel = UCase(Left([NAME],1)) & LCase(Right([NAME], Len([NAME]) -1)) End Function
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
"Name: " + [NAME] + '\n' + [ADDRESS_1] + '\n' + [ADDRESS_2]
"Name: " & [NAME] & vbCrLf& [ADDRESS_1] & vbCrLf& [ADDRESS_2]
"Name: " + [NAME] + "\r" + [ADDRESS_1] + "\r" + [ADDRESS_2]
- 創建基於某字段文本的堆疊文本;例如,以下表達式用逗號來指定堆疊之處:Arcade
replace($feature.LABELFIELD, ', ', '\n')
def FindLabel ( [LABELFIELD] ): S = [LABELFIELD] S = S.replace(', ', '\n') return S
Function FindLabel ( [LABELFIELD] ) FindLabel = replace([LABELFIELD], ", ", vbnewline) End Function
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)
def FindLabel ( [MAXIMUM_OC], [RATE] ): import locale locale.setlocale(locale.LC_ALL, '') S = locale.currency(float([MAXIMUM_OC]) * float([RATE])) return S
"Occupancy Revenue: " & FormatCurrency ([MAXIMUM_OC] * [RATE])
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)
def FindLabel ( [LABELFIELD] ): S = [LABELFIELD] return S[2:5]
Mid([LABELFIELD], 3, 3)
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 }
def FindLabel ( [NAME], [POPULATION] ): if int([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]); }
注:
要標注一個基於字段值的要素子集,請以 在標注分類中創建 SQL 查詢(而不是通過標注表達式)的方式進行。以下是其他資源:
(一些信息並非存放在 Esri 所創建、擁有或維護的網頁上。Esri 不能保證這些網頁的可用性,也不對網頁中的內容負責。)