8.12 矢量图层面要素单一符号使用七(随机标记填充)

文章目录

  • 前言
  • [随机标记填充(Random Marker Fill)](#随机标记填充(Random Marker Fill))
    • [QGis设置面符号为随机标记填充(Random Marker Fill)](#QGis设置面符号为随机标记填充(Random Marker Fill))
    • [二次开发代码实现随机标记填充(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
  • 方法一
  1. 从图层获取渲染器

    复制代码
     //从图层获取渲染器
     QgsFeatureRenderer * layerRenderer= layer->renderer();
     QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
  2. 构造函数:修改属性可以调用setxxx函数,如下代码

cpp 复制代码
    int pointCount = 100;
    auto randomMarkerFillSymbolLayer = new QgsRandomMarkerFillSymbolLayer(100);
    randomMarkerFillSymbolLayer->setDensityArea(250.0);
    randomMarkerFillSymbolLayer->setCountMethod(Qgis::PointCountMethod::Absolute);
  1. 创建符号并设置到渲染器
cpp 复制代码
    //多个Symbol Layer构成一个Symbol
    QgsSymbolLayerList layerList;
    layerList << randomMarkerFillSymbolLayer;
    //构造QgsFillSymbol并设置renderer
    auto fillSymbol = new QgsFillSymbol(layerList);
    singleSymbolRenderer->setSymbol(fillSymbol);
    layer->setRenderer(singleSymbolRenderer);
  • 方法二
    方法一中步骤1,3不变,步骤2中使用create()成员函数,颜色方案同样有两种选择
cpp 复制代码
    QVariantMap mp;
    mp["point_count"] = QStringLiteral("100");
    mp["density_area"] = QStringLiteral("250.0");
    mp["count_method"] = QStringLiteral("0");
    auto randomMarkerFillSymbolLayer = QgsRandomMarkerFillSymbolLayer::create(mp);
  • 完整测试代码如下
cpp 复制代码
void MainWindow::polygonRandomMarkerSlot()
{
    //添加一个线图层
    QgsVectorLayer* layer = addTestShape(QStringLiteral("maps/shapefile/protected_areas.shp"));
    //从图层获取渲染器
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
#if 1
    int pointCount = 100;
    auto randomMarkerFillSymbolLayer = new QgsRandomMarkerFillSymbolLayer(100);
    randomMarkerFillSymbolLayer->setDensityArea(250.0);
    randomMarkerFillSymbolLayer->setCountMethod(Qgis::PointCountMethod::Absolute);
#else
    QVariantMap 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构成一个Symbol
    QgsSymbolLayerList layerList;
    layerList << randomMarkerFillSymbolLayer;
    //构造QgsFillSymbol并设置renderer
    auto fillSymbol = new QgsFillSymbol(layerList);
    singleSymbolRenderer->setSymbol(fillSymbol);
    layer->setRenderer(singleSymbolRenderer);
}
  • 效果如下图

总结

  • 介绍了矢量图层面要素单一符号中的随机标记填充(Random Marker Fill)
相关推荐
雷动软件工作室8 天前
1. Msys2环境安装
msys2·qgis二次开发·win qgis debug
雷动软件工作室1 年前
9.5 栅格图层符号化多波段彩色渲染
qgis二次开发
雷动软件工作室1 年前
8.12 矢量图层面要素单一符号使用二(仅渲染中心点)
qgis二次开发
雷动软件工作室2 年前
8.2 矢量图层点要素单一符号使用一
qt·gis·qgis二次开发
雷动软件工作室2 年前
5.2 加载矢量图层(delimitedtext,spatialite,wfs,memory)
qgis二次开发