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


    前言

    • 前面介绍了矢量-点要素-单一符号、矢量-点要素-分类符号以及矢量-点要素-分级符号的使用
    • 本章介绍如何使用基于规则的渲染
    • 说明:文章中的示例代码均来自开源项目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);
    
    • 1
    • 2
    • 3
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 规则添加到渲染器
        //将规则添加到renderer中
        ruleBasedRenderer->rootRule()->appendChild(ifrule);
    
    • 1
    • 2
    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    在这里插入图片描述

    总结

    • 分别介绍了使用QGis软件以及二次开发实现基于规则的渲染。
  • 相关阅读:
    Linux 环境定制.bashrc 文件
    Spring AOP 分享
    商场公司怎样利用智能机器人快速联结却不干扰底层
    【Shell编程】| if 判断
    浏览器缓存
    微信小程序上拉触底事件
    计算机毕业设计 SSM+Vue线上医疗咨询管理系统 网上医疗问诊系统 线上医疗健康咨询系统Java Vue MySQL数据库 远程调试 代码讲解
    使用Linux Tc实现入向和出向限速
    JavaScript之WebAPI
    java计算机毕业设计疫情防控期间人员档案追演示录像上源码+系统+mysql数据库+lw文档
  • 原文地址:https://blog.csdn.net/richie12/article/details/134503123