文章目录
- 前言
- 基于规则(Rule-based)
- QGis
- 代码实现
- 总结
前言
- 前面介绍了矢量-点要素-单一符号、矢量-点要素-分类符号以及矢量-点要素-分级符号的使用
- 本章介绍如何使用基于规则的渲染
- 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps
基于规则(Rule-based)
在不同的规则(表达式筛选、特定的分辨率)下,使用不同的符号方案。
- 以myplaces.shp为例,分别介绍在QGis和二次开发中如何使用基于规则渲染
- 图层属性表中有一个字段IS_TOWN,使用该字段演示Rule Based Renderer
QGis
- 图层属性框渲染器改为Rule Based,如下图
- 在规则列表中编辑生成的规则,如下图
- 新建一条规则,如下图
- 规则设置完成之后,效果如下图
代码实现
- 类
QgsRuleBasedRenderer
是基于规则的渲染器,详细内容见文档,类图如下
- 以下是实现基于规则渲染的步骤
- 获取分类渲染器:从图层获取渲染器并转换为分类渲染器,代码如下:
//从图层获取分类渲染器
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsRuleBasedRenderer *ruleBasedRenderer = QgsRuleBasedRenderer::convertFromRenderer(layerRenderer);
- 添加规则:类
QgsRuleBasedRenderer::Rule
代表一条规则,详细见文档 - 规则需要设置表达式用于筛选数据,
Rule
类的函数setFilterExpression
用于设置表达式 - 针对每条规则,还可以设置规则的符号,
Rule
类的函数setSymbol
用于设置符号
//生成一条新规则
QgsSymbol *s = QgsSymbol::defaultSymbol( layer->geometryType() );
QgsRuleBasedRenderer::Rule *ifrule = new QgsRuleBasedRenderer::Rule( s );
//设置表达式
QString filter = QStringLiteral(" \"IS_TOWN\" = 1");
ifrule->setFilterExpression( filter );
//设置图例
ifrule->setLabel( QStringLiteral("TOWN") );
//使用Simple Marker生成符号,然后为新规则设置符号
QVariantMap mp;
mp[QString("name")] = QStringLiteral("circle");
mp[QString("color")] = QStringLiteral("red");
QgsMarkerSymbol *townSymbol = QgsMarkerSymbol::createSimple(mp);
ifrule->setSymbol( townSymbol );
- 规则添加到渲染器
//将规则添加到renderer中
ruleBasedRenderer->rootRule()->appendChild(ifrule);
- 添加else规则:类
Rule
的函数setIsElse(true)
即可
//添加新规则
QgsSymbol *s1 = QgsSymbol::defaultSymbol( layer->geometryType() );
QgsRuleBasedRenderer::Rule *elserule = new QgsRuleBasedRenderer::Rule( s1 );
//因为取值只有0 1,所以直接设置IsElse为true
elserule->setIsElse(true);
elserule->setLabel(QStringLiteral(" Not TOWN"));
//为规则设置符号
mp[QString("color")] = QStringLiteral("black");
QgsMarkerSymbol *nottownSymbol = QgsMarkerSymbol::createSimple(mp);
elserule->setSymbol(nottownSymbol);
总结
- 分别介绍了使用QGis软件以及二次开发实现基于规则的渲染。