该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它。

ArcGis的标注表达式支持VBScript、Jscript、Python ,3种脚本语言进行语句解析。一般我们常用的是VB、Python。

普通标注这里不做讲述,先从一个简单的换行标注开始讲起。


两行标注

可以很简单的通过下面的VB语句来实现

[字段1] +VB换行符+ [字段2]

VB的换行符一般用vbnewline,它与vbcrlf是等价的,在ArcGis的字段计算器或者标注表达式中其实还可以用chr(10)、chr(13)、chr(10)+chr(13)来替代。

先了解一下chr函数,它是将ASCII码值返回对应的字符,这篇文章的读者应该会对这个概念比较陌生,有兴趣不妨自己去查一下chr函数与ASCII。

chr(10)—>vblf—>换行;

chr(13)—>vbcr—>回车;

chr(10)+chr(13)—>vbcrlf(vbnewline)—>换行回车

上面vb……的东西是VB语言中的预置常数,其值就是对应的chr函数返回值。

下面几种组合的结果是一样的

[PartCount]  +vbnewline+ [BH]

[PartCount]  +chr(10)+ [BH]

[PartCount]  +vbcr+ [BH]

[PartCount]  +chr(10)+chr(13)+ [BH]

这样的标注只能叫两行标注,它离分式标注还差一条分式横线。


分式标注

这样实现?

[PartCount]  +vbnewline+"——"+vbcrlf +[BH]

其实换行两次成了3行,分子与分母距离较远,看起来效果挺差。

改进方法?有的。

这就要引入ArcGis的标注标签了,使用und(下划线)标签为分子字段加个下划线:

"<und>"+[PartCount]+"</und>"+vbcrlf +[BH]

标签的使用方式类似HTML、XML等的标签,由上面的表达式可知(不知道就百度去吧)。效果如下图,由于分子太短,分母太长,分式线显得过于苗条了。

用一个VBScript函数对分子、分母字符串的长度进行比较,如果分母长,就在分子前后加若干空格(“ ”),然后对“空格+分子+空格”使用下划线标签加下划线:

Function FindLabel ( [分子字段], [分母字段] )

Dim fmLength '分母长度

Dim fzLength '分子长度

Dim strSpace '空格

fmLength = Len([分母字段]) 'len函数取字符串长度,字段计算器那儿有讲

fzLength = Len([分子字段]) '博客园 yzhyingcool

If fmLength > fzLength Then  '如果分母比分子长

    strSpace = Space((fmLength - fzLength)/) '(fmLength - fzLength)/2 取得两端空格的长度

End If                                        'space函数生成给定位数空格

FindLabel = "<und>" + strSpace + [分子字段] + strSpace + "</und>" + vbCrLf + [分母字段]

End Function

效果便是这样了:


到这里应该插一个小节讲一下标注函数表达式如何使用

如上图,首先要确定函数使用的语言,然后去点击“Advanced(高级)”,语句块输入框里会自动生成一个名为FindLabel  的函数框架,传入的参数是标注需要的字段,这个函数名字不能改!

然后你就有两种选择,一种是直接在此基础上完成函数,另一种是直接删掉,复制现成的表达式进来修改传入的字段参数。

还有需要提醒的是不建议在ArcMap的标注表达式框里写函数,因为它没有关键词提示、代码高亮、缩进等的功能,不便于代码编写,甚至出错了数出错行数也是个麻烦事情。可以尝试使用Notepad++或者选用语言的IDE,如果使用VBScript可以使用Excel的VBE编辑器。


假分数样式

使用下面的VBScript函数实现:

Function FindLabel ( [整数字段] , [分子字段], [分母字段] )

Dim fmLength '分母长度

Dim fzLength '分子长度

Dim zsLength '整数长度

Dim hxLength '分式线长度

fmLength = Len([分母字段]) 'len函数取字符串长度,字段计算器那儿有讲

fzLength = Len([分子字段]) '博客园 yzhyingcool

zsLength = Len([整数字段])

If fmLength > fzLength Then  '如果分母比分子长

    hxLength=fmLength

       else '反之

       hxLength=fzLength

End If

'下面的"-"或"—"根据英文(数字)或者中文进行调整即可

FindLabel = space(zsLength)+[分子字段] +vbcrlf+[整数字段]+ string(hxLength,"-")+vbcrlf+space(zsLength)+ [分母字段]

End Function

效果如图:

其实这个样式是由我们开始便讲到的“3行标注分式”进化而来的,没错,这个假分数就是3行:

第一行→整数长度的空格+分子;

