QGIS开发之⾃定义符号
昨天在程序⾥添加了编辑⽮量图层符号的功能,右键LayerTree的⽮量图层,选择“Edit Symbol”,便可以选择或编辑图层的渲染符号。
实现⽅法很简单,⾸先参照,实现⾃定义的右键菜单类,具体代码可参考源码中的QgsAppLayerTreeViewMenuProvider类。源码⾥有⼀个editVectorSymbol()⽅法,原封不动地copy到⾃⼰的代码⾥就⾏了。
1void QgsAppLayerTreeViewMenuProvider::editVectorSymbol()
2 {
3 QAction* action = qobject_cast< QAction*>( sender() );
4if ( !action )
5return;
6
7 QString layerId = action->property( "layerId" ).toString();
8 QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) );
9if ( !layer )
10return;
11
12 QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< QgsSingleSymbolRendererV2* >( layer->rendererV2() );
13if ( !singleRenderer )
14return;
15
16 QScopedPointer< QgsSymbolV2 > symbol( singleRenderer->symbol() ? singleRenderer->symbol()->clone() : nullptr );
17 QgsSymbolV2SelectorDialog dlg( symbol.data(), QgsStyleV2::defaultStyle(), layer, mView->window() );
18 dlg.setMapCanvas( mCanvas );
19if ( () )
20 {
21 singleRenderer->setSymbol( symbol.take() );
22 layer->triggerRepaint();
23 mView->refreshLayerSymbology( layer->id() );
24 }
25 }
以下为点状的Symbol Selector实现效果:
由于QGIS线状符号库⾥没有箭头符号,中午时使⽤QGIS桌⾯版⾃定义了⼀个带箭头的线状符号。线型为Marker Line,Marker placement 为“on last vertex only”;Marker的类型为SVG marker,使⽤的箭头svg图标路径是开发包路径下的/svg/arrows/Arrow_05.svg;在设置⼀下点和线的尺⼨、偏移、⾓度等参数便可以得到了。
跟ArcGIS中的箭头符号对⽐⼀下:
出乎我意料的是,在运⾏⾃⼰的代码时,发现程序的Symbol Selector跟桌⾯版的⼀样,也多了这个新
定义的“GPS Arrow”符号。也就是说,这个符号设置应该是配置到了⼀个QGIS的类似环境变量的地⽅,经过⼀番探索发现,⽤户⽂件夹下有⼀个.qgis2的⽂件夹(我的是
C:\Users\FangZhe\.qgis2)⾥⾯存放的应该是QGIS的配置数据。⽂件夹下有⼀个symbology-ng-style.db⼆进制⽂件。测试了⼀下,将此⽂件移⾛,再次打开符号编辑对话框,⾥⾯的符号样式就只剩默认符号了,此时.qgis2⽂件夹下⼜⽣成了⼀个新的symbology-ng-style.db⽂件。由此看来,此⽂件确实就是QGIS的符号库⽂件。⽇后发布程序时,应该只需要设置将此⽂件预先添加到配置⽂件夹之中就可以了,如此便可以省去⽤代码⾃定义符号的⼯作。
现在对.qgis2⽂件夹还是不甚了解,不过暂时不想多花⼒⽓研究它,⽇后⽤到时再说吧。
感谢博主Jacory_Gao的博客,对我的开发⼯作帮助巨⼤。关于如何使⽤代码⾃定义符号样式,可参考这篇⽂章:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论