前言
- 前面几章介绍了矢量-点要素-单一符号的各种用法
- 所谓单一符号是指点要素的符号在图层显示时只有一种形式
- 下面介绍的分类(Categorized)渲染
- 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps
分类(Categorized)渲染
根据类型(属性表的离散变量)设置不同的符号方案。 Attribute table是地理信息系统名词,它包含地理要素集信息的数据库或表格文件 Attribute table的每行表示一个要素,而每列表示一个要素属性。
- 下面以图层places_33S.shape为例,分别介绍qgis软件和二次开发中如何使用分类渲染
QGis
- 一般矢量图层中会有一个属性表(Attribute Table),图层places_33S.shape的属性表如下图
- places_33S图层属性表有一个字段为IS_TOWN,以下就用该字段进行分类渲染
- 在图层属性选项中,选择分类(Categorized)渲染,如下图
- 在属性框中,Value选择IS_TOWN,代表该地点是否为城镇
- 然后点击属性框中的Classify按钮后,完成分类符号创建,其中表头Legend可以手动输入图例名称,如下图所示
- 从图中可以清晰分辨图层中的点是否是城镇
- 在不是城镇或者城镇处双击可以修改符号,如下图
- 我们把符号改为svg marker,效果如下图所示
代码实现
- 类
QgsCategorizedSymbolRenderer
是分类渲染器,详见见文档,类图如下 - 以下是实现分类渲染的步骤
- 获取分类渲染器
cpp
//从图层获取分类渲染器并转换为分类渲染器
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsCategorizedSymbolRenderer *categorizedRenderer = QgsCategorizedSymbolRenderer::convertFromRenderer(layerRenderer);
- 设置分类字段:调用函数
setClassAttribute( const QString &attr )
cpp
QString attrName = "IS_TOWN";
categorizedRenderer->setClassAttribute(attrName);
- 创建分类:通过分类字段获取字段值,并创建分类,函数
createCategories
用于创建分类,函数addCategory
用于添加分类
cpp
QList<QVariant> uniqueValues;
const int idx = layer->fields().lookupField( attrName );
uniqueValues = qgis::setToList( layer->uniqueValues( idx ) );
QgsSymbol *symbol = QgsSymbol::defaultSymbol( layer->geometryType() );
QgsCategoryList cats = QgsCategorizedSymbolRenderer::createCategories( uniqueValues, symbol, layer, attrName );
for(int i = 0;i < cats.size();++i)
{
QgsRendererCategory cat = cats.at(i);
categorizedRenderer->addCategory(cat);
}
- 设置每个分类的符号颜色::函数
setSourceColorRamp( QgsColorRamp *ramp )
设置渲染器的分类符号颜色,其类图如下 ,这里我们使用QgsGradientColorRamp
或者QgsRandomColorRamp
作为示例
cpp
#if 0
//使用渐变颜色指定类别颜色
QgsGradientColorRamp *ramp = new QgsGradientColorRamp(QColor( 255, 255, 255 ), QColor( 255, 0, 0 ));
#else
//使用随机颜色设定类别颜色
QgsRandomColorRamp *ramp = new QgsRandomColorRamp();
#endif
categorizedRenderer->updateColorRamp(ramp);
- 设置图例名称:函数
updateRangeLabel( int rangeIndex, const QString &label )
cpp
//设置每个分类的图例Legend
categorizedRenderer->updateCategoryLabel(0,"Not Town");
categorizedRenderer->updateCategoryLabel(1,"Town");
- 设置每个分类的符号:调用函数
updateRangeSymbol( int rangeIndex, QgsSymbol *symbol )
cpp
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);
categorizedRenderer->updateRangeSymbol(0, markerSymbol);
总结
- 分别介绍了qgis软件和qgis cpp api如何实现分类渲染符号化