談ArcGIS分數標註的問題 分子分母形式

2021-07-31 23:11:35 字數 3481 閱讀 7447

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

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

即,對分子[shape_length]欄位加下劃線,然後用vbnewline換行,再加上[shape_area]字段即可。

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

用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 max4.  max=len([shape_area])

5.  end if

6.  findlabel =[shape_length] &vbnewline&[dm]&string(int(max/2),"—")&vbnewline& [shape_area]

7.  end function

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

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

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

1.  function findlabel ( [shape_length], [shape_area], [dm] )

2.  max=len( [shape_length] )

3.  if max4.  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增加了乙個細小的新功能:

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

注意,此時為了對齊,做了很多小改動,如增加了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 max5.  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,效果圖如下

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

2)修改標註**:

bnewline& [shape_area]8.  end functionps:當然,考慮過用&s1&"",將下劃線顏色賦成白色使其**,結果發現無效,遂放棄。【不知道是否**複雜的時候,該語句就無法識別導致。嘗試過簡易**,乙個標註中呈現兩種顏色是可行的】

轉至

01分數規劃問題

形如 ai xi bi xi 求極值問題,其中xi 0,1。設r ai xi bi xi 整理以後可以得到f r ai xi r bi xi 顯然f r 是乙個線性的函式,單調,因此可以用二分法進行求解。設中間變數為r 答案為r,則有 f r 0 r f r 0 r r f r 0 r r ai x...

01分數規劃問題

問題模型1 給定 n 個二元組 value i,cost i 在其中選出 m 個,value i 是選擇此二元組獲得的價值 非負 cost i 是選擇此二元組付出的代價 非負 設 xi xi in 代表第 i 個二元組的選與不選,最大化下式 r frac 1 n 1000,0 k sigma val...

中文標準標註語料的標註中的幾個問題

想讓機器能夠跟人一些樣非常智慧型地處理自然語言,一直是我們的夢想。實現這個理想涉及到很多領域的技術,不管如何設計,自然語言處理 nlp 技術是必備的一環。而自然語言處理中,想要訓練乙個好的模型,語料是繞不過去的門檻。沒有語料,來的模型?而且語料標註規則是否統 一 自洽是訓練自動處理模型的關鍵。不管專...