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();
相关推荐
凯瑟琳.奥古斯特2 小时前
C++变量与基本类型精解
开发语言·c++
想唱rap2 小时前
UDP套接字编程
服务器·网络·c++·网络协议·ubuntu·udp
来日可期13143 小时前
计算机存储视角下的有符号数:不止是“正负”那么简单
c++
愚者游世3 小时前
variadic templates(可变参数模板)各版本异同
开发语言·c++·程序人生·面试
徐新帅3 小时前
4181:【GESP2603七级】拆分
c++·学习·算法·信奥赛
无忧.芙桃3 小时前
现代C++精讲之处理类型
开发语言·c++
黎梨梨梨_3 小时前
C++入门基础(下)(重载,引用,inline,nullptr)
开发语言·c++·算法
khalil10204 小时前
代码随想录算法训练营Day-34动态规划03 | 01背包问题 二维、01背包问题 一维、416. 分割等和子集
数据结构·c++·算法·leetcode·动态规划·背包问题·01背包
前进吧-程序员4 小时前
C++ 内存到底分配在哪?
java·jvm·c++