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

编程入门 行业动态 更新时间:2024-10-25 14:27:35

8.3 <a href=https://www.elefans.com/category/jswz/34/1769140.html style=矢量图层点要素单一符号使用七"/>

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,如下图
  • 然后添加图层farms_33S,如下图
  • 可见图层myplaces的符号被farms图层完全遮挡,这时可以将myplaces设置为Mask
  • 在myplaces右键,将Symbol layer type设置为遮罩(Mask marker)如下图
  • 然后设置farms_33S图层的Masks,如下图
  • 可以见到myplaces图层的点变透明,效果如下图

代码实现

  • QgsMaskMarkerSymbolLayer是遮罩层(Mask marker layer)
  • QgsMaskMarkerSymbolLayer中的成员函数setMasks用于设置遮罩层符号
void setMasks( const QList<QgsSymbolLayerReference> &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"));//获取图层的渲染器rendererQgsFeatureRenderer * layerRenderer= layer->renderer();QgsSingleSymbolRenderer *singleRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);QList< QgsSymbolLayerReference > maskedLayers;QgsSymbolLayerId slid("",0);QgsSymbolLayerReference slRef(reflayer->id(),slid);maskedLayers <<  slRef;
#if 0auto markerSymbolLayer = new QgsMaskMarkerSymbolLayer(); markerSymbolLayer->setMasks(maskedLayers);
#elseQVariantMap mp;mp[QString("mask_symbollayers")] = symbolLayerReferenceListToString(maskedLayers);auto markerSymbolLayer = QgsMaskMarkerSymbolLayer::create(mp);
#endif//QgsMarkerSymbol构造函数中需要传入QgsSymbolLayerList//多个Symbol Layer构成一个SymbolQgsSymbolLayerList layerList;layerList << markerSymbolLayer;//构造QgsMarkerSymbol并设置rendererauto markerSymbol = new QgsMarkerSymbol(layerList);singleRenderer->setSymbol(markerSymbol);layer->setRenderer(singleRenderer);
}


总结

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

更多推荐

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

本文发布于:2023-11-17 02:45:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1637323.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:矢量   图层   要素   符号

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!