天天看點

qgis加載高德自定義_QGIS開發之自定義符号

昨天在程式裡添加了編輯矢量圖層符号的功能,右鍵LayerTree的矢量圖層,選擇“Edit Symbol”,便可以選擇或編輯圖層的渲染符号。

qgis加載高德自定義_QGIS開發之自定義符号

實作方法很簡單,首先參照http://blog.csdn.net/deirjie/article/details/50428179,實作自定義的右鍵菜單類,具體代碼可參考源碼中的QgsAppLayerTreeViewMenuProvider類。源碼裡有一個editVectorSymbol()方法,原封不動地copy到自己的代碼裡就行了。

1 voidQgsAppLayerTreeViewMenuProvider::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( 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開發之自定義符号

由于QGIS線狀符号庫裡沒有箭頭符号,中午時使用QGIS桌面版自定義了一個帶箭頭的線狀符号。線型為Marker Line,Marker placement為“on last vertex only”;Marker的類型為SVG marker,使用的箭頭svg圖示路徑是開發包路徑下的/svg/arrows/Arrow_05.svg;在設定一下點和線的尺寸、偏移、角度等參數便可以得到了。

qgis加載高德自定義_QGIS開發之自定義符号
qgis加載高德自定義_QGIS開發之自定義符号
qgis加載高德自定義_QGIS開發之自定義符号

跟ArcGIS中的箭頭符号對比一下:

qgis加載高德自定義_QGIS開發之自定義符号

出乎我意料的是,在運作自己的代碼時,發現程式的Symbol Selector跟桌面版的一樣,也多了這個新定義的“GPS Arrow”符号。也就是說,這個符号設定應該是配置到了一個QGIS的類似環境變量的地方,經過一番探索發現,使用者檔案夾下有一個.qgis2的檔案夾(我的是C:\Users\FangZhe\.qgis2)裡面存放的應該是QGIS的配置資料。檔案夾下有一個symbology-ng-style.db二進制檔案。測試了一下,将此檔案移走,再次打開符号編輯對話框,裡面的符号樣式就隻剩預設符号了,此時.qgis2檔案夾下又生成了一個新的symbology-ng-style.db檔案。由此看來,此檔案确實就是QGIS的符号庫檔案。日後釋出程式時,應該隻需要設定将此檔案預先添加到配置檔案夾之中就可以了,如此便可以省去用代碼自定義符号的工作。

qgis加載高德自定義_QGIS開發之自定義符号

現在對.qgis2檔案夾還是不甚了解,不過暫時不想多花力氣研究它,日後用到時再說吧。

感謝部落客Jacory_Gao的部落格,對我的開發工作幫助巨大。關于如何使用代碼自定義符号樣式,可參考這篇文章:http://blog.csdn.net/deirjie/article/details/50464768