8.5 矢量图层点要素分级(Graduated)渲染使用

前言

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

分级(Graduated)渲染

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

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

QGis

  • myplaces.shp图层有一个RAINFALL属性,代表各个地点的降水量,属性表见下图
    在这里插入图片描述
  • 在图层属性选项中,选择分级(Graduated)渲染,如下图
    在这里插入图片描述
  • Value选择字段RAINFALL,Mode和Classes保持默认,点击Classify按钮后,生成符号表,如下图
    在这里插入图片描述
  • 可以看到随着降水量的增加,地图上的点颜色更加深了,如下图
    在这里插入图片描述
  • 双击子符号,可以修改符号,如下图
    在这里插入图片描述
  • 如将30-135区间的符号修改为svg
    在这里插入图片描述

代码实现

  • QgsGraduatedSymbolRenderer类是分级渲染器,详情见文档,类图如下
    在这里插入图片描述
  • 以下是实现分级渲染的步骤
  1. 获取分类渲染器:从图层获取渲染器并转换为分类渲染器,代码如下:
    //从图层获取分类渲染器
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsGraduatedSymbolRenderer *graduatedRenderer = QgsGraduatedSymbolRenderer::convertFromRenderer(layerRenderer);
  1. 设置分类属性名称:QgsGraduatedSymbolRenderer类的成员函数setClassAttribute设置分类的字段名称,本例中使用字段RAINFALL
QString attrName = "RAINFALL";
//设置用于分类的属性名称
graduatedRenderer->setClassAttribute(attrName);
  1. 设置分类符号颜色:成员函数setSourceColorRamp( QgsColorRamp *ramp )设置渲染器的分类符号颜色,类图如下
    在这里插入图片描述
    ,这里我们使用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. 设置分类方法:函数setClassificationMethod( QgsClassificationMethod *method )用于设置方法,分类的方法有Quantile EqualInterval Jenks StdDev Pretty Logarithmic Fixed等,代码如下
const QString methodId = "Quantile";    //设置分类方法
QgsClassificationMethod *method = QgsApplication::classificationMethodRegistry()->method( methodId );
graduatedRenderer->setClassificationMethod( method );
  1. 进行分类:函数updateClasses( const QgsVectorLayer *vl, int nclasses )进行分类动作
int nclasses = 5;   //分为两类
graduatedRenderer->updateClasses( layer, nclasses );
  1. 设置图例名称:函数updateRangeLabel( int rangeIndex, const QString &label )
    //设置每个分类的图例Legend
    graduatedRenderer->updateRangeLabel(0,"small");
    graduatedRenderer->updateRangeLabel(1,"medium");
  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);

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

总结

  • 分别介绍了qgis软件和qgis cpp api如何实现分级渲染符号化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雷动软件工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值