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

文章目录

  • 前言
  • 基于规则(Rule-based)
    • QGis
    • 代码实现
  • 总结

前言

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

基于规则(Rule-based)

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

  • 以myplaces.shp为例,分别介绍在QGis和二次开发中如何使用基于规则渲染
  • 图层属性表中有一个字段IS_TOWN,使用该字段演示Rule Based Renderer
    8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第1张图片

QGis

  • 图层属性框渲染器改为Rule Based,如下图
    8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第2张图片
  • 在规则列表中编辑生成的规则,如下图
    8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第3张图片
  • 新建一条规则,如下图
    8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第4张图片
    8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第5张图片
  • 规则设置完成之后,效果如下图
    8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第6张图片

代码实现

  • QgsRuleBasedRenderer是基于规则的渲染器,详细内容见文档,类图如下
    8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第7张图片
  • 以下是实现基于规则渲染的步骤
  1. 获取分类渲染器:从图层获取渲染器并转换为分类渲染器,代码如下:
    //从图层获取分类渲染器
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsRuleBasedRenderer *ruleBasedRenderer = QgsRuleBasedRenderer::convertFromRenderer(layerRenderer);
  1. 添加规则:类QgsRuleBasedRenderer::Rule代表一条规则,详细见文档
  2. 规则需要设置表达式用于筛选数据,Rule类的函数setFilterExpression用于设置表达式
  3. 针对每条规则,还可以设置规则的符号,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 );
  1. 规则添加到渲染器
    //将规则添加到renderer中
    ruleBasedRenderer->rootRule()->appendChild(ifrule);
  1. 添加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);

8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第8张图片
8.6 矢量图层点要素基于规则(Rule-based)渲染使用_第9张图片

总结

  • 分别介绍了使用QGis软件以及二次开发实现基于规则的渲染。

你可能感兴趣的:(qgis二次开发,qgis二次开发,qgis符号)