文章目录
- 前言
- 分级(Graduated)渲染
- QGis
- 代码实现
- 总结
前言
- 前面介绍了矢量-点要素-单一符号以及矢量-点要素-分类符号的用法
- 本章介绍分级(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
类是分级渲染器,详情见文档,类图如下
- 以下是实现分级渲染的步骤
- 获取分类渲染器:从图层获取渲染器并转换为分类渲染器,代码如下:
//从图层获取分类渲染器
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsGraduatedSymbolRenderer *graduatedRenderer = QgsGraduatedSymbolRenderer::convertFromRenderer(layerRenderer);
- 设置分类属性名称:
QgsGraduatedSymbolRenderer
类的成员函数setClassAttribute
设置分类的字段名称,本例中使用字段RAINFALL
QString attrName = "RAINFALL";
//设置用于分类的属性名称
graduatedRenderer->setClassAttribute(attrName);
- 设置分类符号颜色:成员函数
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);
- 设置分类方法:函数
setClassificationMethod( QgsClassificationMethod *method )
用于设置方法,分类的方法有Quantile EqualInterval Jenks StdDev Pretty Logarithmic Fixed等,代码如下
const QString methodId = "Quantile"; //设置分类方法
QgsClassificationMethod *method = QgsApplication::classificationMethodRegistry()->method( methodId );
graduatedRenderer->setClassificationMethod( method );
- 进行分类:函数
updateClasses( const QgsVectorLayer *vl, int nclasses )
进行分类动作
int nclasses = 5; //分为两类
graduatedRenderer->updateClasses( layer, nclasses );
- 设置图例名称:函数
updateRangeLabel( int rangeIndex, const QString &label )
//设置每个分类的图例Legend
graduatedRenderer->updateRangeLabel(0,"small");
graduatedRenderer->updateRangeLabel(1,"medium");
- 设置各个分类的符号:函数
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如何实现分级渲染符号化