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

前言

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

单一符号(Single symbol)渲染

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

几何生成器(Geometry generator)

Available with all types of symbols, the geometry generator symbol layer allows to use expression syntax to generate a geometry on the fly during the rendering process. The resulting geometry does not have to match with the original Geometry type and you can add several differently modified symbol layers on top of each other.

  • 几何生成器符号层允许在渲染过程中使用表达式语法来动态生成几何体。
  • 下边以缓冲区为例说明几何生成器的用法

在空间分析中,有一种方法是创建一个与任意点,直线或平面等距的区域,以检查物体对周边的影响,该区域称为缓冲区。 例如,“距离疏散设施100米的范围”是点缓冲区,“沿着水道100米的范围”是行缓冲区,“距离公园站点100米的范围”是 平面缓冲区。

QGis

  • 将Symbol layer type设置为几何生成器(Geometry generator),属性见下图
    在这里插入图片描述
  • 输入expression生成Geometry,如上图的buffer( $geometry, 100 ),意思是在距离feature100m,构建一个buffer。
    在这里插入图片描述

代码实现

  • QgsGeometryGeneratorSymbolLayer是几何生成器(Geometry generator)的类,注意该类的父类是QgsSymbolLayer,如下图
    在这里插入图片描述
  • 该类可以为点、线、面生成缓冲区
  • 通过调用成员函数setSubSymbol设置其符号,符号可以为Marker、Line和Fill
  • 其构造函数是私有的,所以创建Geometry generator layer只有一种方法:通过create函数
  • 代码实现设置图层符号的步骤如下
  1. 首先从图层获取renderer,并转换为Single Symbol Renderer代码如下
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsSingleSymbolRenderer *singleRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
  1. 调用create函数
	//构造标记层(Marker SymbolLayer)
    QVariantMap mp;
    mp[QString("geometryModifier")] = "buffer($geometry,100)";
    mp[QString("SymbolType")] = "Marker";
    auto markerSymbolLayer = QgsGeometryGeneratorSymbolLayer::create(mp);
  1. 构造Marker Symbol,并为renderer设置symbol 代码如下
	//QgsMarkerSymbol构造函数中需要传入QgsSymbolLayerList
    //多个Symbol Layer构成一个Symbol
    QgsSymbolLayerList layerList;
    layerList << markerSymbolLayer;
    auto markerSymbol = new QgsMarkerSymbol(layerList);
    singleRenderer->setSymbol(markerSymbol);
    layer->setRenderer(singleRenderer);
  • 完整的测试代码如下
void MainWindow::pointGeometryGeneratorMarkerSlot()
{
    //添加一个点图层,用于设置图层符号
    QgsVectorLayer* layer = addTestPointShape(QStringLiteral("maps/shapefile/places_33S.shp"));
    //获取图层的渲染器renderer
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsSingleSymbolRenderer *singleRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
    //构造标记层(Marker SymbolLayer)
    QVariantMap mp;
    mp[QString("geometryModifier")] = "buffer($geometry,100)";
    mp[QString("SymbolType")] = "Marker";
    auto markerSymbolLayer = QgsGeometryGeneratorSymbolLayer::create(mp);

    //QgsMarkerSymbol构造函数中需要传入QgsSymbolLayerList
    //多个Symbol Layer构成一个Symbol
    QgsSymbolLayerList layerList;
    layerList << markerSymbolLayer;
    //构造QgsMarkerSymbol并设置renderer
    auto markerSymbol = new QgsMarkerSymbol(layerList);
    singleRenderer->setSymbol(markerSymbol);
    layer->setRenderer(singleRenderer);
}

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

总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雷动软件工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值