文章目錄
- 前言
- 箭頭(Arrow)
- QGis設置線符號為箭頭(Arrow)
- 二次開發代碼實現
- 總結
前言
- 本章介紹矢量圖層線要素單一符號中箭頭(Arrow)的使用
- 說明:文章中的示例代碼均來自開源項目qgis_cpp_api_apps
箭頭(Arrow)
- 以river.shp圖層為例,在QGis中添加river圖層,默認使用的符號是簡單線,如下圖所示
QGis設置線符號為箭頭(Arrow)
- Symbol layer type選擇箭頭(Arrow),可以設置箭頭的屬性,如下圖所示
- 箭頭(Arrow)圖層可以設置子符號為填充類型符號,填充類型符號進一步設置其符號圖層的屬性,如下圖
- 設置完成后效果如下圖
二次開發代碼實現
- 類
QgsArrowSymbolLayer
代表箭頭圖層(Arrow layer),詳情見文檔,類圖如下
- 類
QgsArrowSymbolLayer
還可以設置子符號setSubSymbol (QgsSymbol *symbol)
,調用該函數可以設置填充類型符號 QgsArrowSymbolLayer
構造函數中默認創建了填充類型的符號,代碼如下
QgsArrowSymbolLayer::QgsArrowSymbolLayer()
{/* default values */setOffset( 0.0 );setOffsetUnit( QgsUnitTypes::RenderMillimeters );mSymbol.reset( static_cast<QgsFillSymbol *>( QgsFillSymbol::createSimple( QVariantMap() ) ) );
}
- 代碼實現設置圖層符號有兩種方法:構造函數和靜態函數create
- 方法一:構造函數
- 從圖層獲取渲染器
//從圖層獲取渲染器QgsFeatureRenderer * layerRenderer= layer->renderer();QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
- 構造函數:這里使用的默認屬性,需要修改屬性調用其setxxx函數即可,如
setHeadType (HeadType type)
auto arrowSymbolLayer = new QgsArrowSymbolLayer();
- 創建符號并設置到渲染器
//多個Symbol Layer構成一個SymbolQgsSymbolLayerList layerList;layerList << arrowSymbolLayer;//構造QgsLineSymbol并設置rendererauto lineSymbol = new QgsLineSymbol(layerList);singleSymbolRenderer->setSymbol(lineSymbol);layer->setRenderer(singleSymbolRenderer);
- 方法二
方法一中步驟1,3不變,步驟2中使用create()
成員函數
QVariantMap mp;mp["head_type"] = "0";mp["arrow_type"] = "0";auto arrowSymbolLayer = QgsArrowSymbolLayer::create(mp);
- 完整測試代碼如下
void MainWindow::lineArrowSlot()
{//添加一個線圖層QgsVectorLayer* layer = addTestShape(QStringLiteral("maps/shapefile/rivers.shp"));//從圖層獲取渲染器QgsFeatureRenderer * layerRenderer= layer->renderer();QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
#if 0auto arrowSymbolLayer = new QgsArrowSymbolLayer();
#elseQVariantMap mp;mp["head_type"] = "0";mp["arrow_type"] = "0";auto arrowSymbolLayer = QgsArrowSymbolLayer::create(mp);
#endif//多個Symbol Layer構成一個SymbolQgsSymbolLayerList layerList;layerList << arrowSymbolLayer;//構造QgsLineSymbol并設置rendererauto lineSymbol = new QgsLineSymbol(layerList);singleSymbolRenderer->setSymbol(lineSymbol);layer->setRenderer(singleSymbolRenderer);
}
- 效果如下圖
總結
- 介紹了矢量圖層單一符號箭頭的使用