8.6 矢量图层点要素基于规则(Rule-based)渲染使用

178 阅读2分钟

前言

  • 前面介绍了矢量-点要素-单一符号、矢量-点要素-分类符号以及矢量-点要素-分级符号的使用
  • 本章介绍如何使用基于规则的渲染
  • 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps

基于规则(Rule-based)

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

  • 以myplaces.shp为例,分别介绍在QGis和二次开发中如何使用基于规则渲染
  • 图层属性表中有一个字段IS_TOWN,使用该字段演示Rule Based Renderer 在这里插入图片描述

QGis

  • 图层属性框渲染器改为Rule Based,如下图 在这里插入图片描述
  • 在规则列表中编辑生成的规则,如下图 在这里插入图片描述
  • 新建一条规则,如下图 在这里插入图片描述 在这里插入图片描述
  • 规则设置完成之后,效果如下图 在这里插入图片描述

代码实现

  • QgsRuleBasedRenderer是基于规则的渲染器,详细内容见文档,类图如下 在这里插入图片描述
  • 以下是实现基于规则渲染的步骤
  1. 获取分类渲染器:从图层获取渲染器并转换为分类渲染器,代码如下:
    //从图层获取分类渲染器
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsRuleBasedRenderer *ruleBasedRenderer = QgsRuleBasedRenderer::convertFromRenderer(layerRenderer);

2. 添加规则:类QgsRuleBasedRenderer::Rule代表一条规则,详细见文档 3. 规则需要设置表达式用于筛选数据,Rule类的函数setFilterExpression用于设置表达式 4. 针对每条规则,还可以设置规则的符号,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 );

5. 规则添加到渲染器

    //将规则添加到renderer中
    ruleBasedRenderer->rootRule()->appendChild(ifrule);

6. 添加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软件以及二次开发实现基于规则的渲染。