arcgis分式标注
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
也谈分数标注的问题
经常被朋友问到分数标注的问题,如林班的标注。
在坛子里搜索,大伙给出了很多方案。
最常见的是勾选advance后,用VBA语言,利用“—”来划那条横线,或者利用对分子加下划线的形式加横线。
下边看下具体例子【其中引用了很多以前坛子里大家滴成果】:
1)如只想简单的标注成分数形式,那是很easy的,如以shape_length作分子,shape_area
作分母,则其设置方式为:
试验1:
图1 简单分数形式标注设置
即,对分子[Shape_Length]字段加下划线,然后用vbnewline换行,再加上[Shape_Area]
字段即可。
1."<UND>"&[Shape_Length]&"</UND>"&vbnewline&[Shape_Area]
复制代码
此时存在的问题是,有可能分子的长度小于分母,导致下划线长度不够,缺少美观,改进方式为,增加长度判断,并以"—"代替下划线,则此时将分子、横线和分母,作三行显示。
其
设置如下:
试验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 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 解决标注行间过于分散的设置
完成上述设置,则纯粹的分子/分母的标注形式就完成了。
但往往我们的需求不止于此,还需要在分数的左边再加一个字段,如图:
试验3:
图4 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增加了一个细
小的新功能:
图5 去除标注内多余空格的设置
在label expression界面,切换到maplex选项卡,发现有一个叫remove extra space from
label的功能项,默认设置是勾选的。
它的作用为:去除标注中无效的空格,所谓无效,是指标注行开始和末尾处的空格。
即,我们不论在分子或分母(因为此时分子、分母都是单独成行的)的前或后任意加多少空格,都
会被忽视掉。
因此,去除勾选后,查看效果图如下:
试验4:
图6 不勾选“去除标注内多余空格”设置的效果
注意,此时为了对齐,做了很多小改动,如增加了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及之前版本的一个略有缺陷的解决方案:
既然系统忽略的是空格,尝试把填充的空格改为其它字符,如"_"下划线,尽量使其与横线
一致,是否可行?
将remove extra...这一选项勾选上,并把试验4的代码修改s,效果图如下:
图7 下划线代替空格
果然,分子和分母被移到右边去了。
但显然这个效果并不是我们想要的。
依照这个思路,最终的解决方案为:把标注对齐方式改为右对齐,并在末尾处添加横线。
1)修改标注的对齐方式为右对齐:
图8 标注对齐方式修改
2)修改标注代码:
图9 下划线填充+右对齐标注后在10.0的设置效果
发现除了末尾有一无法去掉的下划线外,效果基本满意。
代码如下:
1.Function FindLabel( [DM], [Shape_Length] , [Shape_Area] )
2.max=len([Shape_Area])
3.if max<len([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:当然,考虑过用<CLR red='255' green='255' blue='255'>&s1&"</CLR>",将下划线颜色赋成白色使其隐形,结果发现无效,遂放弃。
【不知道是否代码复杂的时候,该语句就无法识别导致。
尝试过简易代码,一个标注中呈现两种颜色是可行的】。