8.3 矢量图层点要素单一符号使用七

文章目录

  • 前言
  • 单一符号(Single symbol)渲染
    • 遮罩(Mask marker)
      • QGis
      • 代码实现
  • 总结

前言

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

单一符号(Single symbol)渲染

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

遮罩(Mask marker)

its sub-symbol defines a mask shape whose color property will be ignored and only the opacity will be used. This is convenient when the marker symbol overlaps with labels or other symbols whose colors are close, making it hard to decipher.

  • 遮罩符号的子符号定义了一个遮罩形状,其颜色属性将被忽略,只使用不透明度。
  • 当多个符号重叠时,某个符号设置为遮罩,可以使得不同符号显示的更清楚

QGis

  • 多个图层显示,为了改善颜色相近或重叠时符号的可读性,会在项目周围添加自定义的透明蒙版,以“隐藏”当前图层的符号层的部分。以两个图层farms_33S.shp和myplaces.shp为例
  • 首先添加图层myplaces,如下图
    8.3 矢量图层点要素单一符号使用七_第1张图片
  • 然后添加图层farms_33S,如下图
    8.3 矢量图层点要素单一符号使用七_第2张图片
  • 可见图层myplaces的符号被farms图层完全遮挡,这时可以将myplaces设置为Mask
  • 在myplaces右键,将Symbol layer type设置为遮罩(Mask marker)如下图
    8.3 矢量图层点要素单一符号使用七_第3张图片
  • 然后设置farms_33S图层的Masks,如下图
    8.3 矢量图层点要素单一符号使用七_第4张图片
  • 可以见到myplaces图层的点变透明,效果如下图
    8.3 矢量图层点要素单一符号使用七_第5张图片

代码实现

  • QgsMaskMarkerSymbolLayer是遮罩层(Mask marker layer)
  • QgsMaskMarkerSymbolLayer中的成员函数setMasks用于设置遮罩层符号
void setMasks( const QList &maskedLayers );
  • QgsSymbolLayerReference表示符号层的引用,详见文档,构造函数如下

Type used to refer to a specific symbol layer in a symbol of a layer.

QgsSymbolLayerReference( const QString &layerId, const QgsSymbolLayerId &symbolLayer )
  • QgsSymbolLayerReference构造函数的参数layerId可以通过函数QString QgsMapLayer::id()获取
  • QgsSymbolLayerReference构造函数的参数symbolLayerQgsSymbolLayerId的对象
  • QgsSymbolLayerId类的使用见文档,这里引用该类的描述

We may need stable references to symbol layers, when pointers to symbol layers is not usable (when a symbol or a feature renderer is cloned for example).
A symbol layer identifier consists of:

  • an identifier to its symbol (given by the QgsFeatureRenderer)
  • a path of indexes inside its symbol and subsymbols.
    For a symbol in a QgsSingleSymbolRenderer that has two symbol layers, it will give:
  • “” for the symbol key
  • [0] and [1] for the two symbol layer indexes
  • QgsSymbolLayerId构造函数如下
QgsSymbolLayerId( const QString &key, int index )
  • 使用QgsSingleSymbolRenderer情况下,key传入"",index传入0即可
  • 完整测试代码如下
void MainWindow::pointMaskSlot()
{
    //添加两个图层,用于设置图层符号
    QgsVectorLayer* layer = addTestPointShape(QStringLiteral("maps/shapefile/myplaces.shp"));
    QgsVectorLayer* reflayer = addTestPointShape(QStringLiteral("maps/shapefile/farms_33S.shp"));

    //获取图层的渲染器renderer
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsSingleSymbolRenderer *singleRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);

    QList< QgsSymbolLayerReference > maskedLayers;
    QgsSymbolLayerId slid("",0);
    QgsSymbolLayerReference slRef(reflayer->id(),slid);
    maskedLayers <<  slRef;
#if 0
    auto markerSymbolLayer = new QgsMaskMarkerSymbolLayer(); 
    markerSymbolLayer->setMasks(maskedLayers);
#else
    QVariantMap mp;
    mp[QString("mask_symbollayers")] = symbolLayerReferenceListToString(maskedLayers);
    auto markerSymbolLayer = QgsMaskMarkerSymbolLayer::create(mp);
#endif
    //QgsMarkerSymbol构造函数中需要传入QgsSymbolLayerList
    //多个Symbol Layer构成一个Symbol
    QgsSymbolLayerList layerList;
    layerList << markerSymbolLayer;
    //构造QgsMarkerSymbol并设置renderer
    auto markerSymbol = new QgsMarkerSymbol(layerList);
    singleRenderer->setSymbol(markerSymbol);
    layer->setRenderer(singleRenderer);
}

8.3 矢量图层点要素单一符号使用七_第6张图片
8.3 矢量图层点要素单一符号使用七_第7张图片

总结

  • 分别介绍了遮罩(Mask Marker)在qgis软件和qgis c++ api二次开发中的实现

你可能感兴趣的:(qgis二次开发,qgis二次开发)