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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM