前言
- 本章介绍矢量图层面要素反转面要素(Inverted polygons Renderer)的使用
- 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps
反转面要素(Inverted polygons Renderer)
反转面要素渲染常用于掩膜数据。
- 反转面要素(Inverted polygons Renderer)是一种渲染方式
- 和单一符号渲染(Single Symbol Renderer)相反, 反转面要素渲染(Inverted polygons Renderer)是用于渲染图层以外区域
- 以protected_areas.shp为例,图层符号为单一符号渲染,符号类型为简单填充(Simple Fill)时显示效果如下图
QGis设置面符号为反转面要素渲染(Inverted polygons Renderer)
- 渲染器改为Inverted polygons,属性设置如下图
- 显示效果如下图
二次开发代码实现反转面要素渲染(Inverted polygons Renderer)
- 反转面要素渲染器的类是
QgsInvertedPolygonRenderer
,详见文档,类图如下
- 分别从图层获取反转面和单一符号渲染器,如下代码
//分别获取反转面和单一符号渲染器
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsInvertedPolygonRenderer *invertedRenderer = QgsInvertedPolygonRenderer::convertFromRenderer(layerRenderer);
QgsSingleSymbolRenderer * singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer( layerRenderer);
- 然后创建填充类型符号,代码如下
#if 1
auto simplefillSymbolLayer = new QgsSimpleFillSymbolLayer();
simplefillSymbolLayer->setFillColor(QColor("red"));
#else
QVariantMap mp;
mp["color"] = QStringLiteral("red");
auto simplefillSymbolLayer = QgsSimpleFillSymbolLayer::create(mp);
#endif
QgsSymbolLayerList layerList;
layerList << simplefillSymbolLayer;
auto fillSymbol = new QgsFillSymbol(layerList);
- 单一符号渲染器设置其符号为fillSymbol
- 反转面渲染器调用其函数
setEmbeddedRenderer
,代码如下
//单一符号渲染器设置其符号为fillSymbol
singleSymbolRenderer->setSymbol(fillSymbol);
//反转面渲染器调用该函数,将单一符号渲染器作为参数传进去
invertedRenderer->setEmbeddedRenderer(singleSymbolRenderer);
- 完整测试代码如下
void MainWindow::polygonInvertedRendererSlot()
{
//添加一个线图层
QgsVectorLayer* layer = addTestShape(QStringLiteral("maps/shapefile/protected_areas.shp"));
//分别获取反转面和单一符号渲染器
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsInvertedPolygonRenderer *invertedRenderer = QgsInvertedPolygonRenderer::convertFromRenderer(layerRenderer);
QgsSingleSymbolRenderer * singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer( layerRenderer);
//创建fill类型的符号
#if 1
auto simplefillSymbolLayer = new QgsSimpleFillSymbolLayer();
simplefillSymbolLayer->setFillColor(QColor("red"));
#else
QVariantMap mp;
mp["color"] = QStringLiteral("red");
auto simplefillSymbolLayer = QgsSimpleFillSymbolLayer::create(mp);
#endif
QgsSymbolLayerList layerList;
layerList << simplefillSymbolLayer;
auto fillSymbol = new QgsFillSymbol(layerList);
//单一符号渲染器设置其符号为fillSymbol
singleSymbolRenderer->setSymbol(fillSymbol);
//反转面渲染器调用该函数,将单一符号渲染器作为参数传进去
invertedRenderer->setEmbeddedRenderer(singleSymbolRenderer);
layer->setRenderer(invertedRenderer);
}
- 效果如下
总结
- 介绍了矢量图层面要素反转面要素渲染(Inverted polygons Renderer)