在不同的规则(表达式筛选、特定的分辨率)下,使用不同的符号方案。






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);
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);

