谈ArcGIS分数标注问题分⼦分母形式
经常被朋友问到分数标注的问题,如林班的标注。在坛⼦⾥搜索,⼤伙给出了很多⽅案。最常见的是勾选advance后,⽤VBA语⾔,利
⽤“—”来划那条横线,或者利⽤对分⼦加下划线的形式加横线。下边看下具体例⼦。
1)如只想简单的标注成分数形式,那是很easy的,如以shape_length作分⼦,shape_area作分母,则其设置⽅式为:试验1:
即,对分⼦[Shape_Length]字段加下划线,然后⽤vbnewline换⾏,再加上[Shape_Area]字段即可。
1.  "<UND>"&[Shape_Length]&"</UND>"&vbnewline&[Shape_Area]
此时存在的问题是,有可能分⼦的长度⼩于分母,导致下划线长度不够,缺少美观,改进⽅式为,增加长度判断,并以"—"代替下划线,则此时将分⼦、横线和分母,作三⾏显⽰。其设置如下:试验2
⽤len([字段])来获取字段值的长度,如12.34,其长度为4,⽽123.45,其长度为5。⽤if..d 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<len([Shape_Area]) then
4.  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 max<len([Shape_Area]) then
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增加了⼀个细⼩的新功能:
在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 max<len([Shape_Area]) then
那夜的雨也没能留住你是什么歌>纸折玫瑰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及之前版本的⼀个略有缺陷的解决⽅案:既然系统忽略的是空格,尝试把填充的空格改为其它字符,如"_"下划线,尽量使其与横线⼀致,是否可⾏?将这⼀选项勾选上,并把试验4的代码修改s,效果图如下
果然,分⼦和分母被移到右边去了。但显然这个效果并不是我们想要的。依照这个思路,最终的解决⽅案为:把标注对齐⽅式改为右对齐,并在末尾处添加横线。1)修改标注的对齐⽅式为右对齐:
2)修改标注代码:
bnewline& [Shape_Area]8.  End FunctionPS:当然,考虑过⽤<CLR red='255' green='255' blue='25
双城之战豆瓣
5'>&s1&"</CLR>",将下划线颜⾊赋成⽩⾊使其隐形,结果发现⽆效,遂放弃。【不知道是否代码复杂的时候,该语句就⽆法识别导致。尝试过简易代码,⼀个标注中呈现两种颜⾊是可⾏的】