前言

  • 上一篇教程介绍了矢量图层点要素单一符号中填充标记的用法
  • 本章继续介绍单一符号中各种标记的用法
  • 说明:文章中的示例代码均来自[开源项目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软件和二次开发代码中的用法