QGIS的分类渲染核心类解析

📌 核心概念

QgsCategorizedSymbolRenderer 是 QGIS C++ API 中为矢量图层提供分类渲染功能的关键类。它基于矢量图层中某个特定字段的具体值,为每个值分配一个独有的符号(如颜色、图标等),从而在地图上直观地展示不同要素的分类信息。其核心组成部分如下:

  • 分类 (QgsRendererCategory) :定义了整个渲染器的基础。每个分类对象 (QgsRendererCategory) 会将一个特定的字段值(作为匹配规则)关联到一个具体的符号(用于绘制)和一个图例标签(用于解释)。
  • 符号 (QgsSymbol) :是每个分类的视觉表现形式。对于一个点图层,你通常会创建一个 QgsMarkerSymbol 对象;对于线图层,则使用 QgsLineSymbol;对于面图层,则使用 QgsFillSymbol
  • 字段/表达式 (classAttribute):渲染器会根据这个设置来读取每个地图要素的特定属性或表达式结果,作为分类的依据。

⚙️ 主要方法

核心能力 关键方法 描述
生命周期 QgsCategorizedSymbolRenderer(attrName, categories) 构造函数,创建渲染器实例。可指定用于分类的字段及分类列表。
clone() 创建渲染器的深拷贝副本,用于避免对原始对象的意外修改。
核心逻辑 setClassAttribute(attrName) 设置或更新用于分类的字段(或表达式)。
classAttribute() 获取当前的分类字段名。
categories() 获取渲染器中所有分类的列表。
addCategory(category) 向渲染器中添加一个新的分类(一个 QgsRendererCategory 对象)。
deleteCategory(categoryIndex) 删除指定索引位置的分类。
updateCategoryLabel(catIndex, label) 更新指定索引分类的图例标签。
updateCategorySymbol(catIndex, symbol) 更新指定索引分类的符号。
categoryIndexForLabel(label) 根据给定的标签名查找分类的索引。
categoryIndexForValue(value) 根据给定的字段值查找分类的索引。
渲染与样式 updateColorRamp(colorRamp) 为所有分类应用一个渐进或随机的颜色渐变,无需单独调整每个颜色。
sourceColorRamp() 获取当前使用的颜色渐变对象。

⚙️ QgsRendererCategory 主要方法

核心能力 关键方法 描述
构造 QgsRendererCategory(value, symbol, label, render) 构造函数,创建一个分类。
访问 value() 获取分类匹配的字段值。
symbol() 获取该分类对应的符号。
label() 获取分类的图例标签。
renderState() 判断该分类当前是否启用并被渲染。
修改 setValue(value) 修改分类匹配的字段值。
setSymbol(symbol) 修改分类使用的符号。
setLabel(label) 修改分类的图例标签。
setRenderState(render) 设置该分类是否启用。

📂 核心步骤

  1. 包含必要的头文件

    cpp 复制代码
    #include <qgsvectorlayer.h>
    #include <qgscategorizedsymbolrenderer.h>
    #include <qgsrenderercategory.h>
    #include <qgssymbol.h>
    #include <qgsmarkersymbol.h> // 或其他符号类型
  2. 创建或获取矢量图层

    cpp 复制代码
    QgsVectorLayer *layer = new QgsVectorLayer("/path/to/your/file.shp", "layer_name", "ogr");
  3. 准备分类列表

    首先,创建一个空的分类列表。然后,对于你想要的每个类别,从字段中确定其唯一的匹配值(例如"Category A", "Category B"等)。接着,为该值创建一个合适的 QgsSymbol 对象(例如 QgsMarkerSymbol),并设置其视觉样式。最后,使用 QgsRendererCategory 封装这三者,并将其添加到之前创建的列表中。

    cpp 复制代码
    QList<QgsRendererCategory> categories;
    
    // 为 "Category A" 创建符号和分类
    QgsMarkerSymbol* symbolA = new QgsMarkerSymbol();
    symbolA->setColor(QColor(Qt::red));
    QgsRendererCategory catA("Category A", symbolA, "Category A");
    categories.append(catA);
    
    // 为 "Category B" 创建符号和分类
    QgsMarkerSymbol* symbolB = new QgsMarkerSymbol();
    symbolB->setColor(QColor(Qt::blue));
    QgsRendererCategory catB("Category B", symbolB, "Category B");
    categories.append(catB);
  4. 创建并应用渲染器

    利用你指定的分类字段和上一步创建的分类列表来实例化渲染器。最后,将这个渲染器设置为目标图层的渲染方式。

    cpp 复制代码
    QgsCategorizedSymbolRenderer* renderer = new QgsCategorizedSymbolRenderer("your_field_name", categories);
    layer->setRenderer(renderer);
  5. 刷新地图视图

    应用更改后,务必触发图层重绘,以便在地图上看到最新的渲染结果。

    cpp 复制代码
    layer->triggerRepaint();
相关推荐
智者知已应修善业16 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
Byron Loong19 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
坚果派·白晓明20 小时前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库
咩咦21 小时前
C++学习笔记02:cin 和 cout 输入输出
c++·学习笔记·cin·输入输出·cout
咩咦21 小时前
C++学习笔记05:引用和常引用
c++·学习笔记·引用·const·常引用
香蕉鼠片21 小时前
算法过程中不会的
开发语言·c++
阿旭超级学得完21 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
li星野21 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
磊 子1 天前
多态类原理+四种类型转换+异常处理
开发语言·c++·算法
王老师青少年编程1 天前
csp信奥赛C++高频考点专项训练之字符串 --【回文字符串】:回文拼接
c++·字符串·csp·高频考点·信奥赛·字符串回文·回文拼接