📌 核心概念
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) |
设置该分类是否启用。 |
📂 核心步骤
-
包含必要的头文件:
cpp#include <qgsvectorlayer.h> #include <qgscategorizedsymbolrenderer.h> #include <qgsrenderercategory.h> #include <qgssymbol.h> #include <qgsmarkersymbol.h> // 或其他符号类型 -
创建或获取矢量图层:
cppQgsVectorLayer *layer = new QgsVectorLayer("/path/to/your/file.shp", "layer_name", "ogr"); -
准备分类列表 :
首先,创建一个空的分类列表。然后,对于你想要的每个类别,从字段中确定其唯一的匹配值(例如
"Category A","Category B"等)。接着,为该值创建一个合适的QgsSymbol对象(例如QgsMarkerSymbol),并设置其视觉样式。最后,使用QgsRendererCategory封装这三者,并将其添加到之前创建的列表中。cppQList<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); -
创建并应用渲染器 :
利用你指定的分类字段和上一步创建的分类列表来实例化渲染器。最后,将这个渲染器设置为目标图层的渲染方式。
cppQgsCategorizedSymbolRenderer* renderer = new QgsCategorizedSymbolRenderer("your_field_name", categories); layer->setRenderer(renderer); -
刷新地图视图 :
应用更改后,务必触发图层重绘,以便在地图上看到最新的渲染结果。
cpplayer->triggerRepaint();