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代码如下
ini 复制代码
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsSingleSymbolRenderer *singleRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
  1. 调用create函数
scss 复制代码
	//构造标记层(Marker SymbolLayer)
    QVariantMap mp;
    mp[QString("geometryModifier")] = "buffer($geometry,100)";
    mp[QString("SymbolType")] = "Marker";
    auto markerSymbolLayer = QgsGeometryGeneratorSymbolLayer::create(mp);
  1. 构造Marker Symbol,并为renderer设置symbol 代码如下
scss 复制代码
	//QgsMarkerSymbol构造函数中需要传入QgsSymbolLayerList
    //多个Symbol Layer构成一个Symbol
    QgsSymbolLayerList layerList;
    layerList << markerSymbolLayer;
    auto markerSymbol = new QgsMarkerSymbol(layerList);
    singleRenderer->setSymbol(markerSymbol);
    layer->setRenderer(singleRenderer);
  • 完整的测试代码如下
C++ 复制代码
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软件和二次开发代码中的用法
相关推荐
明月醉窗台1 天前
qt使用笔记六之 Qt Creator、Qt Widgets、Qt Quick 详细解析
开发语言·笔记·qt
R_.L1 天前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
无小道1 天前
Qt——常用控件
开发语言·qt
初次见面我叫泰隆1 天前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
牵牛老人1 天前
【Qt 开发后台服务避坑指南:从库存管理系统开发出现的问题来看后台开发常见问题与解决方案】
开发语言·qt·系统架构
xmRao1 天前
Qt+FFmpeg 实现 PCM 音频转 AAC 编码
qt·ffmpeg·pcm
xmRao1 天前
Qt+FFmpeg 实现录音程序(pcm转wav)
qt·ffmpeg
喜欢喝果茶.1 天前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
wjhx1 天前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
踏过山河,踏过海1 天前
【qt-查看对应的依赖的一种方法】
qt·visual studio