ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ArcGIS分式标注指南:分子分母排版技法详解

ArcGIS分式标注指南:分子分母排版技法详解 做国土调查、林业一张图、管线普查这类项目时图斑标注经常要排成“分数”样式地类名称在上分类编码在下中间一条横线拉出来业内叫它分子分母标注。ArcGIS 的默认标注功能虽然也能拼字段但直接输出[地类名称] [地类编码]这种单行文本出图时既不专业也不规范。我自己刚接触这块时也绕了不少弯子后来摸清标注表达式里的换行符和文本格式化标签以后几百个图斑的分式标注几分钟就能批量搞定。这篇文章把我实际项目里验证过的方法整理出来重点讲 ArcMap 和 ArcGIS Pro 两套环境下的写法差异以及空值处理、数值格式化、标注压盖这些容易踩坑的细节。不管你是常年用 ArcMap 的老用户还是已经切到 ArcGIS Pro 的新手照着操作基本都能复现。如果只是临时出一张示意图文末的斜杠替代方案也能救急。1. 先搞清楚分子分母标注到底解决什么问题1.1 最常见的四类应用场景分子分母标注在制图领域比想象中普遍。最典型的是土地利用现状图图斑上要同时体现地类名称和地类编码比如分子写“水田”分母写“0101”一张图上信息密度直接翻倍。林业调查的林地一张图也类似省、县、乡、村各级林斑经常要求标注“林种/地类编码”方便外业核查人员一眼看到两个关键属性。第二类是管线图。给排水、燃气、电力管道在做竣工图时通常要在管线段上标注“管径/埋深”比如“DN300/1.2m”。如果把这些信息拆成两行并加一条分数线会比单纯的斜杠分隔清楚得多也不容易看错单位。第三类是测绘成果图。像控制点成果图里点号在上、高程在下或者点名在上、坐标值在下用分式标注比一行文字紧凑得多还能避免点号和坐标串在一起难以辨认。第四类是科研论文配图或专题图。分析土地利用变化时图斑标注“面积/占比”或者“原分类/现分类”都很常见。这种场景下标注系统能不能快速按字段动态生成分式直接影响出图效率。1.2 为什么不直接写斜杠可能有人会说我直接标注成“水田/0101”不就行了何必折腾成真正的分式分式标注的核心价值有两个。第一是视觉层次。分子和分母通过横线分隔读者先看分子再看分母信息层级天然区分。斜杠写法在字号小、内容多的时候容易把两个字段粘连在一起比如“DN600/2.5m”和“DN600/25m”在快速浏览时容易看混。第二是制图规范。很多行业制图标准比如国土调查数据库图件规范、林业专题图图式明确要求图斑标注采用分式形式。如果提交的图件不合规范后续质检和入库都会很麻烦。与其在 CAD 里手动摆文字不如直接在 ArcGIS 标注表达式里解决。1.3 核心思路一句话说清ArcGIS 的标注表达式本质上就是“根据要素属性动态拼出要显示的字符串”所以分式标注的核心思路就是把分子写在一行通过换行符切换到下一行再用文本格式化标签中的下划线标签UND给分子加上一条横线视觉效果上就变成了分数线。实现下来,无非是分子文本字段或表达式拼接结果外面包一层UND和/UND。分隔VBScript 用vbCrLfPython 和 Arcade 用\n。分母普通字段或表达式直接换行输出。掌握这一个基本公式后各种变体加前后缀、判断空值、数字格式化都是在这个基础上扩展的。2. ArcMap 里最实用的三种实现写法2.1 方法一下划线标签做出真分数线这是我强烈推荐的主方案。ArcGIS 的标注系统支持一组文本格式化标签其中UND表示给文本加下划线。用UND [分子字段] /UND给分子加下划线换行后再接分母出来的效果就是一条紧贴分子底部的水平线视觉上非常接近印刷体的分数。在 ArcMap 中的操作路径是图层右键 → Properties → Labels 选项卡 → 在标注字段下拉框右侧点击 Expression 按钮 → 解析器选择 VBScript → 在表达式框中输入以下内容UND [地类名称] /UND vbCrLf [地类编码]然后点击 Verify 按钮预览效果确认正常后一路点 OK。如果字段是数值型VBScript 在字符串拼接时会自动转换通常不需要额外处理。但建议养成用CStr()包裹的习惯避免个别版本环境下出现类型不匹配的问题。UND CStr([地类名称]) /UND vbCrLf CStr([地类编码])这个方案的优点是横线长度自动匹配分子文本宽度分子改成“乔木林地”还是“水田”下划线都会跟着变不需要手动调整。2.2 方法二固定横线字符的三行式如果你不喜欢下划线紧贴文本的效果想要一条空隙更大的分数线可以改用横线字符。原理很简单分子一行横线一行分母一行三行叠出分式。[地类名称] vbCrLf ―――――― vbCrLf [地类编码]这里的“――”是全角破折号也可以换成“-”或“—”选择什么字符取决于字体。宋体、黑体等中文字体下全角破折号显示比较整齐半角连字符则需要多写几个才能拉长。需要注意横线长度是固定的如果分子字段长度差异很大短分子配长横线会显得很不协调。我的经验是横线字符数量按“字段最长可能值的宽度 两三个余量”来配置宁可稍长一点也不要出现分子宽度超出横线的情况。如果字段特别长还可以用Left([字段], N)截断分子配合提示符号使用。2.3 方法三斜杠分式的简单替代对出图精度要求不高、或者只需要在制图过程中临时看属性的时候斜杠写法就是效率最高的方案。直接在表达式框里写[地类名称] / [地类编码]或者输出成“地类名称换行斜杠编码”的变体[地类名称] / [地类编码]这不算真正的分式标注但胜在快、简单、不出错。我一般是在数据检查阶段用这种临时标注等正式出图前再切换成分式表达式。2.4 如何验证表达式效果ArcMap 的标注表达式对话框中有一个 Verify 按钮点击后会弹出预览窗口显示当前图层第一条要素的标注结果。在初学阶段我建议每写完一段表达式都先点一下 Verify看看换行是否生效分子下划线是否出现数字字段是否正常显示空值字段是否显示成空白而不是“ ”之类的字样。预览没问题后再关闭对话框在内容列表中勾选图层的 Labels 复选框查看全图效果。如果标注压盖严重就应该把“标注优先级”和“要素权重”调一下这在后面常见问题部分会展开说。3. 表达式别踩坑字段类型、空值和数值格式化3.1 字段类型转换VBScript 和 Python 的差异分子分母标注的字段并不总是文本型。面积、坡度、管径等字段在属性表里通常是双精度数值拼接时要先转成字符串。VBScript 里可以直接用连接它会隐式转换数值到字符串而且转换逻辑基本符合直觉但我在 ArcGIS Pro 里切换到 Python 解析器后直接拼接会报类型错误必须显式用str()包装def FindLabel([面积], [地类编码]): area_str str([面积]) code_str str([地类编码]) return UND area_str /UND\n code_strVBScript 里的写法如果想显式转换可以用CStr()UND CStr([面积]) /UND vbCrLf CStr([地类编码])3.2 空值与空字符串是两个问题这是分式标注里最容易翻车的地方。ArcGIS 的字段中Null 表示没有值空字符串表示有一个空文本两者性质不同。Excel 导入的数据经常出现空字符串CAD 转过来的数据则可能出现 Null。如果不处理分子或分母会直接空掉只显示一条横线或一个斜杠很不美观。VBScript 中处理空值的标准写法是用IIfIIf(IsNull([地类名称]), -, CStr([地类名称])) vbCrLf IIf(IsNull([地类编码]), -, CStr([地类编码]))不过IIf只判断 Null空字符串会被当成有效值显示。为了更稳妥建议在高级模式下写一个完整的 FindLabel 函数把空值和空字符串一起处理Function FindLabel ([地类名称], [地类编码]) Dim sName Dim sCode If IsNull([地类名称]) Or [地类名称] Then sName - Else sName CStr([地类名称]) End If If IsNull([地类编码]) Or [地类编码] Then sCode - Else sCode CStr([地类编码]) End If FindLabel UND sName /UND vbCrLf sCode End Function在 ArcMap 中使用高级表达式需要勾选表达式对话框底部的“高级”复选框然后在表达式框中输入整个函数。Python 解析器同样适用高级模式写法如下def FindLabel([地类名称], [地类编码]): name str([地类名称]) if [地类名称] is not None else - code str([地类编码]) if [地类编码] is not None else - if [地类名称] : name - if [地类编码] : code - return UND name /UND\n code3.3 数值格式化保留小数和千分位面积、长度这类数值直接转字符串可能会出现一长串小数图面上非常难看。控制小数位数有两种常见需求保留两位小数和千分位分隔。VBScript 里用FormatNumberUND FormatNumber([面积], 2) ha/UND vbCrLf CStr([地类编码])Python 里用 format 语法def FindLabel([面积], [地类编码]): area_str {:.2f}.format([面积]) return UND area_str /UND\n str([地类编码])如果需要千分位分隔符Python 里可以用{:,.2f}.format([面积])比如 123456.78 显示成 123,456.78。测绘图件中面积过大时这种格式更容易读。3.4 高级模式下做条件过滤有人问能不能只对部分要素做分式标注当然可以。比如面积大于 500 平方米的图斑才显示“面积/地类”面积太小的不标注避免注记密集。高级模式下VBScript 的 FindLabel 函数可以直接用条件语句Function FindLabel ([面积], [地类编码]) If [面积] 500 Then FindLabel UND FormatNumber([面积], 2) /UND vbCrLf CStr([地类编码]) Else FindLabel End If End FunctionPython 版本同理def FindLabel([面积], [地类编码]): if [面积] 500: return UND {:.2f}.format([面积]) /UND\n str([地类编码]) else: return 这个技巧特别适合处理“图斑多、面积小”的密集区域。配合比例尺范围设置可以做到大比例尺下全标注、小比例尺下只标注大图斑。3.5 在分子分母上加前后缀ArcGIS 标注表达式支持任意字符串拼接所以给分子或分母加单位、前缀都不麻烦。比如分子显示“面积150.25”再带下划线分母显示“地类0301”。只需注意引号和字段的拼接顺序UND面积 FormatNumber([面积], 2) /UND vbCrLf 地类 CStr([地类编码])还有一种用法是给分子分母加单位比如“NDVI 0.75”作为分子“2023 年影像”作为分母适合做遥感分类专题图的标注。4. ArcGIS Pro 中的分式标注别照搬旧脚本4.1 解析器差异Python 和 Arcade很多老 ArcMap 用户切到 ArcGIS Pro 后发现标注表达式对话框变样了默认解析器是 Python甚至没有 VBScript 选项。ArcMap 里保存的 VBScript 标注表达式在 Pro 中不一定能直接运行需要手动转成 Python 或 Arcade 表达式。Pro 中的标注表达式入口在内容列表选中图层 → 左上角 Labeling 选项卡 → Label Properties 下拉 → Expression。打开后可以选择 Python 或 Arcade 解析器表达式框下方有 Verify 按钮用法与 ArcMap 一致。4.2 Pro 中的推荐写法在 ArcGIS Pro 中使用 Python 解析器推荐写法就是定义一个 FindLabel 函数把所有字段作为参数传进去逻辑写清楚。以“分子为地类名称、分母为地类编码”为例def FindLabel([地类名称], [地类编码]): name str([地类名称]) if [地类名称] is not None else - code str([地类编码]) if [地类编码] is not None else - if name : name - if code : code - return UND name /UND\n code如果不想用函数单行表达式也可以UND str([地类名称]) /UND\n str([地类编码])但注意单行表达式遇到空值时容易报错尤其是数值型字段为 None 时str(None)会输出 None 而不是空值。所以只要字段可能为空我都建议用函数形式。Arcade 解析器的写法则更接近 JavaScriptvar name $feature.地类名称; var code $feature.地类编码; if (name null) { name -; } if (code null) { code -; } return UND name /UND\n code;Arcade 的好处是字段名无需方括号表达式更清爽但如果你团队里其他人都用 Python还是统一用 Python 更利于维护。4.3 行距和文本符号调整技巧分式标注的两行文本之间默认行距可能太挤下划线和分母会贴在一起。ArcMap 中可以通过标注符号编辑器调整行距Labels 选项卡 → Symbol 按钮 → 打开 Symbol Selector → 点击 Properties / Advanced Text → 调整 Line SpacingLeading参数单位是磅值一般设 2~4 磅比较合适。ArcGIS Pro 中操作类似Labeling 选项卡 → Text Symbol 面板 → 打开 Format Text Symbol 面板 → 在 Spacing 区域调整 Leading行距。我一般把数值设为 2 到 5具体看分子文本的字体大小。还有一种取巧的办法在表达式的分子和分母之间插入两个换行符比如return UND name /UND\n\n code这样会多空出一行但代价是标注占用的图面空间变大。如果只是偶然处理一张图可以用如果是批量出图还是调行距更专业。5. 常见问题排查速查表5.1 换行符不生效表现原因解决方案表达式输出仍在同一行解析器选错用 Python 却写vbCrLf确认解析器后使用对应的换行符换行了但中间有一条多余空白行使用了两个换行符只保留一个\n或vbCrLf高级模式下函数没有返回值FindLabel 未正确赋值检查函数名和最后的赋值语句Python 中一定要注意\n写在字符串内部不能写成/n。VBScript 中除了vbCrLf还可以用Chr(13) Chr(10)但没必要vbCrLf足够清晰。5.2 下划线位置不对或跑偏UND标签包裹的范围必须严格限定在分子文本外面不要包住换行符。正确写法是UND 分子 /UND vbCrLf 分母如果误把/UND放在换行符后面下划线会延伸到换行符导致整条标注都出现下划线。某些字体或字形下下划线距离文字底部太近看上去像文本自带的下划线而不是分数线。这时改用 2.2 节的固定横线字符方案或者调整行距把两行间距拉大。还有一个少见问题如果分子字段包含换行符比如从 Excel 导入的字段内部有回车UND的显示会异常需要在表达式里先把字段内部的换行符替换掉Replace([地类名称], vbCrLf, )5.3 标注重叠压盖分式标注比单行标注占用空间大更容易互相叠压。别急着写一堆代码先确认两件事第一在图层属性中把“标注优先级”设为合适级别比如比道路注记低。第二在标注符号的“放置属性”中尽量勾选“移除冲突标注”或者调整“权重”。ArcMap 中还有要素权重设置可以把需要优先显示的要素设为更高权重让被压盖的标注自动隐藏。如果图斑太密集就按 3.4 节的条件过滤只标注面积大于某个阈值的图斑。5.4 从 ArcMap 迁到 Pro 的兼容问题ArcMap 的 mxd 图层在 ArcGIS Pro 中打开时原来的 VBScript 标注表达式可能会丢失或被转成基础字段标注。建议迁移前先把关键标注表达式截图或复制保存到文档里到 Pro 中再重写 Python 版本。另一个兼容坑是UND等文本格式化标签在 Pro 中对不同字体支持不完全一致。我遇到过中文宋体下下划线正常换到某些 CAD 导入字体后下划线消失的情况。这种问题没有通用解法只能换字体测试。6. 还想再省事把标注转成注记再微调6.1 什么时候需要转注记标注表达式的优势是动态更新属性变了标注自动变。但制图出图阶段经常需要人工挪动某些标注的位置、修改个别文字内容、删除遮挡重要地物的注记。这时候就应该把标注转为注记Annotation变成独立存储在数据库或要素类中的对象可以逐个编辑。当图层转为注记后就不再依赖标注表达式可以自由调整字体、行数、位置。条件允许的话输出“地理数据库注记”比“地图文档注记”更灵活注记可以反复加载。6.2 转换的两种方式与边界处理ArcMap 中图层右键 → Convert Labels to Annotation。可以选择“将标注转换为注记存储于地理数据库”还是“存储于地图文档中”。ArcGIS Pro 中同样是右键图层 → Convert Labels to Annotation界面类似。需要注意的是转注记前一定要把标注表达式调到最终状态因为转完后表达式就不再“活着”了改字段值无法自动刷新注记。如果数据后续可能更新建议保留原始标注图层先在副本上转注记做制图整饰。转注记时还有一个选项是关于未放置标注Unplaced Annotation。密集区域的标注可能被自动隐藏转换后这些“未放置”的注记会存在注记组的表里。可以在制图整饰阶段手动把这些未放置注记拖到合适位置增加图面信息量。6.3 一个小技巧转换前先检查字段转换注记后才发现面积字段格式不对或者地类编码少了一位返工成本很高。我习惯在转换前用“标注表达式Verify”逐条检查几个关键图斑再配合属性表筛选看有没有空值字段没处理。检查清单大致是分子分母是否都正常显示是否有字段显示为 “None” 或 “ ”数字是否按预期保留了小数位数有没有字段内容过长导致标注超出图斑范围。确认无误后再转注记Step by step稳得很。我个人在实际项目里还会把标注表达式存成文本文件按工程名分类放好下次遇到同类任务直接改字段名就能复用。ArcGIS 的标注表达式并不复杂但写一次容易写一次好看又不出错的往往就是多个细节叠加的结果。做分式标注时先想清楚字段类型、空值、换行符、下划线标签这四个环节再用上面的方法组合基本就能把大多数图面标注需求拿下来。
返回列表