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();
相关推荐
Titan20241 小时前
Linux动静态库
linux·服务器·c++
j_xxx404_2 小时前
MySQL表操作硬核解析:从 CREATE TABLE 到磁盘文件、ALTER TABLE 与 DDL 风险
运维·服务器·数据库·c++·mysql·adb·ai
wuminyu2 小时前
Java锁机制之park和unpark源码剖析
java·linux·c语言·jvm·c++
玖玥拾3 小时前
C/C++ 基础笔记(十一)类的进阶
c语言·c++·设计模式·
-森屿安年-3 小时前
1137. 第 N 个泰波那契数
c++·动态规划
程序员老舅3 小时前
从内核视角,看Linux文件读写过程
linux·服务器·c++·内核·linux内核·vfs·linux内存
Soari4 小时前
llama.cpp更新(b9553):LLM inference in C/C++,本地和云端实现高性能大模型推理
c语言·c++·llama
2601_961194024 小时前
考研资料电子版|去哪找|网盘
java·c语言·c++·python·考研·php
Peter·Pan爱编程4 小时前
23. 算法库:用算法代替手写循环
c++·人工智能·算法
大白话_NOI4 小时前
【洛谷 P1303】A*B Problem + 详细分析
c++