談ArcGIS分數標註的問題?

ArcGIS是大多數做GIS行業的人不可或缺的一個軟體,但是在標註,尤其是分數形勢的標註困擾了很多人。

工具/原料

計算機

ArcGIS軟體

方法/步驟

經常被朋友問到分數標註的問題,如林班的標註。在罈子裡搜尋,大夥給出了很多方案。最常見的是勾選advance後,用VBA語言,利用“—”來劃那條橫線,或者利用對分子加下劃線的形式加橫線。下邊看下具體例子。

1)如只想簡單的標註成分數形式,那是很easy的,如以shape_length作分子,shape_area作分母,則其設定方式為: 試驗1:

談ArcGIS分數標註的問題

即,對分子[Shape_Length]欄位加下劃線,然後用vbnewline換行,再加上[Shape_Area]欄位即可。

1. " "&[Shape_Length]&" "&vbnewline&[Shape_Area]

此時存在的問題是,有可能分子的長度小於分母,導致下劃線長度不夠,缺少美觀,改進方式為,增加長度判斷,並以"—"代替下劃線,則此時將分子、橫線和分母,作三行顯示。其設定如下:試驗2

談ArcGIS分數標註的問題

用len([欄位])來獲取欄位值的長度,如12.34,其長度為4,而123.45,其長度為5。用if..then..end if條件判斷語句,使max取得最長欄位的長度,作為"—"長度計算值。string(int(max/2),"—")的作用為:繪製int(max/2)個"—",而int(max/2)是因為一箇中文輸入法下的"—"佔據了2個英文字元的長度,因此要除2取整。

1. Function FindLabel ( [Shape_Length], [Shape_Area], [DM] )

2. max=len( [Shape_Length] )

3. if max

4. max=len([Shape_Area])

5. end if

6. FindLabel =[Shape_Length] &vbnewline&[DM]&string(int(max/2),"—")&vbnewline& [Shape_Area]

7. End Function

標註作如上設定,使其聚合:

談ArcGIS分數標註的問題

完成上述設定,則純粹的分子/分母的標註形式就完成了。但往往我們的需求不止於此,還需要在分數的左邊再加一個欄位,如圖:試驗3:

談ArcGIS分數標註的問題

即,在上一步的基礎上,對分子,分母前分別加上與[DM]欄位等長的空格,用s=string(len([DM])," ")表示。然後把[DM]字面放在橫線所在行即可。

1. Function FindLabel ( [Shape_Length], [Shape_Area], [DM] )

2. max=len( [Shape_Length] )

3. if max

4. max=len([Shape_Area])

5. end if

6. s=string(len([DM])," ")

7. FindLabel = s&[Shape_Length] &vbnewline&[DM]&string(int(max/2),"—")&vbnewline&s& [Shape_Area]

8. End Function

理論上可行,但我們發現空格好像被忽略了,不論對變數s增加多少個空格長度,分子分母都總要往左擠。為此,我試驗了很多方法,把程式碼修改來修改去,始終無法達以完美的效果。突然意識到,這個問題跟程式碼無關,而應該跟arcmap內部的設定有關。的確,仔細看上述所有試驗的標註發現兩點:1)標註是預設居中對齊的(試驗1、2可以看以明顯效果)2)系統預設把我加的空格給忽略掉了。(這是導致試驗3無效的主因)從上述著手,我找到兩種不同的解決方案。對於10.1及以後版本中,maplex增加了一個細小的新功能:

談ArcGIS分數標註的問題

在label expression介面,切換到maplex選項卡,發現有一個叫remove extra space from label的功能項,預設設定是勾選的。它的作用為:去除標註中無效的空格,所謂無效,是指標註行開始和末尾處的空格。即,我們不論在分子或分母(因為此時分子、分母都是單獨成行的)的前或後任意加多少空格,都會被忽視掉。因此,去除勾選後,檢視效果圖如下:試驗4:

談ArcGIS分數標註的問題

注意,此時為了對齊,做了很多小改動,如增加了s0變數,以及對s變數的修改,s=string(len([DM])*2+s0," "),對[DM]長度*2的目的,也在於中文字元佔兩個位元組長度而英文字元佔一上位元組長度。S0是取的是分子分母長度差的一半。則上述效果其實已經很好了,不需要再除錯。

1. Function FindLabel ( [Shape_Length], [Shape_Area], [DM] )

2. max=len( [Shape_Length] )

3. s0=int((max-len([Shape_Area]))/2)

4. if max

5. max=len([Shape_Area])

6. s0=int((max-len([Shape_Length]))/2)

7. end if

8. s=string(len([DM])*2+s0," ")

9. FindLabel = s&[Shape_Length]&vbnewline&[DM]&string(int(max/2),"—")&vbnewline&s&[Shape_Area]

10. End Function

但是,remove extra space from label作為10.1的新功能,那麼在10.0及之前版本如何解決該問題呢?轉Annotation再手動除錯?麻煩得很。下邊為10.0及之前版本的一個略有缺陷的解決方案:既然系統忽略的是空格,嘗試把填充的空格改為其它字元,如"_"下劃線,儘量使其與橫線一致,是否可行?將remove extra...這一選項勾選上,並把試驗4的程式碼修改s,效果圖如下:

談ArcGIS分數標註的問題

果然,分子和分母被移到右邊去了。但顯然這個效果並不是我們想要的。 依照這個思路,最終的解決方案為:把標註對齊方式改為右對齊,並在末尾處新增橫線。1)修改標註的對齊方式為右對齊:

談ArcGIS分數標註的問題

2)修改標註程式碼:

談ArcGIS分數標註的問題

發現除了末尾有一無法去掉的下劃線外,效果基本滿意。程式碼如下:

1. Function FindLabel( [DM], [Shape_Length] , [Shape_Area] )

2. max=len([Shape_Area])

3. if max

4. max=len([Shape_Length])

5. end if

6. s1=String(int((max-len([Shape_Length]))/2),"_")

7. FindLabel=[Shape_Length]&s1&vbnewline& [DM]&string(int(max/2),"—") &vbnewline& [Shape_Area]

8. End Function

PS:當然,考慮過用 &s1&" ",將下劃線顏色賦成白色使其隱形,結果發現無效,遂放棄。【不知道是否程式碼複雜的時候,該語句就無法識別導致。嘗試過簡易程式碼,一個標註中呈現兩種顏色是可行的】

問題, 軟體, 標註, 分數,
相關問題答案