你是不是也遇到过这种场景:打开一张水系图,所有河流不管大小全部标上名字,结果支流密密麻麻挤成一团,干流标注反而被压在最底下,整张图跟撒了一把芝麻似的。或者反过来,只想让主干河流有标注,不想让那些无名小支流凑热闹,但翻遍图层属性也不知道怎么实现。这个问题我早几年做流域制图时反复踩过,最后靠“要素分类标注”这个功能彻底解决。它专门解决“一套数据里不同等级的要素,要用不同规则去标”的需求,对河流分级显示来说,几乎是标准解法。这篇就从原理到实操,把我完整的配置过程、踩过的坑和排查思路都写出来,希望对做水文、规划、路网这些经常跟分级数据打交道的人有帮助。
1. 标注为什么一锅粥:单规则、无优先级、字段混乱三个根源
1.1 一套标注规则管全部要素,这是最根本的问题
ArcGIS的标注机制从十年前的ArcMap到现在的ArcGIS Pro,底层逻辑本质上没变:你把图层拖进来,打开标注开关,所有要素就会按照同一套文字符号去渲染。这套符号包括字体、字号、颜色、放置方式,全都一样。
问题恰恰出在这里。自然界的水系是分级的,从干流到毛细支流,重要性差了不知道多少个量级。一个流域里,长江一级的干流和那种断断续续的小沟渠,如果用同一个字号、同一种颜色去标,那图上必然是大河名字淹没在小河名字的海洋里。我做过的某次流域出图中,数据里有近万条河段,等级从1到5,默认标注一开,整个图面直接没法看,连地形底图都被字盖得干干净净。
很多人这时候会想:那我全局把字号调小一点不就行了?这是一个典型的治标不治本的做法。字号调小后,支流的拥挤程度确实会缓解一点,但干流的标注也被弱化了,整张图缺少视觉重心。你真正想要的效果是——重要的河名字大、颜色深,次要的河名字小、颜色浅,可有可无的河直接不标。这个需求,默认的单一标注规则给不了。
1.2 压盖规则是“先到先得”,不是“谁重要谁保留”
还有一点容易被忽略:即便你手动把所有标注框出来了,ArcGIS默认的压盖处理逻辑也不够聪明。在没有Maplex标注引擎和权重设置的情况下,标注冲突时默认是按照要素的内部顺序来决定的,说白了就是“先标谁谁赢”,跟河流等级没有半点关系。
这就会导致一个很滑稽的结果:一条名不见经传的小水沟,标注死死占住了河网交汇处的位置,而旁边真正的干流名字却被挤到图外去了。我最早碰到这个情况时还以为是自己数据顺序有问题,排了半天序,没用。后来才明白,问题出在标注引擎的冲突处理机制上,而不是数据本身。
1.3 数据字段混乱,是分级标注做不好的隐藏根源
行内人常讲一句话:制图问题,有一半是数据问题。做河流分级标注前,先得确认你的属性表里到底有没有一个能用的“等级”字段。我见过很多水系shp,看起来有几十个字段,但真正能表达分级的字段名五花八门:有的叫Grade,有的叫等级,有的叫CLASS,有的叫StreamOrder,还有的干脆叫Remark,里面填的是“大河”“小河”“中河”这种口语化描述。
更麻烦的是字段值不统一。比如同一个等级,有的记录是数字1,有的是文本“1”,还有的是“一级”。在SQL查询里,数字型和文本型的写法完全不同,一个双引号和单引号之差,就会导致筛选结果不对。等下在实操部分我会专门讲这个,因为这是很多人的翻车点。
2. 要素分类标注的实现原理:一套图层如何拆成多套标注规则
2.1 类别的本质:用SQL条件把要素切成几组,各组单独配置
ArcGIS里的要素分类标注,英文叫Define Classes of Features and Label Each Class,中文界面一般显示为“要素类别的标注”或者“分类标注”。理解它最简单的办法,就是把它当作一个“多重筛选器”。
你可以这么理解:图层的标注规则,不像默认那样只有一套,而是可以创建多个“标注类别”,每个类别绑定一个SQL过滤条件。比如你创建一个名为“干流标注”的类别,SQL条件是等级等于1;再创建一个“支流标注”的类别,SQL条件是等级等于2。这样一来,等级为1的河段会套用干流那套字体,等级为2的河段会套用支流那套字体,同类之间互不干扰。
在ArcMap里,这个入口在图层属性的Labels选项卡下方,有一个Label Classes的区域,默认只显示“ ”这样一个类。点旁边的Add按钮就能加新类。在ArcGIS Pro里更直观,内容窗格的图层下会直接展开显示每个Label Class,类似子图层的形式,每个类可以单独开关、单独编辑。
2.2 和常见的替代方案比一比,为什么分类标注是首选
有些同行不用分类标注,而是用其他办法。我把几个常见方案的优劣列出来,方便你结合自己的场景判断:
| 方案 | 操作成本 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 全局标注+统一小字号 | 最低 | 一步到位,实现快 | 所有要素同一待遇,主次不分 | 数据量小、级别差异不明显的临时草图 |
| 手动删除标注/手动挪注记 | 高 | 图面效果可控,精致 | 数据一变全作废,维护成本极高 | 一次性定稿图、专题图出图 |
| 要素分类标注 | 中等 | 按字段自动分流,数据更新后规则不失效,灵活度高 | 需要先理清字段和等级关系,初次配置需要一点时间 | 河网分级、路网等级、POI分类标注等绝大多数场景 |
| 转注记后手工整理 | 高 | 完全自由控制每个注记 | 无法随数据更新,重新生成要重做 | 最终成果图的精细排版 |
从这个表能看出来,如果你的图还没到最终定稿阶段,数据还会调整、范围还会修改,那要素分类标注是维护成本最低又能保持主次分明的方案。我个人的习惯是:项目前期用分类标注看效果、做调整,等到全部定稿了,再把标注转成注记进行最后的细节修正。这两个阶段搭配使用,效率最高。
2.3 什么样的数据适合用分类标注
分类标注不限于河流,它的通用场景是:同一图层里,要素在某一属性字段上存在明显的重要级差异,且这个差异在视觉呈现上需要被放大。最典型的几类:
- 河网数据,按河流等级分干流、支流、毛细水系;
- 路网数据,按高速、国道、省道、县道分级标注;
- POI数据,按景点、餐饮、住宿等类别分别配置图标和文字;
- 土地利用数据,按地块类型给不同标注样式。
判断标准就一条:你能否在属性表里找到一个字段,把要素清楚分成三类以上,而且各类别在图面重要程度上确实不一样。如果有,分类标注就是最合适的工具。
3. 实操配置:流域河网按等级分层标注的完整步骤
3.1 第一步:检查等级字段,先解决“有没有”和“干不干净”
在动手配置之前,我强烈建议先打开属性表看两样东西:字段名和字段值。右键图层,打开属性表,找一个看起来像等级字段的列,用排序功能扫一遍值。你要检查的是三件事。
第一件事,这个字段能不能语义化表达等级。如果里面的值只有1、2、3,那很好,把它记下来。如果值是“主流”“支流”“干渠”这种文本,也可以用。最怕的是值全部一样,或者大量为空,那说明这个数据本身就不支持分级标注,你需要另想办法,比如按河流长度重算等级,或者从流域拓扑关系去推。
第二件事,字段类型是文本还是数字。在字段列表里能看到Type这一列,Text和Double是两种完全不同的类型。这直接决定后面SQL怎么写:数字字段用"GRADE" = 1,文本字段用"GRADE" = '1',写反了筛选结果就是空的。
第三件事,有没有空值。空值字段的要素在分类标注里最容易被“漏掉”,因为它的等级不属于任何一个类。后面我会专门讲这个坑,现在你只需要记住:有大量空值时,先决定这些要素要不要显示,要显示的话最好给它们补一个“其他”类。
3.2 第二步:创建多个标注类别,写好SQL过滤条件
以ArcMap 10.x为例,操作路径是:右键图层 → Properties → Labels选项卡。在Label Classes区域,默认有一个类叫“ ”,对应所有剩余要素。我先点击Add按钮,新建一个类,命名为“干流”,再新建“一级支流”,再新建“二级支流”。
然后选中“干流”这个类,点击下方的SQL Query按钮,在弹出的SQL对话框中输入筛选条件。假设等级字段叫GRADE,类型为短整型,表达式写成:
"GRADE" = 1点OK后,这个类就只对等级为1的河流生效了。同理,“一级支流”对应"GRADE" = 2,“二级支流”对应"GRADE" = 3。如果字段是文本型,就写成:
"GRADE" = '干流'注意ArcMap的SQL语法基本是双引号括字段名,单引号括文本值,这是很多人出错的点。ArcGIS Pro里的写法逻辑一样,只是界面和字段引用方式略有区别,稍后我会单独说。
这里有一个小技巧:每个类除了可以设置SQL条件,还可以单独设置标注表达式。比如干流类别里,你想在名称下面再加一行“干流”字样,可以在Expression按钮里写类似[NAME] & vbNewLine & "干流"的VBA表达式(ArcMap里),或者[NAME] + " " + "干流"(Python表达式)。这样干流和支流在显示内容上也能区分开。
3.3 第三步:为每个等级单独设置字体、字号、颜色和放置方式
这一步是视觉主次分离的关键。我做的河网分级标注,配置大概是这样的:
- 干流(等级1):黑体或宋体加粗,字号11,颜色深蓝,标注间隔稍大,保证每段干流至少能看到一次名字;
- 一级支流(等级2):宋体,字号9,颜色中蓝;
- 二级支流(等级3):宋体,字号8,颜色浅蓝;
- 三级支流(等级4):不设标注,直接停用,只保留线条可见。
字号从11到8,配合颜色深浅,图上很容易形成“主干突出、支线退后”的层次感。很多人配置到这一步就结束了,但我想特别提醒:一定不要忽略Placement Properties这个按钮。
线要素的标注放在哪里,直接决定图面的是否整齐。河流标注我建议选“Curved”(曲线放置),让文字顺着河流走向排布,不要用“Horizontal”,否则一条南北向的河流上,标注会横着摆在河边,非常难看。在Curved模式下,还可以设置“Label Offset”(标注偏移量),比如设为1-2磅,让文字不要死死压在线符号上,读起来更清爽。
3.4 第四步:配置压盖优先级,让主河标注压过支流
分类标注做好了,不代表压盖问题自动解决。如果两个级别的标注在图上发生了位置冲突,最终谁能留下来,取决于标注权重。
在ArcMap里,先确认你已经使用了Maplex标注引擎:在视图菜单的Toolbars里勾选Labeling,打开Labeling工具条,点开Labeling Settings,确保“Use Maplex Label Engine”是勾选状态。Maplex的冲突处理能力比标准引擎强很多,没有它,后面的优先级设置基本发挥不了作用。
然后对每个标注类单独设置放置属性。在Layer Properties的Labels选项卡里,选中“干流”类,点Placement Properties按钮,在Maplex设置中找到“Placement Priority”或“Label Weight”,把干流的优先级设为1(最高),一级支流设为3,二级支流设为5。这样一旦支流的名字和干流的名字在图上“争地盘”,系统会优先保留干流的标注,把支流的暂时隐藏或后置。
我实测下来的感受:设置权重之后的图面和之前完全是两个质的差别。支流标注自动“让路”给干流,整张河网图的阅读顺序一下子就顺了。权重冲突解决是Maplex最值得研究的功能之一,如果你只是简单用标准引擎,哪怕分类标注配置得再好,还是会遇到标注互相叠压的尴尬。
3.5 第五步:用显示比例尺范围控制标注密度,让出图更干净
除了分类分级,我还强烈建议配置每个类的Scale Range,也就是可见比例尺范围。入口在Placement Properties旁边,有一个“Scale Range”按钮,或者直接在标签类属性里找。
我的习惯是:干流标注的可见范围设置为从1:1,000,000到1:5,000,一级支流设置为1:500,000到1:5,000,二级支流只在1:100,000以内显示。这样做的效果就是——你缩小视图到全省范围时,图上只有干流和一级支流的名字,不会密密麻麻;放大到某个县市时,二级支流、三级支流的标注才陆续出现。
这个“随缩放级别动态显示”的机制在制图缩放时极其有用。尤其是做Web地图发布或者做PDF大图输出时,它能帮你省掉大量人工整理标注的工作量。类似的工作,如果放在ArcGIS Pro里,是通过Label Class的Scale Range来设置的,路径略有不同,逻辑完全一致。
4. 从标注到出图:符号联动、比例尺换挡与注记化微调
4.1 让线符号和标注走同一套分级逻辑
标注做完分级后,你会发现另一个问题:线符号还是老样子,所有河流一样粗细、一样颜色,和分层标注的视觉逻辑对不上。如果你把干流标得又大又深,结果线符号跟支流一样细,图面的主次感还是出不来。
解决方案很简单:在Symbology选项卡里,用“Categories → Unique Values”按同样字段做唯一值渲染。比如按GRADE字段设置:
- 等级1的线宽设为1.8,线色深蓝;
- 等级2的线宽设为1.0,线色中蓝;
- 等级3的线宽设为0.6,线色浅蓝。
这样符号系统和标注系统用的是同一套字段、同一套逻辑,图上才能实现“重要要素又粗又明显、名字又大又清晰”,次要要素“又细又淡、名字也小”。实际上这个组合才算是完整的河流分级显示。
4.2 如何把比例尺“换挡”和分类标注结合
如果你要出一张多尺度地图,比如从一个完整流域图切换到某个局部河网图,把3.5步的比例尺范围用透,出图会非常流畅。我个人的“换挡”配置参考:
| 显示范围 | 干流标注 | 一级支流标注 | 二级支流标注 | 三级支流标注 |
|---|---|---|---|---|
| 1:1,000,000以上 | 显示 | 隐藏 | 隐藏 | 隐藏 |
| 1:500,000至1:200,000 | 显示 | 显示 | 隐藏 | 隐藏 |
| 1:100,000以下 | 显示 | 显示 | 显示 | 隐藏 |
| 1:50,000以下 | 显示 | 显示 | 显示 | 显示(可选用极浅色) |
这个配置不是死的,具体要看你的图幅和承载信息量。但大原则很明确:制图视野越小,可显示的要素越少;视野越大,越要舍弃次要标注,保证主干信息突出。
4.3 定稿前把标注转成注记,保留最后的人工微调余地
分类标注是动态规则,它的好处是灵活,但缺点是“不一定完全长在你想要的位置上”。哪怕Maplex再智能,有些地方它觉得合适,你看上去就是别扭。比如河流拐弯处、标注和地形线交叉处,偶尔需要人工微调。
这时候就到转了。在ArcMap中,右键图层 → Convert Labels to Annotation。转换时,每个标注类别会自动生成一个注记组(Annotation Group),这太方便了,因为你可以整体调整“干流注记组”的样式,而完全不影响“支流注记组”。转完之后,标注就变成了独立的图形要素,你可以逐条拖动、旋转、修改文字内容,自由度接近CAD。
不过要提醒:一旦转成注记,就和原始属性表“断奶”了。如果后续数据有修改,注记不会自动更新。所以我的建议是——转注记这事一定要放在项目基本定稿之后再做,千万不要一上来就转,否则后面数据改一次,你就要重新转一次,纯属浪费时间。
5. 排查清单:分类标注没生效时的常见检查点
5.1 建了类别却没生效,问题多半在“作用域”
有朋友跟我说,他照着教程建了好几个类,也写了SQL,但图上还是只有一个样式的标注。我远程一看,发现他一直在“ ”这个默认类上修改文字符号,新建的类根本没选中。
这是ArcMap的常见误解:Label Classes区域下方有个下拉列表,你改了字号、颜色,到底改的是哪个类,要看拉列表当前选中的是谁。如果你的所有改动都落在了“ ”上,而你的SQL类都排在它前面,那默认类设得再好,被SQL类筛走的要素也用不上。
判断方法很简单:把每个类的文字符号设为完全不同的颜色,比如干流用红色、支流用绿色,然后刷新视图,一眼就能看出来哪些类生效了、哪些没有。
5.2 SQL条件写错类型,筛选结果全空
这是一个非常容易踩的坑,尤其是字段值是数字,但在界面里看起来像文本的那种字段。比如字段类型是Text,存的值为“1”、“2”,你却写SQL"GRADE" = 1不带单引号,结果就是这个类筛不到任何要素,标注完全空白。
反过来也一样,字段类型是数值型,你写"GRADE" = '1',照样匹配不上。所以SQL的第一步永远是:查看字段类型。还有一个保险的办法,是在SQL对话框左下角点击“Get Unique Values”,让系统列出这个字段所有的唯一值。如果列出来的值都带着引号,就是文本型;没带引号的,就是数值型。照着系统给的写法抄,基本不会错。
5.3 空值字段导致要素“消失”于所有类别
如果你的等级字段存在空值,而这些要素你又希望显示标注,那么它们不属于任何一个SQL类。分类标注在这个时候会“安静地忽略”它们,图上这些河流就没有名字。
解决办法有两个:一是在数据层面,先用字段计算器把空值赋为一个具体的等级值,比如“其他”,再单独创建一个“其他”标注类;二是在“ ”类里设置一个兜底样式,让没被任何SQL类命中的要素使用最弱化的标注。这个兜底方案很实用,我经常保留一个浅灰色小字号的默认类,专门承接空值和异常值。
5.4 分类标注还是会互相压盖,权重与压盖阈值没调到位
如果你配置了Maplex,设置了优先级,但图上还是有压盖,这时候要检查两个地方。一是所有类别是否都设置了合理的Placement Priority,优先级差距要拉开,如果干流是1、支流也是1,那等于没设置。二是Maplex里的“Conflict Resolution”是否开启,以及“Label Weight”的数值是否足以触发冲突避让。注意,Maplex不是“绝对不压盖”,它是在尽量满足放置规则的前提下,优先放弃一些低优先级的标注。如果你希望低优先级标注完全不被放置,可以在Maplex设置里提升低权重标签的最小可见尺寸,或者直接对低等级类开启“Don't show labels when zoomed out beyond…”的比例尺限制。
5.5 ArcMap与ArcGIS Pro的主要差异
| 功能点 | ArcMap | ArcGIS Pro |
|---|---|---|
| 创建新的标注类别 | 图层属性 → Labels → 点击Add | 右键图层 → Labeling Properties → 点击加号 |
| SQL过滤条件 | 点击SQL Query按钮,双引号字段名 | 在Label Class中的SQL选项卡,语法逻辑一致 |
| 标注权重/优先级 | 在Placement Properties的Maplex设置中 | 在Labeling选项卡 → Label Priority中设置 |
| 每个类的动态开关 | 通过Label Classes下拉列表选中再操作 | 内容窗格中每个Label Class前有可见性开关 |
| 转注记 | 右键图层 → Convert Labels to Annotation | 在Labeling选项卡 → Convert Labels to Annotation |
如果你是新项目,我建议直接用ArcGIS Pro。界面虽然跟ArcMap不一样,但底层逻辑一致,而且Pro的标注引擎在性能和实时反馈上更强。如果你还在用ArcMap做生产,也先别急着迁移,这套分类标注流程在10.x版本里一样成熟稳定,按上面的路径操作即可。
最后再分享一个我做水文制图多年的习惯:每次配置完分类标注,我都会保存一个带有标注配置的图层文件(.lyr或.lyrx),这样下次使用同一套数据时,直接拖进地图就能复用所有标注规则,不用重新设置。这个习惯在我处理多个年份、多个区域的水系数据时,帮我节省了大量重复劳动。