QGIS开发之自定义符号

Posted Freeza

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QGIS开发之自定义符号相关的知识,希望对你有一定的参考价值。

昨天在程序里添加了编辑矢量图层符号的功能,右键LayerTree的矢量图层,选择“Edit Symbol”,便可以选择或编辑图层的渲染符号。

实现方法很简单,首先参照http://blog.csdn.net/deirjie/article/details/50428179,实现自定义的右键菜单类,具体代码可参考源码中的QgsAppLayerTreeViewMenuProvider类。源码里有一个editVectorSymbol()方法,原封不动地copy到自己的代码里就行了。

 1 void QgsAppLayerTreeViewMenuProvider::editVectorSymbol()
 2 {
 3   QAction* action = qobject_cast< QAction*>( sender() );
 4   if ( !action )
 5     return;
 6 
 7   QString layerId = action->property( "layerId" ).toString();
 8   QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) );
 9   if ( !layer )
10     return;
11 
12   QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< QgsSingleSymbolRendererV2* >( layer->rendererV2() );
13   if ( !singleRenderer )
14     return;
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 );
19   if ( dlg.exec() )
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的博客,对我的开发工作帮助巨大。关于如何使用代码自定义符号样式,可参考这篇文章:http://blog.csdn.net/deirjie/article/details/50464768

以上是关于QGIS开发之自定义符号的主要内容,如果未能解决你的问题,请参考以下文章

QGIS入门实战精品教程7.2:QGIS点状数据符号化设置案例教程

JAVAWEB之自定义TAG开发

android开发之自定义圆形ImagView

QGIS入门实战精品教程7.1:QGIS面状数据符号化设置案例教程

QGIS入门实战精品教程7.1:QGIS面状数据符号化设置案例教程

Android开发学习之路--UI之自定义布局和控件