QGIS规则标注具体怎么做?复杂标签咋设?

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

很多同学在做专题图时会问:QGIS规则标注具体怎么做?复杂标签咋设? 这篇文章就围绕一个实际问题来讲:同一图层里,不同类别、不同等级、不同字段条件的要素,如何用 QGIS 规则标注分别设置标签内容、字体、颜色、优先级和显示比例。

引言:为什么要用 QGIS规则标注

普通标注只能给一个图层设置一套统一标签样式。比如所有道路都显示道路名,所有点位都用同一种字体。这在简单地图里够用,但在城市道路、水系、行政区、监测点、管线等数据中,经常会遇到更复杂的需求。

  • 主干道标签要加粗,支路标签要变小。
  • 只标注等级大于 2 的河流,不标注沟渠。
  • 重点监测点显示名称和监测值,普通点只显示编号。
  • 小比例尺只显示重要地名,大比例尺再显示全部地名。
  • 不同类型地物要使用不同颜色、字体和偏移方式。

这些需求都适合用 QGIS规则标注 完成。它的核心思路是:给同一个图层建立多条标注规则,每条规则用表达式筛选要素,再分别设置标签内容和样式。

QGIS规则标注和QGIS复杂标签设置示意图
QGIS 基于规则的标注适合按字段、等级、比例尺分别控制标签样式。

背景:QGIS复杂标签设置常见场景

在 QGIS 中,复杂标签通常不是一个单独按钮能解决的,而是由几类功能组合完成:

  • 基于规则的标注:按字段条件筛选要标注的要素。
  • 表达式标注:把多个字段、文本、换行、条件判断组合成标签内容。
  • 数据定义覆盖:让字体大小、颜色、旋转角度、偏移量等参数由字段或表达式控制。
  • 比例尺可见性:控制标签在不同缩放级别是否显示。
  • 标注优先级与避让:减少标签重叠,提高重要要素的显示概率。

如果你的需求是“同一个图层里分不同类别标注”,优先考虑 QGIS规则标注;如果需求是“同一个标签里拼接多个字段”,重点使用表达式;如果需求是“每个要素标签大小或颜色都不一样”,则要用数据定义覆盖。

原理:QGIS规则标注是怎么工作的

QGIS规则标注的逻辑可以理解为“条件筛选 + 独立样式”。每一条规则通常包含三部分:

  1. 过滤表达式:判断哪些要素进入这条规则,例如 "road_class" = '主干道'
  2. 标签内容:决定显示什么文字,例如 "name""name" || 'n' || "code"
  3. 标签样式:决定字体、字号、颜色、缓冲、位置、比例尺范围等。

当 QGIS 渲染地图时,会逐个要素判断它符合哪些规则。符合规则的要素会按照对应的标签设置进行显示。因此,规则写得越清晰,标注结果越稳定,也越容易排查问题。

建议把规则标注理解成“给标签做分类渲染”。符号系统负责地物怎么画,规则标注负责文字怎么显示。

步骤:QGIS规则标注具体怎么做

1. 准备用于分类标注的字段

先打开图层属性表,确认是否有可用于规则判断的字段。常见字段包括:

  • name:名称字段,用于标签文字。
  • type:类别字段,例如学校、医院、公园。
  • level:等级字段,例如 1、2、3。
  • road_class:道路等级字段,例如高速、主干道、支路。
  • pop:人口或规模字段,可用于控制标注重要性。

如果字段值不规范,例如同一个类别里同时存在“主干道”“主干路”“main road”,建议先用字段计算器或属性表编辑统一字段值。规则标注依赖字段判断,字段越干净,规则越简单。

2. 打开基于规则的标注

  1. 在 QGIS 图层面板中右键目标图层。
  2. 选择 属性
  3. 进入 标注 页面。
  4. 在顶部标注方式中选择 基于规则的标注
  5. 点击添加规则按钮,新建第一条规则。

如果你只看到“单一标注”或“无标注”,说明当前还没有切换到基于规则的标注模式。规则标注需要在标注页面顶部进行切换。

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规则标注搭建分类框架,再用表达式控制标签内容,最后只在必要时使用数据定义覆盖。不要一开始就把所有逻辑写进一个超长表达式,否则后期很难排查。

检查清单:发布地图前逐项确认

  • 是否明确了主标签字段,例如 namecodeid
  • 规则表达式是否能正确筛选要素。
  • 各规则之间是否存在不必要的重叠。
  • 重要标签是否设置了更高优先级。
  • 支路、小河流、普通点位是否设置了合适的比例尺范围。
  • 标签缓冲是否足够清晰,但不过度遮挡底图。
  • 空值字段是否用 CASEcoalesce 做了处理。
  • 打印布局和地图画布中的显示效果是否一致。
  • 导出 PDF、PNG 或 SVG 后,中文字体是否正常。
  • 如果用于 WebGIS,是否测试了不同缩放级别下的标签密度。

FAQ:QGIS规则标注常见问题

QGIS规则标注和分类符号有什么区别?

分类符号控制地物本身怎么画,例如道路线颜色、面填充颜色。QGIS规则标注控制文字怎么显示,例如标签内容、字号、颜色和可见比例尺。两者可以使用相同字段,但作用对象不同。

QGIS复杂标签设置可以显示多个字段吗?

可以。可以用表达式拼接多个字段,例如 "name" || 'n' || "code"。如果字段可能为空,建议使用 CASE 判断,避免出现空行或 NULL 文本。

为什么规则写对了,标签还是不显示?

常见原因有四个:标签字段为空、比例尺范围不匹配、标签被避让隐藏、图层标注没有启用。可以先把标签值改成 $id,再关闭比例尺限制和避让设置进行测试。

一个要素能同时命中多条标注规则吗?

可以。如果规则条件有重叠,一个要素可能被多次标注。除非你确实需要多重标签,否则建议让规则条件互斥,避免重复显示。

QGIS规则标注适合大数据量图层吗?

可以用,但要控制规则数量和标签密度。对于几十万级要素,建议先按比例尺限制显示,必要时创建筛选图层、建立空间索引,或只标注重要等级要素。

复杂标签是否会影响 QGIS 渲染速度?

会。复杂表达式、过多规则、密集标签、启用缓冲和阴影都可能增加渲染开销。制图时应优先保证规则清晰和标签必要性,不要对所有要素都强制显示复杂标签。

结论:先拆规则,再调样式,最后优化显示

QGIS规则标注的关键不是记住某个按钮,而是把复杂标签需求拆成清晰规则:哪些要素要标注,显示什么内容,用什么样式,在什么比例尺下显示。掌握这个思路后,主干道和支路分级标注、点位多字段标注、重点要素高优先级显示,都可以稳定实现。

实际项目中,建议从三步开始:先按字段建立规则,再用表达式完善标签内容,最后用优先级、比例尺和避让参数优化版面。这样做出来的 QGIS复杂标签设置更容易维护,也更适合专题制图、成果出图和 WebGIS 数据预处理。