前言

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

单一符号(Single symbol)渲染

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

填充标记(Filled marker)

similar to the simple marker symbol layer, except that it uses a fill sub symbol to render the marker. This allows use of all the existing QGIS fill (and stroke) styles for rendering markers, e.g. gradient or shapeburst fills.

  • 填充标记和简单标记类似,不同点是填充标记使用子符号作为标记符号,这样设计的目的是可以复用已有的填充类型,如下图 在这里插入图片描述
  • 填充符号(Fill)一般用于面类型的填充,如下图 在这里插入图片描述
  • 点类型的Filled Marker复用了填充符号(Fill),这样使得点类型的符号更加丰富,如下图 在这里插入图片描述

QGis

  • 将Symbol layer type设置为填充(圆形)标记(Filled marker),可以设置的属性见下图 在这里插入图片描述
  • Filled marker设置为了Fill符号,而Fill符号的Symbol layer type设置为了Simple Fill,Fill符号还可用于面要素的符号化,可设置的属性见下图 在这里插入图片描述 在这里插入图片描述

代码实现

  • QgsFilledMarkerSymbolLayer类是填充(圆形)标记图层(Filled marker layer),类图如下 在这里插入图片描述
  • QgsFilledMarkerSymbolLayer类中包含成员变量: std::unique_ptr< QgsFillSymbol > mFill;
  • 还有一个成员函数:bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override;
  • 即在Filled marker layer对象中,可以调用函数setSubSymbolFilled marker layer设置二级符号,从而实现QGis中的效果
  • 代码实现设置图层符号的步骤如下
  1. 首先从图层获取renderer,并转换为Single Symbol Renderer代码如下
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsSingleSymbolRenderer *singleRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
  1. 构造Fill标记层(Fill Marker SymbolLayer),代码如下
    //构造Fill标记层(Fill Marker SymbolLayer)方法一
    auto markerSymbolLayer = new QgsFilledMarkerSymbolLayer(Qgis::MarkerShape::Trapezoid,6.0);
    markerSymbolLayer->setColor(QColor("pink"));
    //上边两行已经能够实现功能,因为在QgsFilledMarkerSymbolLayer构造函数中,默认会创建QgsFillSymbol
    //这里是为了演示如何使用setSubSymbol和QgsFillSymbol
    auto fillSymbolLayer = new QgsSimpleFillSymbolLayer(QColor("pink"));
    QgsSymbolLayerList fillLayerList;
    fillLayerList << fillSymbolLayer;
    auto fillSymbol = new QgsFillSymbol(fillLayerList);
    markerSymbolLayer->setSubSymbol(fillSymbol);
  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);

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

总结

  • 介绍了如何使用填充标记(Filled Marker)