8.4 矢量图层点要素分类(Categorized)渲染使用

前言

  • 前面几章介绍了矢量-点要素-单一符号的各种用法
  • 所谓单一符号是指点要素的符号在图层显示时只有一种形式
  • 下面介绍的分类(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是分类渲染器,详见见文档,类图如下
    在这里插入图片描述
  • 以下是实现分类渲染的步骤
  1. 获取分类渲染器
    //从图层获取分类渲染器并转换为分类渲染器
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsCategorizedSymbolRenderer *categorizedRenderer = QgsCategorizedSymbolRenderer::convertFromRenderer(layerRenderer);
  1. 设置分类字段:调用函数setClassAttribute( const QString &attr )
    QString attrName = "IS_TOWN";
    categorizedRenderer->setClassAttribute(attrName);
  1. 创建分类:通过分类字段获取字段值,并创建分类,函数createCategories用于创建分类,函数addCategory用于添加分类
    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);
    }
  1. 设置每个分类的符号颜色::函数setSourceColorRamp( QgsColorRamp *ramp )设置渲染器的分类符号颜色,其类图如下
    在这里插入图片描述
    ,这里我们使用QgsGradientColorRamp或者QgsRandomColorRamp作为示例
#if 0
    //使用渐变颜色指定类别颜色
    QgsGradientColorRamp *ramp = new QgsGradientColorRamp(QColor( 255, 255, 255 ), QColor( 255, 0, 0 ));
#else
    //使用随机颜色设定类别颜色
    QgsRandomColorRamp *ramp = new QgsRandomColorRamp();
#endif
    categorizedRenderer->updateColorRamp(ramp);
  1. 设置图例名称:函数updateRangeLabel( int rangeIndex, const QString &label )
    //设置每个分类的图例Legend
    categorizedRenderer->updateCategoryLabel(0,"Not Town");
    categorizedRenderer->updateCategoryLabel(1,"Town");
  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);
    categorizedRenderer->updateRangeSymbol(0, markerSymbol);

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

总结

  • 分别介绍了qgis软件和qgis cpp api如何实现分类渲染符号化
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雷动软件工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值