QGIS 几何生成器怎么用:动态符号、表达式变量与布局一致性

同一份道路数据,屏幕上想显示两侧缓冲带,布局图上又要随比例尺变细;如果先导出一堆临时图层,项目文件很快难以维护。QGIS 几何生成器能在渲染时根据表达式派生点、线、面,但它也容易把显示逻辑误当成分析成果。本文讲清它适合做什么,以及怎样让地图画布和布局一致。
QGIS 几何生成器:先把问题拆成可验证的环节
GIS 工具往往能在几秒内给出一个结果,但“工具成功运行”并不等于结果可用。处理前先固定 数据版本、CRS、几何类型、字段语义和容差/尺度;处理后再核对数量、范围、面积或统计量。把这两组检查写进流程,问题才不会在交付阶段才暴露。
它只改变渲染几何
几何生成器通常不写回数据源,属性表和空间分析仍使用原几何。这正适合做偏移线、端点、标注背景等视觉表达,但不适合替代需要交付的真实缓冲区。
表达式的单位取决于 CRS 与上下文
buffer($geometry, 10) 的 10 在投影坐标中通常是米,在经纬度中却是度。与比例尺相关的显示还需考虑 @map_scale 等变量,不能只在一个视图里看起来合适。
符号层顺序决定视觉关系
生成器输出的面、线、点应安排在正确符号层;否则缓冲面可能盖住原线,或端点被后续层遮挡。先做最小样式,再逐层叠加。
可执行实操流程
- 明确目标是“显示派生几何”还是“生成分析数据”;后者应使用处理工具输出真实图层。
- 在一个样本图层添加几何生成器符号层,选择目标几何类型,先写最简单的 $geometry 或 centroid($geometry) 验证。
- 逐步加入 buffer、offset_curve、collect 或条件表达式;每次只增加一个变量并在表达式预览中检查空值。
- 分别在地图画布与打印布局中测试常用比例尺,必要时用 @map_scale 设置分段样式。
- 保存 QML 样式和表达式说明;交付前在另一台机器加载项目,确认字段、变量和字体依赖完整。
CASEn WHEN "road_class" = 'primary'n THEN buffer($geometry, 12)n ELSE buffer($geometry, 6)nEND
项目避坑与质量检查
几何生成器最容易造成“看起来做过分析”的误解。图例、方法说明和数据包必须明确它是渲染派生;若项目需要提供缓冲区面积或空间叠加结果,务必另行生成可保存的面要素。
| 检查项 | 合格信号 | 异常时优先排查 |
|---|---|---|
| 输入一致性 | 范围、CRS、字段含义可解释 | 数据源、坐标定义、空值 |
| 处理结果 | 数量与关键统计量符合预期 | 参数、分组条件、单位 |
| 空间抽检 | 边界与典型位置无明显异常 | 容差、精度、几何有效性 |
把参数选择变成可复现的判断
面对不同数据批次,不要只沿用上一次的参数。先选一个包含正常、边缘和异常样本的小范围,分别记录候选参数下的数量、范围、关键统计值与肉眼可识别的空间差异。将选择理由和被否决方案一起保存,下一次数据更新时才能快速判断是否仍在同一适用边界内。
尤其要区分数据质量问题、参数不适配和业务规则变化:三者的修正位置不同。把源数据错误靠放宽参数掩盖,短期省事,长期会让结果无法解释。
建议把“处理前后要比什么”写入项目 README。 这比保存一串截图更能让同事复跑,也能在数据更新时迅速判断差异究竟来自源数据还是算法。
FAQ
几何生成器会修改原始数据吗?
通常不会,它是符号渲染层。需要永久几何时请使用处理工具导出结果。
为什么 buffer 距离明显不对?
优先检查图层 CRS;地理坐标单位是度,不应用于以米为单位的缓冲表达式。
如何保证布局与画布相同?
在布局实际比例尺下检查,并避免依赖只在画布存在的临时变量或选择集。
总结
把几何生成器当成可编程制图,而不是隐形的分析工具;显示和数据成果分清后,样式才既灵活又可信。真正可靠的 GIS 成果不是某一次按钮点击后的图层,而是一套知道输入边界、参数理由和复核证据的可复现流程。