QGIS规则标注具体怎么做?复杂标签咋设?
很多同学在做专题图时会问:QGIS规则标注具体怎么做?复杂标签咋设? 这篇文章就围绕一个实际问题来讲:同一图层里,不同类别、不同等级、不同字段条件的要素,如何用 QGIS 规则标注分别设置标签内容、字体、颜色、优先级和显示比例。
引言:为什么要用 QGIS规则标注
普通标注只能给一个图层设置一套统一标签样式。比如所有道路都显示道路名,所有点位都用同一种字体。这在简单地图里够用,但在城市道路、水系、行政区、监测点、管线等数据中,经常会遇到更复杂的需求。
- 主干道标签要加粗,支路标签要变小。
- 只标注等级大于 2 的河流,不标注沟渠。
- 重点监测点显示名称和监测值,普通点只显示编号。
- 小比例尺只显示重要地名,大比例尺再显示全部地名。
- 不同类型地物要使用不同颜色、字体和偏移方式。
这些需求都适合用 QGIS规则标注 完成。它的核心思路是:给同一个图层建立多条标注规则,每条规则用表达式筛选要素,再分别设置标签内容和样式。

背景:QGIS复杂标签设置常见场景
在 QGIS 中,复杂标签通常不是一个单独按钮能解决的,而是由几类功能组合完成:
- 基于规则的标注:按字段条件筛选要标注的要素。
- 表达式标注:把多个字段、文本、换行、条件判断组合成标签内容。
- 数据定义覆盖:让字体大小、颜色、旋转角度、偏移量等参数由字段或表达式控制。
- 比例尺可见性:控制标签在不同缩放级别是否显示。
- 标注优先级与避让:减少标签重叠,提高重要要素的显示概率。
如果你的需求是“同一个图层里分不同类别标注”,优先考虑 QGIS规则标注;如果需求是“同一个标签里拼接多个字段”,重点使用表达式;如果需求是“每个要素标签大小或颜色都不一样”,则要用数据定义覆盖。
原理:QGIS规则标注是怎么工作的
QGIS规则标注的逻辑可以理解为“条件筛选 + 独立样式”。每一条规则通常包含三部分:
- 过滤表达式:判断哪些要素进入这条规则,例如
"road_class" = '主干道'。 - 标签内容:决定显示什么文字,例如
"name"或"name" || 'n' || "code"。 - 标签样式:决定字体、字号、颜色、缓冲、位置、比例尺范围等。
当 QGIS 渲染地图时,会逐个要素判断它符合哪些规则。符合规则的要素会按照对应的标签设置进行显示。因此,规则写得越清晰,标注结果越稳定,也越容易排查问题。
建议把规则标注理解成“给标签做分类渲染”。符号系统负责地物怎么画,规则标注负责文字怎么显示。
步骤:QGIS规则标注具体怎么做
1. 准备用于分类标注的字段
先打开图层属性表,确认是否有可用于规则判断的字段。常见字段包括:
name:名称字段,用于标签文字。type:类别字段,例如学校、医院、公园。level:等级字段,例如 1、2、3。road_class:道路等级字段,例如高速、主干道、支路。pop:人口或规模字段,可用于控制标注重要性。
如果字段值不规范,例如同一个类别里同时存在“主干道”“主干路”“main road”,建议先用字段计算器或属性表编辑统一字段值。规则标注依赖字段判断,字段越干净,规则越简单。
2. 打开基于规则的标注
- 在 QGIS 图层面板中右键目标图层。
- 选择 属性。
- 进入 标注 页面。
- 在顶部标注方式中选择 基于规则的标注。
- 点击添加规则按钮,新建第一条规则。
如果你只看到“单一标注”或“无标注”,说明当前还没有切换到基于规则的标注模式。规则标注需要在标注页面顶部进行切换。
3. 建立第一条规则:主干道标签
以道路图层为例,假设字段 road_class 记录道路等级,字段 name 记录道路名称。可以先建立主干道规则:
"road_class" = '主干道'
标签值设置为:
"name"
然后设置样式:
- 字体:黑体或思源黑体。
- 字号:10 到 12,根据出图比例调整。
- 颜色:深灰或深蓝,避免过于刺眼。
- 缓冲:启用白色缓冲,宽度 1 到 1.5 像素。
- 位置:线图层建议选择沿线标注。
- 优先级:设置为高,保证主干道优先显示。
这样,只有 road_class 等于“主干道”的道路会显示这套标签样式。
4. 建立第二条规则:次干道标签
新增第二条规则,过滤表达式写为:
"road_class" = '次干道'
标签值仍然可以使用:
"name"
但样式应与主干道区分:
- 字号略小,例如 8 到 10。
- 颜色可以使用中灰色。
- 优先级低于主干道。
- 小比例尺下可以不显示,避免标签拥挤。
这就是 QGIS复杂标签设置的基本思路:不是把所有标签塞进一个设置里,而是拆成多条规则分别控制。
5. 建立第三条规则:支路只在大比例尺显示
支路数量多,最容易造成标签重叠。建议在规则中加入比例尺控制。规则表达式可以是:
"road_class" = '支路'
然后在该规则的比例尺可见性中设置只在较大比例尺显示,例如仅在 1:10000 以内显示。具体比例尺要根据你的地图用途调整。
如果你的 QGIS 项目用于 WebGIS 切片或在线地图预览,支路标签尤其要谨慎。过多标签会影响阅读,也可能拖慢渲染。
6. 用表达式制作多行复杂标签
如果标签需要同时显示名称和编号,可以在标签值中使用表达式:
"name" || 'n' || '编号:' || "code"
如果希望字段为空时不显示空行,可以使用条件表达式:
CASE
WHEN "code" IS NOT NULL AND "code" <> ''
THEN "name" || 'n' || '编号:' || "code"
ELSE "name"
END
这个写法在点位标注、管线井编号、监测站名称中很常见。它可以避免出现“编号:NULL”或多余空行。
7. 用条件表达式控制不同字段显示
有些数据里,正式名称字段可能为空,但简称字段有值。可以这样设置标签:
CASE
WHEN "name" IS NOT NULL AND "name" <> '' THEN "name"
WHEN "short_name" IS NOT NULL AND "short_name" <> '' THEN "short_name"
ELSE "id"
END
这种方式适合数据质量不完全一致的项目。它比直接使用单个字段更稳妥,也更适合批量制图。
8. 用数据定义覆盖设置动态字号和颜色
如果你希望不同等级点位使用不同字号,可以在标签字体大小旁边点击数据定义覆盖按钮,输入表达式:
CASE
WHEN "level" = 1 THEN 12
WHEN "level" = 2 THEN 10
ELSE 8
END
如果希望不同类型使用不同颜色,可以在文本颜色的数据定义覆盖中输入:
CASE
WHEN "type" = '学校' THEN color_rgb(30, 90, 200)
WHEN "type" = '医院' THEN color_rgb(200, 40, 40)
WHEN "type" = '公园' THEN color_rgb(40, 150, 80)
ELSE color_rgb(80, 80, 80)
END
数据定义覆盖很适合精细化控制,但也要注意:表达式越复杂,后期维护成本越高。对于初学者,建议先用规则标注拆分逻辑,再逐步加入数据定义覆盖。
常见坑:QGIS规则标注不显示或显示不对怎么办
1. 字段名和字段值写错
QGIS 表达式中,字段名通常用双引号,文本值用单引号。例如:
"type" = '医院'
不要写成:
'type' = "医院"
字段名、文本值、大小写、空格都可能影响判断结果。最稳妥的方式是在表达式编辑器中双击字段名和唯一值,避免手打错误。
2. 标签字段为空
规则命中了要素,但标签字段为空,也会看起来像“没标注”。可以在属性表中检查 name 字段是否为空,或临时把标签值改为 $id 测试规则是否生效。
3. 比例尺限制导致看不到标签
如果设置了比例尺可见性,缩放级别不在范围内时,标签不会显示。排查时可以先关闭比例尺限制,确认标签能显示后再重新设置范围。
4. 标签被避让规则隐藏
QGIS 为了避免标签重叠,会自动隐藏一部分标签。对于重要要素,可以提高标注优先级,或降低其他规则优先级。也可以适当减小字号、增加允许重复距离、调整候选位置。
5. 规则之间条件重叠
如果一个要素同时符合多条规则,可能出现重复标注或样式混乱。例如:
"level" >= 1
和:
"level" = 1
这两条规则会同时命中一级要素。建议规则条件尽量互斥,例如分别写成 "level" = 1、"level" = 2、"level" >= 3。
6. 坐标系和地图单位影响偏移效果
点标签偏移、线标签间距、缓冲大小可能受地图单位、毫米、像素等设置影响。出图时建议明确使用毫米或像素,WebGIS 预览则要结合比例尺测试。
方法比较:单一标注、规则标注和表达式标注怎么选
| 方法 | 适合场景 | 优点 | 注意事项 |
|---|---|---|---|
| 单一标注 | 所有要素使用同一套标签样式 | 设置简单,适合入门 | 无法灵活区分不同类别 |
| QGIS规则标注 | 按类别、等级、条件分别设置标签 | 逻辑清晰,适合专题图 | 规则多时要注意命名和条件互斥 |
| 表达式标注 | 拼接字段、条件显示、多行标签 | 标签内容灵活 | 表达式错误会导致标签异常 |
| 数据定义覆盖 | 按字段动态控制字号、颜色、偏移 | 精细化程度高 | 维护难度较高,建议配合注释和规范字段 |
| 手工移动标签 | 少量重要出图成果 | 版面控制最精确 | 不适合频繁更新和批量制图 |
一般建议是:先用 QGIS规则标注搭建分类框架,再用表达式控制标签内容,最后只在必要时使用数据定义覆盖。不要一开始就把所有逻辑写进一个超长表达式,否则后期很难排查。
检查清单:发布地图前逐项确认
- 是否明确了主标签字段,例如
name、code或id。 - 规则表达式是否能正确筛选要素。
- 各规则之间是否存在不必要的重叠。
- 重要标签是否设置了更高优先级。
- 支路、小河流、普通点位是否设置了合适的比例尺范围。
- 标签缓冲是否足够清晰,但不过度遮挡底图。
- 空值字段是否用
CASE或coalesce做了处理。 - 打印布局和地图画布中的显示效果是否一致。
- 导出 PDF、PNG 或 SVG 后,中文字体是否正常。
- 如果用于 WebGIS,是否测试了不同缩放级别下的标签密度。
FAQ:QGIS规则标注常见问题
QGIS规则标注和分类符号有什么区别?
分类符号控制地物本身怎么画,例如道路线颜色、面填充颜色。QGIS规则标注控制文字怎么显示,例如标签内容、字号、颜色和可见比例尺。两者可以使用相同字段,但作用对象不同。
QGIS复杂标签设置可以显示多个字段吗?
可以。可以用表达式拼接多个字段,例如 "name" || 'n' || "code"。如果字段可能为空,建议使用 CASE 判断,避免出现空行或 NULL 文本。
为什么规则写对了,标签还是不显示?
常见原因有四个:标签字段为空、比例尺范围不匹配、标签被避让隐藏、图层标注没有启用。可以先把标签值改成 $id,再关闭比例尺限制和避让设置进行测试。
一个要素能同时命中多条标注规则吗?
可以。如果规则条件有重叠,一个要素可能被多次标注。除非你确实需要多重标签,否则建议让规则条件互斥,避免重复显示。
QGIS规则标注适合大数据量图层吗?
可以用,但要控制规则数量和标签密度。对于几十万级要素,建议先按比例尺限制显示,必要时创建筛选图层、建立空间索引,或只标注重要等级要素。
复杂标签是否会影响 QGIS 渲染速度?
会。复杂表达式、过多规则、密集标签、启用缓冲和阴影都可能增加渲染开销。制图时应优先保证规则清晰和标签必要性,不要对所有要素都强制显示复杂标签。
结论:先拆规则,再调样式,最后优化显示
QGIS规则标注的关键不是记住某个按钮,而是把复杂标签需求拆成清晰规则:哪些要素要标注,显示什么内容,用什么样式,在什么比例尺下显示。掌握这个思路后,主干道和支路分级标注、点位多字段标注、重点要素高优先级显示,都可以稳定实现。
实际项目中,建议从三步开始:先按字段建立规则,再用表达式完善标签内容,最后用优先级、比例尺和避让参数优化版面。这样做出来的 QGIS复杂标签设置更容易维护,也更适合专题制图、成果出图和 WebGIS 数据预处理。