Qgis 开发初级 《符号化》

本章主要简介Qgis 的矢量图层的符号化。Qgis的符号化具体作用于每个图层,图层通过具体的方法设置符号化样式。

1、QgsFeatureRenderer

Qgs的符号化类主要是QgsFeatureRenderer,这是一个抽象类,它派生出了许多类,如下所示。常用的有三个 QgsSingleSymbolRenderer(单一符号化),QgisCategorizedSymbolRenderer(分类符号化),QgsGraduatedSymbolRenderer(分级符号化),分级符号化是连续的。符号化派生类是需要Symbol 才能实例化的。

2、Symbol

符号化的本质是符号。QgsSymbol 也是一个抽象类,针对点,线,面 三种情况,派生如下三个类。Symbol 通常要配合QgsSymbolLayer 来使用。

用Render 和Symbol 可以直接符号化矢量图层,以下是一个简单的示例。

QgsCategoryList cats = QgsCategoryList();QgsRendererCategory  qrc = QgsRendererCategory();qrc.setLabel(item->entName()); //字段名字
qrc.setValue(item->code()); //值
qrc.setRenderState(true);
QgsSymbol* symbol= QgsSymbol::defaultSymbol(vecLayer->geometryType());
QColor startColor;
color.setRgb(200,0, 0);
symbol->setColor(color);qrc.setSymbol(symbol);
cats.push_back(qrc);//这里可以循环遍历多加几个值//构建Render
std::unique_ptr< QgsCategorizedSymbolRenderer > r = std::make_unique< QgsCategorizedSymbolRenderer >(ysdm, cats);
//渲染图层
vecLayer->setRenderer(r->clone());

如下是一个db 中GeometryGenerator 类型的 SymbolLayer。

<symbol type="marker" alpha="1" force_rhr="0" frame_rate="10" name="DMWZ" clip_to_extent="1" is_animated="0">
<data_defined_properties>
<Option type="Map">
<Option value="" type="QString" name="name" /><Option name="properties" /><Option value="collection" type="QString" name="type" /></Option>
</data_defined_properties><layer pass="0" class="GeometryGenerator" locked="0" enabled="1"><Option type="Map">
<Option value="Line" type="QString" name="SymbolType" />
<Option value="make_line(make_point(x($geometry)+0.5000, y($geometry)), make_point(x($geometry)+0.4924, y($geometry)+0.0868), make_point(x($geometry)+0.4698, y($geometry)+0.1710), make_point(x($geometry)+0.4330, 
y($geometry)+0.2500), make_point(x($geometry)+0.3830, y($geometry)+0.3214), make_point(x($geometry)+0.3214, y($geometry)+0.3830), make_point(x($geometry)+0.2500, 
y($geometry)+0.4330), make_point(x($geometry)+0.1710, y($geometry)+0.4698), make_point(x($geometry)+0.0868, y($geometry)+0.4924), make_point(x($geometry), 
y($geometry)+0.5000), make_point(x($geometry)-0.0868, y($geometry)+0.4924), make_point(x($geometry)-0.1710, y($geometry)+0.4698), 
make_point(x($geometry)-0.2500, y($geometry)+0.4330), make_point(x($geometry)-0.3214, y($geometry)+0.3830), make_point(x($geometry)-0.3830, 
y($geometry)+0.3214), make_point(x($geometry)-0.4330, y($geometry)+0.2500), make_point(x($geometry)-0.4698, y($geometry)+0.1710), 
make_point(x($geometry)-0.4924, y($geometry)+0.0868), make_point(x($geometry)-0.5000, y($geometry)), make_point(x($geometry)-0.4924, 
y($geometry)-0.0868), make_point(x($geometry)-0.4698, y($geometry)-0.1710), make_point(x($geometry)-0.4330, y($geometry)-0.2500),make_point(x($geometry)-0.3830, y($geometry)-0.3214), make_point(x($geometry)-0.3214, y($geometry)-0.3830), make_point(x($geometry)-0.2500, y($geometry)-0.4330), make_point(x($geometry)-0.1710, y($geometry)-0.4698), make_point(x($geometry)-0.0868, y($geometry)-0.4924), make_point(x($geometry), y($geometry)-0.5000), make_point(x($geometry)+0.0868, y($geometry)-0.4924), make_point(x($geometry)+0.1710, y($geometry)-0.4698), make_point(x($geometry)+0.2500, y($geometry)-0.4330), make_point(x($geometry)+0.3214, y($geometry)-0.3830), make_point(x($geometry)+0.3830, y($geometry)-0.3214), make_point(x($geometry)+0.4330, y($geometry)-0.2500), make_point(x($geometry)+0.4698, y($geometry)-0.1710), make_point(x($geometry)+0.4924, y($geometry)-0.0868), make_point(x($geometry)+0.5000, y($geometry)))" type="QString" name="geometryModifier" /><Option value="MapUnit" type="QString" name="units" /></Option><data_defined_properties><Option type="Map"><Option value="" type="QString" name="name" /><Option name="properties" /><Option value="collection" type="QString" name="type" /></Option></data_defined_properties><symbol type="line" alpha="1" force_rhr="0" frame_rate="10" name="@DMWZ@0" clip_to_extent="1" is_animated="0"><data_defined_properties><Option type="Map"><Option value="" type="QString" name="name" /><Option name="properties" /><Option value="collection" type="QString" name="type" /></Option></data_defined_properties><layer pass="0" class="SimpleLine" locked="0" enabled="1"><Option type="Map"><Option value="0" type="QString" name="align_dash_pattern" /><Option value="square" type="QString" name="capstyle" /><Option value="5;2" type="QString" name="customdash" /><Option value="3x:0,0,0,0,0,0" type="QString" name="customdash_map_unit_scale" /><Option value="MM" type="QString" name="customdash_unit" /><Option value="0" type="QString" name="dash_pattern_offset" /><Option value="3x:0,0,0,0,0,0" type="QString" name="dash_pattern_offset_map_unit_scale" /><Option value="MM" type="QString" name="dash_pattern_offset_unit" /><Option value="0" type="QString" name="draw_inside_polygon" /><Option value="bevel" type="QString" name="joinstyle" /><Option value="35,35,35,255" type="QString" name="line_color" /><Option value="solid" type="QString" name="line_style" /><Option value="0.26" type="QString" name="line_width" /><Option value="MM" type="QString" name="line_width_unit" /><Option value="0" type="QString" name="offset" /><Option value="3x:0,0,0,0,0,0" type="QString" name="offset_map_unit_scale" /><Option value="MM" type="QString" name="offset_unit" /><Option value="0" type="QString" name="ring_filter" /><Option value="0" type="QString" name="trim_distance_end" /><Option value="3x:0,0,0,0,0,0" type="QString" name="trim_distance_end_map_unit_scale" /><Option value="MM" type="QString" name="trim_distance_end_unit" /><Option value="0" type="QString" name="trim_distance_start" /><Option value="3x:0,0,0,0,0,0" type="QString" name="trim_distance_start_map_unit_scale" /><Option value="MM" type="QString" name="trim_distance_start_unit" /><Option value="0" type="QString" name="tweak_dash_pattern_on_corners" /><Option value="0" type="QString" name="use_custom_dash" /><Option value="3x:0,0,0,0,0,0" type="QString" name="width_map_unit_scale" /></Option><data_defined_properties><Option type="Map"><Option value="" type="QString" name="name" /><Option name="properties" /><Option value="collection" type="QString" name="type" /></Option></data_defined_properties></layer></symbol></layer></symbol>

这里可以看到这个符号是用Option里面的代码画出来的。

3、SymbolLayer

如下是SymbolLayer 类,该类大部分来说是枚举值,但是它有一个强大的功能可以用QgsGeometryGeneratorSymbolLayer类代码画出矢量符号。QgsGeometryGeneratorSymbolLayer 相当于自定义符号。

4、Style 管理器

Qgis 可以 用db文件存储它的Style的文件。Style 文件通过Style的管理器可以将db的每行实例成Symbol。具体的使用如下,这里是判断 styleSettings 里面是否有 syle.db 文件,如果没有则添加该文件。

	QString styleName ="syle.db";QList<QgsStyle*> stylelist = QgsProject::instance()->styleSettings()->styles();QgsStyle* style = nullptr;for (auto& item : stylelist) {if (item->name() + ".db" == styleName) {style = item;}}if (style == nullptr) {QgsProject::instance()->styleSettings()->addStyleDatabasePath(stylePath);style = QgsProject::instance()->styleSettings()->styles().last();}

5、Label 显示

Qgis 也有arcgis 的类似的Label 的功能。它可以显示某个具体属性里面的内容。在qgis 软件里面是下面的功能:Labels。它也是通过Symbol 来实现的。

如下代码封装是Labels 的实现,它实际只显示了文字,透明了符号本身。

bool symbolLayer(QgsVectorLayer* annotationLayer, const QString& noteTblName, const QString& esriGeoType, CAnnoUtils* annoUtil) {
#pragma region 文字符号化//将原来的点设置为透明QgsSymbol* symbol = QgsSymbol::defaultSymbol(Qgis::GeometryType::Point);symbol->setColor(QColor(0, 0, 0, 0));symbol->symbolLayers().at(0)->setStrokeColor(QColor(0, 0, 0, 0));QgsSingleSymbolRenderer* renderer = new QgsSingleSymbolRenderer(symbol);annotationLayer->setRenderer(renderer);//设置文字符号化QgsPalLayerSettings settings;QgsPropertyCollection settingsProperties;settings.drawLabels = true;settings.fieldName = CSystemFieldDZ::GetZJNRField(noteTblName);settings.obstacleSettings().setIsObstacle(false);//文字设置QgsTextFormat textFormat;//textFormat.setSize(annoUtil->m_noteSet.fontSize);textFormat.setSizeUnit(Qgis::RenderUnit::Points /*QgsUnitTypes::RenderPoints*/);// 设置字体颜色CUserLayerInfo* userInfo = CCommGISDB::GetUserLayerInfo(annotationLayer->name());QStringList rgbList = userInfo->layerColor().split(",");if (rgbList.size() == 3) {int r = rgbList[0].toInt();  // R 值int g = rgbList[1].toInt();  // G 值int b = rgbList[2].toInt();  // B 值textFormat.setColor(QColor(r,g,b));}else {textFormat.setColor(Qt::black);}QFont font(annoUtil->m_noteSet.trueTypeName);font.setBold(true);textFormat.setFont(font);settings.setFormat(textFormat);//设置位置settings.placement = Qgis::LabelPlacement::OverPoint;//对齐方式由备注字段或对齐方式控制QString BZField = CSystemFieldDZ::GetBZField(noteTblName);QString note_ZJDZField = CSystemFieldDZ::GetZJDZField(noteTblName);QString dqField = BZField;//如果有对齐方式的话:if (annotationLayer->fields().indexOf(note_ZJDZField) != -1) {dqField = note_ZJDZField;}const QVariantMap conversionMap{{ QStringLiteral("center"), 4 },{ QStringLiteral("left"), 5 },{ QStringLiteral("right"), 3 },{ QStringLiteral("top"), 7 },{ QStringLiteral("bottom"), 1 },{ QStringLiteral("top-left"), 8 },{ QStringLiteral("top-right"), 6 },{ QStringLiteral("bottom-left"), 2 },{ QStringLiteral("bottom-right"), 0 },};QString caseString = QStringLiteral("CASE ""WHEN '左对齐'= regexp_substr(%1,'[^;]+') THEN %2 ""WHEN '右对齐'= regexp_substr(%1,'[^;]+') THEN %3 ""WHEN '居中对齐'= regexp_substr(%1,'[^;]+') THEN %4 ""ELSE %4 END").arg(dqField,QgsExpression::quotedValue(conversionMap.value("left", "left")),QgsExpression::quotedValue(conversionMap.value("right", "right")),QgsExpression::quotedValue(conversionMap.value("center", "center")));settingsProperties.setProperty(QgsPalLayerSettings::OffsetQuad, QgsProperty::fromExpression(caseString));偏移也由备注中的内容做控制//QString offsetString = QStringLiteral("array(to_real(regexp_substr(%1,'[^;]+;([^;]+);')),-1*to_real(regexp_substr(%1,'[^;]+$')))").arg(BZField);//settingsProperties.setProperty(QgsPalLayerSettings::OffsetXY, QgsProperty::fromExpression(offsetString));settings.placementSettings().setAllowDegradedPlacement(true);settings.placementSettings().setOverlapHandling(Qgis::LabelOverlapHandling::AllowOverlapIfRequired);settings.setRotationUnit(Qgis::AngleUnit::Radians /*AngleRadians*/);//设置旋转角度settingsProperties.setProperty(QgsPalLayerSettings::LabelRotation, QgsProperty::fromField(CSystemFieldDZ::GetZJXZJField(noteTblName))); //注记旋转角 字段控制旋转角度//设置字体大小QString fontSizeField = CSystemFieldDZ::GetZJZGField(noteTblName);QString fontString = QStringLiteral("%1 * 1000 / @map_scale").arg(fontSizeField);settingsProperties.setProperty(QgsPalLayerSettings::Size, QgsProperty::fromExpression(fontString));settings.setDataDefinedProperties(settingsProperties);QgsVectorLayerSimpleLabeling* simpleLabeling = new QgsVectorLayerSimpleLabeling(settings);annotationLayer->setLabelsEnabled(true);annotationLayer->setLabeling(simpleLabeling);return true;
#pragma endregion
}

6、小节

本章就先介绍到这里,有些细节需要读者自己去摸索试用。本章主要介绍了Api的使用和类之间的逻辑关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning&#xff0c;在講self-supervised learning之前呢&#xff0c;就不能不介紹一下芝麻街&#xff0c;為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…

使用Bert+BiLSTM+CRF训练 NER任务

使用的数据集在这里E-Commercial NER Dataset / 电商NER数据集_数据集-阿里云天池 针对面向电商的命名实体识别研究&#xff0c;我们通过爬取搜集了淘宝商品文本的标题&#xff0c;并标注了4大类&#xff0c;9小类的实体类别。具体类型及实体数量如下 针对面向电商的命名实体…

iptables防火墙总结

iptables防火墙总结 四表五链 P 默认策略&#xff0c;-p 协议 出口防火墙&#xff0c;默认配置&#xff0c;使用Forword&#xff0c;采用-P 例题&#xff1a;设置iptables防火墙默认不允许任何数据包进入&#xff0c;相应命令是&#xff1a; Iptables -t filter -P FORWORD -j…

【数据结构】五分钟自测主干知识(十一)

上回&#xff08;半年前&#xff09;我们讲了二叉树&#xff0c;如果我们要找到二叉树某序遍历下的前驱和后继&#xff0c;我们需要对其作动态遍历求得&#xff0c;比较费时&#xff1b;或者给每个结点增加两个指针域prior和next&#xff0c;但比较费空间。 有没有既能省时间&…

【K8S系列】Kubernetes Service 基础知识 详细介绍

在 Kubernetes 中&#xff0c;Service 是一种抽象的资源&#xff0c;用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口&#xff0c;解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…

Openlayers高级交互(2/20):清除所有图层的有效方法

Openlayers项目中,经常会放置很多的图层,在业务操作的时候,会做出删除所有图层的行为。这里面给出了一个详细的方法,能够有效的解决 清除所有图层的问题。 效果图 专栏名称内容介绍Openlayers基础实战 (72篇)专栏提供73篇文章,为小白群体提供基础知识及示例演示,能解决…

[软件工程]—桥接(Brige)模式与伪码推导

桥接&#xff08;Brige&#xff09;模式与伪码推导 1.基本概念 1.1 动机 由于某些类型的固有的实现逻辑&#xff0c;使它们具有两个变化的维度&#xff0c;乃至多个维度的变化。如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术是的类型可以轻松的沿着两个乃至…

022_matrix_dancing_in_Matlab中求解一个超简单的矩阵问题

矩阵体操 首先&#xff0c;可以复习一下向量、矩阵和索引的基础知识。 向量约定矩阵约定矩阵索引 一般而言&#xff0c;我们利用进行计算大概就是以下的步骤&#xff1a; #mermaid-svg-UovF0Uldf5XxntJi {font-family:"trebuchet ms",verdana,arial,sans-serif;fo…

MFC实现以不规则PNG图片作为窗口背景

效果图 显示的不规则PNG图片 头文件 #pragma once #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib")// CShowBack 对话框class CShowBack : public CDialogEx {DECLARE_DYNAMIC(CShowBack) public:CShowBack(CWnd* pParent nullptr); // 标准构…

C++学习路线(二十二)

构造函数 构造函数作用 在创建一个新的对象时&#xff0c;自动调用的函数&#xff0c;用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。 构造函数特点 1.自动调用(在创建新对象时&#xff0c;自动调用) 2.构造函数的函数名&#xff0c;和类名相同 3.构造函数…

react18中的jsx 底层渲染机制相关原理

jsx 底层渲染机制 渲染 jsx 时&#xff0c;会先解析 jsx&#xff0c;生成一个虚拟 dom(virtual dom)。然后将虚拟 dom 渲染成真实 dom。如果 jsx 中包含事件&#xff0c;会将事件绑定到真实 dom 上。 虚拟 dom 对象&#xff0c;是框架内部构建的一套对象体系&#xff0c;对象…

无废话、光速上手 React-Router

React-Router React Router 是一个用于 React 应用的声明式路由库。它允许开发者通过组件化的方式定义应用的路由结构&#xff0c;使得路由管理更加直观和可维护 安装 pnpm i react-router-dom定义路由 定义路由有两种方式&#xff0c;分别是对象路由和路由组件&#xff0c…

AIGC时代 | 从零到一,打造你的专属AI Chat应用!

文章目录 目标功能概要&#xff08;1&#xff09;Chat 交互界面&#xff08;2&#xff09;流式接口&#xff08;3&#xff09;多轮会话&#xff08;4&#xff09;打字效果 系统架构&#xff08;1&#xff09;大模型服务层&#xff08;2&#xff09;应用服务层&#xff08;3&…

深入解析东芝TB62261FTG,步进电机驱动方案

TB62261FTG是一款由东芝推出的两相双极步进电机驱动器&#xff0c;采用了BiCD工艺&#xff0c;能够提供高效的电机控制。这款芯片具有多种优秀的功能&#xff0c;包括PWM斩波、内置电流调节、低导通电阻的MOSFET以及多种步进操作模式&#xff0c;使其非常适合用于需要精确运动控…

微信小程序的日期区间选择组件的封装和使用

组件化开发是一种将大型软件系统分解为更小、更易于管理和复用的独立模块或组件的方法。这种方法在现代软件开发中越来越受到重视&#xff0c;尤其是在前端开发领域。微信小程序的日期区间选择组件的使用 wxml 代码 <view><view bind:tap"chooseData">…

第一个Qt程序

创建项目 进入ui界面拖一个按钮 在头文件中添加函数说明 #ifndef HELLO_H #define HELLO_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class Hello; } QT_END_NAMESPACEclass Hello : public QMainWindow {Q_OBJECTpublic:Hello(QWidget *parent nullpt…

上海亚商投顾:沪指缩量调整 NMN概念股逆势大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整&#xff0c;三大指数午后一度跌超1%&#xff0c;北证50指数则涨超4%&#xff0c;北交所个股…

前端发送请求格式

1.multipart/form-data格式发送请求参数 什么时候用&#xff1a; 当后端API要求以表单的形式接收数据时&#xff0c;比如<input type"text" name"username">和<input type"password" name"password">&#xff0c;这些数据…

html全局属性、框架标签

常用的全局属性&#xff1a; 属性名含义id 给标签指定唯一标识&#xff0c;注意&#xff1a;id是不能重复的。 作用&#xff1a;可以让label标签与表单控件相关联&#xff1b;也可以与css、JavaScript配合使用。 注意&#xff1a;不能再以下HTML元素中使用&#xff1a;<hea…

自动化部署-01-jenkins安装

文章目录 前言一、下载安装二、启动三、问题3.1 jdk版本问题3.2 端口冲突3.3 系统字体配置问题 四、再次启动五、配置jenkins5.1 解锁5.2 安装插件5.3 创建管理员用户5.4 实例配置5.5 开始使用5.6 完成 总结 前言 spingcloud微服务等每次部署到服务器上&#xff0c;都需要本地…