《arcgis分式注.docx》由会员分享,可在线阅读,更多相关《arcgis分式注.docx(7页珍藏版)》请在三一办公上搜索。
1、arcgis分式注也谈分数标注的问题 经常被朋友问到分数标注的问题,如林班的标注。在坛子里搜索,大伙给出了很多方案。最常见的是勾选advance后,用VBA语言,利用“”来划那条横线,或者利用对分子加下划线的形式加横线。下边看下具体例子: 1)如只想简单的标注成分数形式,那是很easy的,如以shape_length作分子,shape_area作分母,则其设置方式为: 试验1: 图1 简单分数形式标注设置 即,对分子Shape_Length字段加下划线,然后用vbnewline换行,再加上Shape_Area字段即可。 1. &Shape_Length&vbnewline&Shape_Area
2、 复制代码 此时存在的问题是,有可能分子的长度小于分母,导致下划线长度不够,缺少美观,改进方式为,增加长度判断,并以代替下划线,则此时将分子、横线和分母,作三行显示。其设置如下: 试验2 图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 Find
3、Label ( Shape_Length, Shape_Area, DM ) 2. max=len( Shape_Length ) 3. if maxlen(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 解决标注行间过于分散的设置 完成上述设置,则纯粹的分子/分母的标注形式就完成了。 但往往我们的需求不
4、止于此,还需要在分数的左边再加一个字段,如图: 试验3: 图4 3个字段的分数形式设置 即,在上一步的基础上,对分子,分母前分别加上与DM字段等长的空格,用s=string(len(DM), )表示。然后把DM字面放在横线所在行即可。 1. Function FindLabel ( Shape_Length, Shape_Area, DM ) 2. max=len( Shape_Length ) 3. if maxlen(Shape_Area) then 4. max=len(Shape_Area) 5. end if 6. s=string(len(DM), ) 7. FindLabel =
5、 s&Shape_Length &vbnewline&DM&string(int(max/2),)&vbnewline&s& Shape_Area 8. End Function 复制代码 理论上可行,但我们发现空格好像被忽略了,不论对变量s增加多少个空格长度,分子分母都总要往左挤。 -我是可爱的分割线-以上为坛子里大家的总结,以下为本人心得- - 为此,我试验了很多方法,把代码修改来修改去,始终无法达以完美的效果。突然意识到,这个问题跟代码无关,而应该跟arcmap内部的设置有关。 的确,仔细看上述所有试验的标注发现两点: 1)标注是默认居中对齐的 2)系统默认把我加的空格给忽略掉了。 从上
6、述着手,我找到两种不同的解决方案。对于10.1及以后版本中,maplex增加了一个细小的新功能: 图5 去除标注内多余空格的设置 在label expression界面,切换到maplex选项卡,发现有一个叫remove extra space from label的功能项,默认设置是勾选的。 它的作用为:去除标注中无效的空格,所谓无效,是指标注行开始和末尾处的空格。即,我们不论在分子或分母的前或后任意加多少空格,都会被忽视掉。 因此,去除勾选后,查看效果图如下: 试验4: 图6 不勾选“去除标注内多余空格”设置的效果 注意,此时为了对齐,做了很多小改动,如增加了s0变量,以及对s变量的修改,
7、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 maxlen(Shape_Area) then 5. max=len(Shape_Area) 6. s0=int(max-len(Shape_Length
8、)/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及之前版本的一个略有缺陷的解决方案: 既然系统忽略的是空格,尝试把填充的空格改为其它字符,如_下划线,尽量
9、使其与横线一致,是否可行? 将remove extra.这一选项勾选上,并把试验4的代码修改s,效果图如下: 图7 下划线代替空格 果然,分子和分母被移到右边去了。但显然这个效果并不是我们想要的。 依照这个思路,最终的解决方案为:把标注对齐方式改为右对齐,并在末尾处添加横线。 1)修改标注的对齐方式为右对齐: 图8 标注对齐方式修改 2)修改标注代码: 图9 下划线填充+右对齐标注后在10.0的设置效果 发现除了末尾有一无法去掉的下划线外,效果基本满意。代码如下: 1. Function FindLabel( DM, Shape_Length , Shape_Area ) 2. max=len
10、(Shape_Area) 3. if maxlen(Shape_Length) then 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&,将下划线颜色赋成白色使其隐形,结果发现无效,遂放弃。【不知道是否代码复杂的时候,该语句就无法识别导致。尝试过简易代码,一个标注中呈现两种颜色是可行的】