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();
相关推荐
fpcc10 小时前
c++编程实践—堆和栈越界调试
c++
weiabc11 小时前
MSYS2 UCRT64 + g++ C++ 中文输出乱码 完整全过程
c++
灯澜忆梦13 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
aqiu11111114 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
chenbingjie_c15 小时前
C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
数据结构·c++
hetao173383718 小时前
2026-10-08 hetao1733837 的刷题记录
c++·算法
Frank_refuel18 小时前
【C++】智能指针
开发语言·c++
一只旭宝19 小时前
数据结构与算法复习手册:从写过,到讲清楚
开发语言·数据结构·c++·算法
十五年专注C++开发19 小时前
std::filesystem::exists 在有的win10系统抛异常原因分析
c++·文件系统·filesystem
hetao173383720 小时前
2026-10-07 hetao1733837 的刷题记录
c++·算法