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软件和二次开发代码中的用法
相关推荐
浅碎时光8072 小时前
Qt (按钮/显示/输入/容器类控件 布局管理器)
开发语言·qt
2345VOR13 小时前
【QT的pyside6开发使用】
开发语言·qt
Ronin30513 小时前
【Qt常用控件】控件概述和QWidget 核心属性
开发语言·qt·常用控件·qwidget核心属性
蓝天智能16 小时前
QT实战:Qt6 编码规范模板
开发语言·qt
载数而行52016 小时前
QT前置2 可视化文件,QRC文件两种处理
c++·qt·学习
小鹿软件办公19 小时前
KDE 重磅发布:digiKam 9.0 正式登场,全面升级 Qt 6 核心
开发语言·qt·digikam
Ronin19 小时前
QT中使用toInt函数判断条件时,要注意越界
开发语言·qt
载数而行52019 小时前
QT系列,对象树 栈和堆 QDebug以及日志打印
c++·qt·学习
笨笨马甲19 小时前
Qt 嵌入式开发概述
qt
永远的魔术1号19 小时前
QtMaterialDialog对话框无法正常显示问题排查与解决方案
qt