QGIS 规则化符号怎么配:条件优先级、空值处理与多比例尺复核

同一张管网图里,主管、支管、停用段和待核查要素往往需要不同表达。若只靠一个分类字段,遇到状态叠加、空值和缩放变化时就会失真;若规则随手叠加,又会出现同一要素被画两次。QGIS 的规则化符号能表达复杂业务逻辑,但必须像写程序一样管理优先级、覆盖范围和验收样本。
规则是有顺序的筛选条件
一个要素可能同时满足多个规则。需要独占展示时,应让条件互斥或使用 ELSE;允许叠加时则要明确每层承担的是底线、描边还是告警标记。
空值不是默认类别
NULL、空字符串和未知编码代表不同数据状态。把它们自动染成普通类别会掩盖数据治理问题,应单独设置醒目的待核查规则。
比例尺改变信息密度
小比例尺仍画出所有支线,地图会变成色带;大比例尺过早隐藏细节,又会误导巡检。规则应配合 scale range 和简化的层级策略。
表达式必须可读可测
复杂 CASE 与正则可实现一切,但难维护。应将业务判断拆成命名清楚的小规则,并在表达式预览中逐条统计命中数。
可执行实操流程
- 整理字段字典,明确管径、材质、运行状态和数据质量标记的优先顺序;先写出业务语言,再翻译为表达式。
- 在样本图层中创建互斥规则:停用或异常优先,其次主管,再到普通支管;为未知值配置独立颜色与线型。
- 对每条规则查看过滤命中数,确认规则总数、ELSE 数和图层总要素数关系可解释。
- 分别在常用浏览尺度和布局输出尺度检查线宽、标记间距与重叠;必要时在小比例尺仅保留骨干层。
- 保存 QML 与规则说明,换一份新数据加载后检查新增编码是否落入未知规则,而非静默套用旧样式。
CASE
WHEN "status" IN ('closed','unknown') THEN true
WHEN "diameter" IS NULL THEN true
ELSE false
END
项目避坑与质量检查
许多项目只检查“主干看起来对”,却没有检查错误编码是否被正常规则吃掉。我会在规则最末放置一个明显的 ELSE 样式,并要求交付前其命中数为零或有解释。这样新批次出现拼写、空格或未登记编码时,地图会主动暴露问题。
| 检查阶段 | 必须保留的证据 | 异常处理 |
|---|---|---|
| 输入 | 字段值域、空值和未知编码数量 | 隔离异常样本,不直接覆盖源数据 |
| 处理 | 每条规则命中数与重叠关系 | 回到参数、单位与筛选条件逐项复现 |
| 交付 | 三种比例尺截图与新数据加载结果 | 用独立样本或第二个环境复核 |
让流程能被下一位同事复跑
样式文件旁应有一页规则清单:每条规则对应的业务含义、优先级、比例尺范围和未知值策略。符号不是装饰,它是数据质量与业务状态的可视化接口。
把源数据批次、坐标参考、关键参数、异常清单和前后统计放在同一份处理记录中。这样数据更新时,团队判断的是结果差异来自哪里,而不是重新猜测上一次做过什么。
抽样复核与交接记录
发布前还应把同一套 QML 同时加载到完整数据和只含边缘样本的数据上:前者检查规则覆盖率,后者检查狭窄管段、短小要素与空值是否仍清晰可辨。并在打印布局中确认线型和颜色没有因导出分辨率而改变。若图例无法解释所有可见符号,说明规则层级仍需要收敛。
FAQ
规则顺序会影响结果吗?
会。尤其使用 ELSE 或多个符号层时,顺序决定哪些条件先被消费、哪些图层覆盖在上面。
NULL 和空字符串怎么写?
NULL 用 IS NULL 判断,空字符串需单独判断。两者都应有明确的业务处理,不要混为一类。
如何防止新编码被误画?
设置显眼的 ELSE 或未知值规则,并在每次数据更新后检查其命中数。
总结
规则化符号的关键是把业务优先级和异常状态显式画出来。能看见未知值的地图,才是可持续维护的地图。