11.1 QGIS地图图表饼图应用和二次开发实现

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.8k人参与

前言

  • 地图图表功能可以为地图矢量图层添加与要素关联的饼图(Pie chart)、文字图表(Text diagram)和直方图(Histogram)。
  • 本章介绍饼图(Pie chart)在QGIS中的应用以及对应的二次开发的实现过程
  • 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps

图表示例图层

  • 以protected_areas.shp为例,该图层数据中包含prec_2020,prec_2021和prec_2022的降水量统计值,见下图
    在这里插入图片描述

QGIS图表通用设置

  • 在矢量图层的图层属性中,通过“Diagrams”选项卡左上角的下拉菜单可以选择图表类型,包括无图表( No diagrams)、饼图( Pie chart)、文字图表( Text diagram)直方图(Histogram)以及分段条形图(Stacked bars),如下图
    在这里插入图片描述
  • 在“Diagrams”选项卡中,选中任何一种图表后,即可出现属性(Attributes)、渲染(Rendering)、尺寸(Size)、位置(Placement)、设置(Options)和图例(Legend)六个主要选项卡。
    在这里插入图片描述
    • 在属性(Attributes)需要从“Available attributes”列表中选择需要制作图表的数据
    • 在渲染(Rendering)选项卡可以设置具体图表的颜色、线条宽度等。
    • 在尺寸(Size)选项卡中可以设置绝对尺寸或相对尺寸。
    • 位置(Placement)选项卡用于设置图表绘制的位置。
    • 设置(Options)选项卡的直方图中,通过“Bar Orientation”选项可以设置直方图的方向,包括向上(Up)、向下(Down)、向左(Left)和向右(Right)。
    • 图例(Legend)选项卡设置图表图例是否显示在地图图例中,包括标题、显示方式等设置选项。

饼图

  • 在“Attributes”选项卡中,将“prec_2020”、“prec_2021”和“prec_2022”属性加入“Assigned attributes”列表中。
  • 在“Attributes”选项卡的“Assigned attributes”列表中设置color,如下图
    在这里插入图片描述
  • 确定之后可见图层显示饼图,如下图
    在这里插入图片描述

二次开发实现饼图

  • 图表类的基类为QgsDiagram,类图如下
    在这里插入图片描述
  • 其子类QgsPieDiagram即为饼图
  • 矢量图层类QgsVectorLayer的成员函数void setDiagramRenderer( QgsDiagramRenderer *r SIP_TRANSFER );用于设置图层的图表渲染器。
  • 图表渲染器的基类为QgsDiagramRenderer,类图如下
    在这里插入图片描述
  • 两个子渲染器是QgsSingleCategoryDiagramRendererQgsLinearlyInterpolatedDiagramRenderer
  • 渲染器的两个成员函数void setDiagram( QgsDiagram *d);用于设置图表类型,void setDiagramSettings( const QgsDiagramSettings &s )用于设置图表渲染设置
  • 矢量图层类QgsVectorLayer的成员函数void setDiagramLayerSettings( const QgsDiagramLayerSettings &s );也是用于设置图标渲染属性
  • QgsDiagramLayerSettingsQgsDiagramSettings的不同点是 QgsDiagramSettings存储与渲染单个图表本身相关的设置,而QgsDiagramLayerSettings存储控制如何渲染一个层内所有图表的设置。
  • 以下以protected_areas.shp为例,讲解饼图的显示
  1. 添加protected_areas图层
QgsVectorLayer* layer = addTestShape(QStringLiteral("maps/shapefile/protected_areas.shp"));
  1. 设置QgsDiagramSettings,包括是否启用图表,设置属性名称、属性颜色、属性Label
    QgsDiagramSettings ds;
    ds.enabled = true;
    //Attributes选项卡
    QColor col1 = Qt::red;
    QColor col2 = Qt::yellow;
    QColor col3 = Qt::blue;
    ds.categoryColors = QList<QColor>() << col1 << col2 << col3;
    ds.categoryAttributes = QList<QString>() << QStringLiteral( "prec_2020" ) << QStringLiteral( "prec_2021" ) << QStringLiteral( "prec_2022" );
    ds.categoryLabels = QList<QString>() << QStringLiteral( "prec_2020" ) << QStringLiteral( "prec_2021" ) << QStringLiteral( "prec_2022" );
    //Rendering选项卡
    ds.opacity = 1.0;
    //Size选项卡
    ds.size = QSizeF( 15, 15 );
  1. 构建渲染器,这里两个渲染器都可用
#if 1
    QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
    dr->setLowerValue( 0.0 );
    dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
    dr->setUpperValue( 100 );
    dr->setUpperSize( QSizeF( 40, 40 ) );
    dr->setClassificationField( QStringLiteral( "prec_2020" ) );
#else
    QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
#endif
    dr->setDiagram(new QgsPieDiagram());
    dr->setDiagramSettings(ds);
  1. 图层图表设置QgsDiagramLayerSettings
    QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
    dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
    dls.setShowAllDiagrams( true );
			layer->setDiagramLayerSettings(dls);
  1. 图层设置渲染器
layer->setDiagramRenderer( dr );
  • 完整测试代码如下
void MainWindow::diagramPieSlot()
{
    //添加一个图层
    QgsVectorLayer* layer = addTestShape(QStringLiteral("maps/shapefile/protected_areas.shp"));

    QgsDiagramSettings ds;
    ds.enabled = true;
    //Attributes选项卡
    QColor col1 = Qt::red;
    QColor col2 = Qt::yellow;
    QColor col3 = Qt::blue;
    ds.categoryColors = QList<QColor>() << col1 << col2 << col3;
    ds.categoryAttributes = QList<QString>() << QStringLiteral( "prec_2020" ) << QStringLiteral( "prec_2021" ) << QStringLiteral( "prec_2022" );
    ds.categoryLabels = QList<QString>() << QStringLiteral( "prec_2020" ) << QStringLiteral( "prec_2021" ) << QStringLiteral( "prec_2022" );
    //Rendering选项卡
    ds.opacity = 1.0;
    //Size选项卡
    ds.size = QSizeF( 15, 15 );
#if 1
    QgsLinearlyInterpolatedDiagramRenderer *dr = new QgsLinearlyInterpolatedDiagramRenderer();
    dr->setLowerValue( 0.0 );
    dr->setLowerSize( QSizeF( 0.0, 0.0 ) );
    dr->setUpperValue( 100 );
    dr->setUpperSize( QSizeF( 40, 40 ) );
    dr->setClassificationField( QStringLiteral( "prec_2020" ) );
#else
    QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer();
#endif
    dr->setDiagram(new QgsPieDiagram());
    dr->setDiagramSettings(ds);

    QgsDiagramLayerSettings dls = QgsDiagramLayerSettings();
    dls.setPlacement( QgsDiagramLayerSettings::OverPoint );
    dls.setShowAllDiagrams( true );
    layer->setDiagramLayerSettings(dls);
    
    layer->setDiagramRenderer( dr );
}
  • 效果如下图
    在这里插入图片描述
    在这里插入图片描述

总结

  • 分别介绍了QGIS中显示饼图和二次开发实现饼图
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷动软件工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值