文章目錄
- 前言
- 隨機標記填充(Random Marker Fill)
- QGis設置面符號為隨機標記填充(Random Marker Fill)
- 二次開發代碼實現隨機標記填充(Random Marker Fill)
- 總結
前言
- 本章介紹矢量圖層線要素單一符號中使用隨機標記填充(Random Marker Fill)的使用
- 說明:文章中的示例代碼均來自開源項目qgis_cpp_api_apps
隨機標記填充(Random Marker Fill)
A fill symbol layer which places markers at random locations within polygons.
- 以protected_areas.shp為例,圖層符號為Simple Fill時顯示效果如下圖
QGis設置面符號為隨機標記填充(Random Marker Fill)
- Symbol layer type設置為Random Marker Fill,可設置的屬性如下圖
- Random Marker Fill需要設置其子符號,子符號類型為Marker
- 屬性設置完成后,圖層顯示效果如下圖
二次開發代碼實現隨機標記填充(Random Marker Fill)
- 類
QgsRandomMarkerFillSymbolLayer
是Random Marker Fill,詳情見文檔,類圖如下
- 函數
setSubSymbol (QgsSymbol *symbol)
可以設置子符號 - 創建符號層有兩種方法:構造函數和
create
- 方法一
- 從圖層獲取渲染器
//從圖層獲取渲染器QgsFeatureRenderer * layerRenderer= layer->renderer();QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
- 構造函數:修改屬性可以調用setxxx函數,如下代碼
int pointCount = 100;auto randomMarkerFillSymbolLayer = new QgsRandomMarkerFillSymbolLayer(100);randomMarkerFillSymbolLayer->setDensityArea(250.0);randomMarkerFillSymbolLayer->setCountMethod(Qgis::PointCountMethod::Absolute);
- 創建符號并設置到渲染器
//多個Symbol Layer構成一個SymbolQgsSymbolLayerList layerList;layerList << randomMarkerFillSymbolLayer;//構造QgsFillSymbol并設置rendererauto fillSymbol = new QgsFillSymbol(layerList);singleSymbolRenderer->setSymbol(fillSymbol);layer->setRenderer(singleSymbolRenderer);
- 方法二
方法一中步驟1,3不變,步驟2中使用create()
成員函數,顏色方案同樣有兩種選擇
QVariantMap mp;mp["point_count"] = QStringLiteral("100");mp["density_area"] = QStringLiteral("250.0");mp["count_method"] = QStringLiteral("0");auto randomMarkerFillSymbolLayer = QgsRandomMarkerFillSymbolLayer::create(mp);
- 完整測試代碼如下
void MainWindow::polygonRandomMarkerSlot()
{//添加一個線圖層QgsVectorLayer* layer = addTestShape(QStringLiteral("maps/shapefile/protected_areas.shp"));//從圖層獲取渲染器QgsFeatureRenderer * layerRenderer= layer->renderer();QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
#if 1int pointCount = 100;auto randomMarkerFillSymbolLayer = new QgsRandomMarkerFillSymbolLayer(100);randomMarkerFillSymbolLayer->setDensityArea(250.0);randomMarkerFillSymbolLayer->setCountMethod(Qgis::PointCountMethod::Absolute);
#elseQVariantMap mp;mp["point_count"] = QStringLiteral("100");mp["density_area"] = QStringLiteral("250.0");mp["count_method"] = QStringLiteral("0");auto randomMarkerFillSymbolLayer = QgsRandomMarkerFillSymbolLayer::create(mp);
#endif//多個Symbol Layer構成一個SymbolQgsSymbolLayerList layerList;layerList << randomMarkerFillSymbolLayer;//構造QgsFillSymbol并設置rendererauto fillSymbol = new QgsFillSymbol(layerList);singleSymbolRenderer->setSymbol(fillSymbol);layer->setRenderer(singleSymbolRenderer);
}
- 效果如下圖
總結
- 介紹了矢量圖層面要素單一符號中的隨機標記填充(Random Marker Fill)