前言

  • 前面介绍了矢量-点要素-单一符号以及矢量-点要素-分类符号的用法
  • 本章介绍分级(Graduated)渲染
  • 说明:文章中的示例代码均来自 开源项目qgis_cpp_api_apps

分级(Graduated)渲染

根据数值大小(数据表的连续变量),利用配色方案(Color ramp)设置不同的颜色。

  • 以myplaces.shp为例分别介绍分级渲染在qgis软件中的使用以及二次开发中如何使用分级渲染

QGis

  • myplaces.shp图层有一个RAINFALL属性,代表各个地点的降水量,属性表见下图8.5 矢量图层点要素分级(Graduated)渲染使用_qgis
  • 在图层属性选项中,选择分级(Graduated)渲染,如下图8.5 矢量图层点要素分级(Graduated)渲染使用_gis_02
  • Value选择字段RAINFALL,Mode和Classes保持默认,点击Classify按钮后,生成符号表,如下图8.5 矢量图层点要素分级(Graduated)渲染使用_gis_03
  • 可以看到随着降水量的增加,地图上的点颜色更加深了,如下图8.5 矢量图层点要素分级(Graduated)渲染使用_qgis二次开发_04
  • 双击子符号,可以修改符号,如下图8.5 矢量图层点要素分级(Graduated)渲染使用_矢量图层符号_05
  • 如将30-135区间的符号修改为svg8.5 矢量图层点要素分级(Graduated)渲染使用_矢量图层符号_06

代码实现

  • QgsGraduatedSymbolRenderer类是分级渲染器,详情见 文档,类图如下8.5 矢量图层点要素分级(Graduated)渲染使用_矢量图层符号_07
  • 以下是实现分级渲染的步骤
  1. 获取分类渲染器:从图层获取渲染器并转换为分类渲染器,代码如下:
//从图层获取分类渲染器
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsGraduatedSymbolRenderer *graduatedRenderer = QgsGraduatedSymbolRenderer::convertFromRenderer(layerRenderer);
  • 1.
  • 2.
  • 3.
  1. 设置分类属性名称:QgsGraduatedSymbolRenderer类的成员函数setClassAttribute设置分类的字段名称,本例中使用字段RAINFALL
QString attrName = "RAINFALL";
//设置用于分类的属性名称
graduatedRenderer->setClassAttribute(attrName);
  • 1.
  • 2.
  • 3.
  1. 设置分类符号颜色:成员函数setSourceColorRamp( QgsColorRamp *ramp )设置渲染器的分类符号颜色,类图如下8.5 矢量图层点要素分级(Graduated)渲染使用_qgis_08
    ,这里我们使用QgsGradientColorRamp或者QgsRandomColorRamp作为示例,代码如下
#if 1
    //渐变色
    QgsColorRamp *ramp = new QgsGradientColorRamp( QColor( 255, 255, 255 ), QColor( 255, 0, 0 ) );
#else
    //完全随机
    QgsColorRamp *ramp = new QgsRandomColorRamp();
#endif
    graduatedRenderer->setSourceColorRamp(ramp);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  1. 设置分类方法:函数setClassificationMethod( QgsClassificationMethod *method )用于设置方法,分类的方法有Quantile EqualInterval Jenks StdDev Pretty Logarithmic Fixed等,代码如下
const QString methodId = "Quantile";    //设置分类方法
QgsClassificationMethod *method = QgsApplication::classificationMethodRegistry()->method( methodId );
graduatedRenderer->setClassificationMethod( method );
  • 1.
  • 2.
  • 3.
  1. 进行分类:函数updateClasses( const QgsVectorLayer *vl, int nclasses )进行分类动作
int nclasses = 5;   //分为两类
graduatedRenderer->updateClasses( layer, nclasses );
  • 1.
  • 2.
  1. 设置图例名称:函数updateRangeLabel( int rangeIndex, const QString &label )
//设置每个分类的图例Legend
    graduatedRenderer->updateRangeLabel(0,"small");
    graduatedRenderer->updateRangeLabel(1,"medium");
  • 1.
  • 2.
  • 3.
  1. 设置各个分类的符号:函数updateRangeSymbol( int rangeIndex, QgsSymbol *symbol )
QVariantMap mp;
    mp[QString("name")] = "resources/plane.svg";
    mp[QString("outline_color")] = "pink";
    mp[QString("size")] = "8.0";
    auto markerSymbolLayer = QgsSvgMarkerSymbolLayer::create(mp);
    QgsSymbolLayerList layerList;
    layerList << markerSymbolLayer;
    auto markerSymbol = new QgsMarkerSymbol(layerList);
    graduatedRenderer->updateRangeSymbol(0, markerSymbol);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

8.5 矢量图层点要素分级(Graduated)渲染使用_分级渲染_098.5 矢量图层点要素分级(Graduated)渲染使用_gis_10

总结

  • 分别介绍了qgis软件和qgis cpp api如何实现分级渲染符号化