8.3 矢量图层点要素单一符号使用七

前言

  • 上一篇教程介绍了矢量图层点要素单一符号中矢量字段标记的用法
  • 本章继续介绍单一符号中各种标记的用法
  • 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps

单一符号(Single symbol)渲染

  • qgis默认使用单一符号、简单标记(Simple Marker)进行渲染,以places_33S.shp为例,添加places_33S图层后,默认显示如下图
    在这里插入图片描述
  • 在点要素图层的图层属性中,选择“Symbology”选项卡,可以看到默认显示,如下图
    在这里插入图片描述
  • 除简单标记(Simple Marker)外,还有其他多种选择如下图
    在这里插入图片描述

遮罩(Mask marker)

its sub-symbol defines a mask shape whose color property will be ignored and only the opacity will be used. This is convenient when the marker symbol overlaps with labels or other symbols whose colors are close, making it hard to decipher.

  • 遮罩符号的子符号定义了一个遮罩形状,其颜色属性将被忽略,只使用不透明度。
  • 当多个符号重叠时,某个符号设置为遮罩,可以使得不同符号显示的更清楚

QGis

  • 多个图层显示,为了改善颜色相近或重叠时符号的可读性,会在项目周围添加自定义的透明蒙版,以“隐藏”当前图层的符号层的部分。以两个图层farms_33S.shp和myplaces.shp为例
  • 首先添加图层myplaces,如下图
    在这里插入图片描述
  • 然后添加图层farms_33S,如下图
    在这里插入图片描述
  • 可见图层myplaces的符号被farms图层完全遮挡,这时可以将myplaces设置为Mask
  • 在myplaces右键,将Symbol layer type设置为遮罩(Mask marker)如下图
    在这里插入图片描述
  • 然后设置farms_33S图层的Masks,如下图
    在这里插入图片描述
  • 可以见到myplaces图层的点变透明,效果如下图
    在这里插入图片描述

代码实现

  • QgsMaskMarkerSymbolLayer是遮罩层(Mask marker layer)
  • QgsMaskMarkerSymbolLayer中的成员函数setMasks用于设置遮罩层符号
void setMasks( const QList<QgsSymbolLayerReference> &maskedLayers );
  • QgsSymbolLayerReference表示符号层的引用,详见文档,构造函数如下

Type used to refer to a specific symbol layer in a symbol of a layer.

QgsSymbolLayerReference( const QString &layerId, const QgsSymbolLayerId &symbolLayer )
  • QgsSymbolLayerReference构造函数的参数layerId可以通过函数QString QgsMapLayer::id()获取
  • QgsSymbolLayerReference构造函数的参数symbolLayerQgsSymbolLayerId的对象
  • QgsSymbolLayerId类的使用见文档,这里引用该类的描述

We may need stable references to symbol layers, when pointers to symbol layers is not usable (when a symbol or a feature renderer is cloned for example).
A symbol layer identifier consists of:

  • an identifier to its symbol (given by the QgsFeatureRenderer)
  • a path of indexes inside its symbol and subsymbols.
    For a symbol in a QgsSingleSymbolRenderer that has two symbol layers, it will give:
  • “” for the symbol key
  • [0] and [1] for the two symbol layer indexes
  • QgsSymbolLayerId构造函数如下
QgsSymbolLayerId( const QString &key, int index )
  • 使用QgsSingleSymbolRenderer情况下,key传入"",index传入0即可
  • 完整测试代码如下
void MainWindow::pointMaskSlot()
{
    //添加两个图层,用于设置图层符号
    QgsVectorLayer* layer = addTestPointShape(QStringLiteral("maps/shapefile/myplaces.shp"));
    QgsVectorLayer* reflayer = addTestPointShape(QStringLiteral("maps/shapefile/farms_33S.shp"));

    //获取图层的渲染器renderer
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsSingleSymbolRenderer *singleRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);

    QList< QgsSymbolLayerReference > maskedLayers;
    QgsSymbolLayerId slid("",0);
    QgsSymbolLayerReference slRef(reflayer->id(),slid);
    maskedLayers <<  slRef;
#if 0
    auto markerSymbolLayer = new QgsMaskMarkerSymbolLayer(); 
    markerSymbolLayer->setMasks(maskedLayers);
#else
    QVariantMap mp;
    mp[QString("mask_symbollayers")] = symbolLayerReferenceListToString(maskedLayers);
    auto markerSymbolLayer = QgsMaskMarkerSymbolLayer::create(mp);
#endif
    //QgsMarkerSymbol构造函数中需要传入QgsSymbolLayerList
    //多个Symbol Layer构成一个Symbol
    QgsSymbolLayerList layerList;
    layerList << markerSymbolLayer;
    //构造QgsMarkerSymbol并设置renderer
    auto markerSymbol = new QgsMarkerSymbol(layerList);
    singleRenderer->setSymbol(markerSymbol);
    layer->setRenderer(singleRenderer);
}

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

总结

  • 分别介绍了遮罩(Mask Marker)在qgis软件和qgis c++ api二次开发中的实现
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雷动软件工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值