第二行→整数+分式线(根据分子分母的中英文调整"-"或"—");

第三行→整数长度的空格+分母

解析ArcGis的标注(一)——先看看分数式、假分数式标注是怎样实现的的更多相关文章

  1. 解析ArcGis的标注(二)——认识ArcGis标注标签

    该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. 本篇的标注语句解析使用VBScript,注 ...

  2. 解析ArcGis的标注(三)——标注的放置 与 转注记修改

    该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. 写着写着发现ArcGis标注的破事儿好多啊 ...

  3. 解析ArcGis的字段计算器(三)——文本型字段计算,编号那些事儿

    实际操作中我们一般会将编号字段定义为文本型,因为编号不是序号,序号是一个递增数值,而编号往往是一个数字串代码. 本篇无说明的均使用VBScript语句1.怎么编号?最简单的编号—>直接在编号字段 ...

  4. 扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注

    原文 http://blog.csdn.net/esricd/article/details/7587136 在ArcGIS API for Silverlight/WPF中原版的TextSymbol ...

  5. 解析ArcGis的字段计算器(一)——数值型数据计算,从“面积计算”开始

    先来点儿背景知识铺垫: ArcMap的字段计算器提供了两种脚本语言的支持用以计算,两种脚本语言是VBScript与Python. 多数人选择使用前者,因为它的基本函数和Excel的函数貌似一样.注意我 ...

  6. 解析ArcGis拓扑——根据拓扑错误记录提取shp文件、导出Excel表格

    在ArcGis拓扑检查的流程——以面重叠检查为例中讲述了如何在ArcGis进行拓扑检查与修改. 在实际操作中,有时我们还需要将ArcGis拓扑检查的结果制作成报告或者提取错误信息反馈作业方. 本文仍然 ...

  7. 解析ArcGis的字段计算器(二)——有玄机的要素Geometry属性,在属性表标记重复点线面

    这里所说的重复是指完成重复的,不是叠在一起的两个或多个要素,这种应该叫做“压盖”或“重叠”.重复往往是在合并多Shpfile文件时不小心重复导入造成的. 这里提供一种可能的解决办法,数据无价,请备份! ...

  8. 解析ArcGis拓扑——检查的流程,以面重叠检查为例

    最简单的面重叠错误检查是使用“地理处理”——“面相交”进行检查,其结果是重叠部分提取而成的新面要素类.本例不讲述此种方法. step1 准备待拓扑检查数据 名词: 数据库 DataBase→顾名思义, ...

  9. ArcGis辅助编号(半自动)功能的插件式实现

    应邀写了一个ArcGis(ArcMap更确切一些)的辅助编号功能,其实只要想通了实现逻辑,实现的过程蛮简单的.相比挨个儿点要素写进编号或者借助“按键精灵”写入,直接操作宿主真是爽快得不能自已.无图言屌 ...

随机推荐

  1. 洛谷P4907【CYH-01】小奔的国庆练习赛 :$A$换$B$ $problem$(DFS,剪枝)

    洛谷题目传送门 顺便提一下题意有一个地方不太清楚,就是如果输出No还要输出最少需要添加多少张牌才能满足要求.蒟蒻考完以后发现四个点Too short on line 2... 比较需要技巧的搜索 既然 ...

  2. 【agc030f】Permutation and Minimum(动态规划)

    [agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...

  3. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  4. prufer序列学习笔记

    prufer序列是一个定义在无根树上的东西. 构造方法是:每次选一个编号最小的叶子结点,把他的父亲的编号加入到序列的最后.然后删掉这个叶节点.直到最后只剩下两个节点,此时得到的序列就是prufer序列 ...

  5. Redis主从复制与高可用方案

    redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis与其他key – value缓存产品有以下三个特点: 支持数据的持久化,可以将内存中 ...

  6. nodejs的某些api~(一)node的流2

    可写流writablewritable.write(chunk, [encoding], [callback])chunk {String | Buffer} 要写入的数据encoding {Stri ...

  7. JavaServer Faces (JSF) with Spring

    JavaServer Faces (JSF) with Spring Last modified: April 30, 2018 by baeldung Spring+ Spring MVC JSF ...

  8. poj3630 Phone List

    spy on一下,发现是trie裸题,结果一交就T... 然后把cin改成scanf就A了... trie的空间一定要开足,要不然RE #include <cstdio> #include ...

  9. jquery基本语法(一)

    https://www.cnblogs.com/haiyan123/p/7657151.html 一.jQuery基础1.为什么要用jquery?    写起来简单,省事,开发效率高,兼容性好2.什么 ...

  10. bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...