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();
相关推荐
郝学胜-神的一滴9 小时前
中级OpenGL教程 022:探秘三维世界的血脉传承——物体父子关系与矩阵递归奥义
c++·线性代数·unity·矩阵·游戏引擎·unreal engine·opengl
ch0sen1pm9 小时前
刚学完 CAS 原子操作,我花了一晚上写了三个无锁队列
c++
qeen879 小时前
【C++】vector的模拟实现详解(二)
c++·学习·算法·迭代器·stl
j7~10 小时前
【C++】C++ 继承全解析:从基本语法到菱形继承的底层原理
开发语言·c++·继承·组合·虚继承·#暑假·七月创作之星博客挑战赛
数行拙笔10 小时前
C++客户端---String类型
开发语言·c++·bootstrap
草莓熊Lotso10 小时前
【Linux网络】深入理解Linux IO多路复用:从本质到select服务器实战
linux·运维·服务器·c语言·网络·数据库·c++
selfsongs1 天前
指针、内存管理、现代 C++ 特性
c++
吃着火锅x唱着歌1 天前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习
2401_841495641 天前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
小保CPP1 天前
OCR C++ Tesseract按行识别字符
c++·人工智能·ocr·模式识别·光学字符识别