矢量图层属性的图表显示功能,帮助我们以图形化的方式更直观地显示数据当中的信息,使得数据生动起来的同时也变得更美观。QGis当中提供了默认三种图表,分别是饼状图、柱状图以及文本图。下面我们就来看一下在二次开发中如何实现这样的功能。
饼状图
文本图
柱状图
QgsDiagramRendererV2
首先,认识一下控制图表显示的渲染类 QgsDiagramRendererV2。这个类在 QgsVectorLayer 中具有引用指针,通过 QgsVectorLayer 的 setDiagramRenderer() 方法,传入一个 QgsDiagramRendererV2 的实例,当前的矢量图层就会以设置的方法来渲染显示图表。但是 QgsDiagramRendererV2 是一个抽象类,并不能直接实现它的实例,而应该进一步选择实现它的子类。继承关系如下图:
其中 QgsLinearlyInterpolatedDiagramRenderer 和 QgsSingleCategoryDiagramRenderer 分别是具体的渲染方法类,具体算法的不同请参阅API文档,这里仅讨论快速让图表显示出来,至于显示的方式,还需要同学们根据需求自己进行设置。
有了渲染类,到底是以饼状图、文本图还是柱状图的方式来显示,还需要通过渲染类的 setDiagram() 方法来设置。下面就来看看具体的图表类。
Diagram类
QGis当中提供的图表类包括三个,QgsPieDiagram、QgsTextDiagram 和 QgsHistogramDiagram,它们分别对应于饼状图、文本图和柱状图,都是继承自 QgsDiagram 类,继承关系如下图:
图表类并不需要额外的参数,仅初始化就可以了。当然,它们具有一系列的参数可供配置。如果将每个类的参数都封装在类里面,不仅重复代码会增多,而且并不便于管理,况且不论是哪一种图表,它们都具有某些共通的设置参数。于是QGis把这些参数通过其他类进行统一管理。具体来说,有两个,一个是QgsDiagramSettings,用于配置针对图表的参数,另一个是 QgsDiagramLayerSettings,是更高一级的参数,将图表类作为一个图层,配置与矢量要素的显示关系。
QgsDiagramSettings
专门用于图表配置属性的类,这个类的定义是包含在 qgsdiagramrendererV2.h 这个文件中的,由于上文用到了 QgsDiagramRendererV2,想必你应该已经添加了这个头文件的 include 了。
QgsDiagramSettings 类包含的图表属性包括字体、大小、颜色等等,下图来源于 API 文档,可以比较详细的看到可配置的属性: