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

8.12 矢量图层面要素单一符号使用八(随机标记填充)_qgis随机填充-CSDN博客

目录

前言

[随机标记填充(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,可设置的属性如下图

Marker Fill需要设置其子符号,子符号类型为Marker

  • 属性设置完成后,图层显示效果如下图

二次开发代码实现随机标记填充(Random Marker Fill)

  • QgsRandomMarkerFillSymbolLayer是Random Marker Fill,详情见文档,类图如下
  • 函数setSubSymbol (QgsSymbol *symbol)可以设置子符号
  • 创建符号层有两种方法:构造函数和create
  • 方法一
  1. 从图层获取渲染器
cpp 复制代码
    //从图层获取渲染器
    QgsFeatureRenderer * layerRenderer= layer->renderer();
    QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
  1. 构造函数:修改属性可以调用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)
相关推荐
Merokes2 小时前
关于Gstreamer+MPP硬件加速推流问题:视频输入video0被占用
c++·音视频·rk3588
请来次降维打击!!!3 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
别NULL3 小时前
机试题——统计最少媒体包发送源个数
c++·算法·媒体
嘤国大力士4 小时前
C++11&QT复习 (七)
java·c++·qt
背影疾风4 小时前
C++学习之路:指针基础
c++·学习
x-cmd4 小时前
[250331] Paozhu 发布 1.9.0:C++ Web 框架,比肩脚本语言 | DeaDBeeF 播放器发布 1.10.0
android·linux·开发语言·c++·web·音乐播放器·脚本语言
myloveasuka4 小时前
[Linux]从硬件到软件理解操作系统
linux·开发语言·c++
UpUpUp……4 小时前
特殊类的设计/单例模式
开发语言·c++·笔记·单例模式
苏克贝塔5 小时前
CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法
c++·vscode·学习
嘤国大力士5 小时前
C++11&QT复习 (十一)
开发语言·c++·qt