解析ArcGis的标注(一)——先看看分数式、假分数式标注是怎样实现的
该“标注”系列博文的标注引擎使用“标准标注引擎(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的标注(一)——先看看分数式、假分数式标注是怎样实现的的更多相关文章
- 解析ArcGis的标注(二)——认识ArcGis标注标签
该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. 本篇的标注语句解析使用VBScript,注 ...
- 解析ArcGis的标注(三)——标注的放置 与 转注记修改
该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. 写着写着发现ArcGis标注的破事儿好多啊 ...
- 解析ArcGis的字段计算器(三)——文本型字段计算,编号那些事儿
实际操作中我们一般会将编号字段定义为文本型,因为编号不是序号,序号是一个递增数值,而编号往往是一个数字串代码. 本篇无说明的均使用VBScript语句1.怎么编号?最简单的编号—>直接在编号字段 ...
- 扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注
原文 http://blog.csdn.net/esricd/article/details/7587136 在ArcGIS API for Silverlight/WPF中原版的TextSymbol ...
- 解析ArcGis的字段计算器(一)——数值型数据计算,从“面积计算”开始
先来点儿背景知识铺垫: ArcMap的字段计算器提供了两种脚本语言的支持用以计算,两种脚本语言是VBScript与Python. 多数人选择使用前者,因为它的基本函数和Excel的函数貌似一样.注意我 ...
- 解析ArcGis拓扑——根据拓扑错误记录提取shp文件、导出Excel表格
在ArcGis拓扑检查的流程——以面重叠检查为例中讲述了如何在ArcGis进行拓扑检查与修改. 在实际操作中,有时我们还需要将ArcGis拓扑检查的结果制作成报告或者提取错误信息反馈作业方. 本文仍然 ...
- 解析ArcGis的字段计算器(二)——有玄机的要素Geometry属性,在属性表标记重复点线面
这里所说的重复是指完成重复的,不是叠在一起的两个或多个要素,这种应该叫做“压盖”或“重叠”.重复往往是在合并多Shpfile文件时不小心重复导入造成的. 这里提供一种可能的解决办法,数据无价,请备份! ...
- 解析ArcGis拓扑——检查的流程,以面重叠检查为例
最简单的面重叠错误检查是使用“地理处理”——“面相交”进行检查,其结果是重叠部分提取而成的新面要素类.本例不讲述此种方法. step1 准备待拓扑检查数据 名词: 数据库 DataBase→顾名思义, ...
- ArcGis辅助编号(半自动)功能的插件式实现
应邀写了一个ArcGis(ArcMap更确切一些)的辅助编号功能,其实只要想通了实现逻辑,实现的过程蛮简单的.相比挨个儿点要素写进编号或者借助“按键精灵”写入,直接操作宿主真是爽快得不能自已.无图言屌 ...
随机推荐
- MT【263】待定系数
已知$a,b>0$且$ab(a+b)=4$,求$2a+b$的最小值_____ 解答:$\sqrt{3}(2a+b)\ge(\sqrt{3}+1)a+b+(\sqrt{3}-1)(a+b)\ge3 ...
- 【模板】可持久化文艺平衡树-可持久化treap
题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...
- Hdoj 1176.免费馅饼 题解
Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁 ...
- JavaWeb架构发展
原文:JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础 前戏 前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx + Tom ...
- Codeforces | CF1033D 【Divisors】
题目大意:给定\(n(1\leq n\leq500)\)个数\(a_1,a_2\cdots,a_n(1\leq a_i\leq2\cdot10^{18})\),每个数有\(3\sim5\)个因数,求\ ...
- 【原创】POJ 3259 Wormholes(Bellman-Ford) && 简介Bellman-Ford算法
[原创] 题目大意 John有N个农场,一共有M条边,在农场上出现了W个虫洞(W是一条边),其中M是双向普通边,W是单向虫洞边.John穿行于农场之间每经过一条边(S到E)的时间为+T,每经过虫洞会时 ...
- 「SHOI2014」三叉神经树 解题报告
「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. ...
- NOIP2017题解
T1小凯的疑惑 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中, ...
- 【算法】php实现斐波那契数列
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21.这个数列从第3项开始,每一项都等于前两项之和. 根据这个定义,斐波那契数列的递推公式是:f(n)=f(n-1)+f(n ...
- Educational Codeforces Round 46 C - Covered Points Count
C - Covered Points Count emmm 好像是先离散化一下 注意 R需要+1 这样可以确定端点 emmm 扫描线?瞎搞一下? #include<bits/stdc++.h&g ...