前言

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

单一符号(Single symbol)渲染

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

矢量字段标记(Vector field marker)

The vector field marker is used to display vector field data such as earth deformation, tidal flows, and the like. It displays the vectors as lines (preferably arrows) that are scaled and oriented according to selected attributes of data points. It can only be used to render point data; line and polygon layers are not drawn by this symbology. The vector field is defined by attributes in the data, which can represent the field either by:

  • cartesian components (x and y components of the field)
  • or polar coordinates: in this case, attributes define Length and Angle. The angle may be measured either clockwise from north, or Counterclockwise from east, and may be either in degrees or radians.
  • or as height only data, which displays a vertical arrow scaled using an attribute of the data. This is appropriate for displaying the vertical component of deformation, for example.
  • 矢量场标记用于显示矢量场数据,如地球变形、潮汐流等。它以线(最好箭头)的形式显示矢量,并根据选定数据点的属性进行缩放和定向。
  • 它只能用于渲染点数据;线和多边形图层不使用此符号绘制。
  • 矢量场由数据中的属性定义,可以代表以下领域的矢量场:
    • 笛卡尔分量(场的x和y分量)
    • 极坐标:在这种情况下,属性定义长度和角度。角度可以以北方向为基准顺时针测量,也可以以东方向为基准逆时针测量,可以是度数或弧度。
    • 仅高度数据,显示一个垂直箭头,使用数据的一个属性进行缩放。例如,这对于显示变形的垂直分量是适当的。

QGis

矢量字段标记用于显示矢量场数据,例如地震变形、潮汐流等。它以线(最好是箭头)的形式显示矢量,这些线根据数据点的选定属性进行缩放和定向。它只能用于渲染点数据;该符号不绘制线条和多边形图层。

  • 将Symbol layer type设置为矢量字段标记(Vector field marker),属性见下图 在这里插入图片描述
  • X attribute和Y attribute分别是图层中的数据,如下图 在这里插入图片描述 在这里插入图片描述

代码实现

  • QgsVectorFieldSymbolLayer类是矢量字段标记图层(Vector field marker layer),类图如下 在这里插入图片描述
  • QgsVectorFieldSymbolLayer成员函数setXAttribute setYAttribute成员函数用于设置字段名称
  • 代码实现设置图层符号步骤如下
  1. 首先从图层获取renderer,并转换为Single Symbol Renderer代码如下
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsSingleSymbolRenderer *singleRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
  1. 构造函数创建矢量字段标记图层(Vector field marker layer),设置属性
    auto markerSymbolLayer = new QgsVectorFieldSymbolLayer();
    markerSymbolLayer->setXAttribute(QStringLiteral("IN_SWD"));
    markerSymbolLayer->setYAttribute(QStringLiteral("IS_TOWN"));
    markerSymbolLayer->setScale(10.0);
  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);

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

总结

  • 分别介绍了矢量字段标记(Vector field marker)在qgis软件和二次开发代码中的用法