QGIS二次开发(地图符号库操作)

实习三 地图符号库操作

3.1 任务要求

  1. 基于QGIS,实现地图符号的设计/存储与显示;
  2. 基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号,改变矢量图层的显示效果;
  3. 可编辑地图的符号库汇中的点符号、线符号、面符号和颜色表。

3.2 完成过程

3.2.1 地图符号库实现技术

在QGIS中,地图符号库的设计、存储和现实等功能的实现主要应用到了< QgsSymbol >类和<QgsMarkerSymbolLayer>类。这里<QgsSymbol>类主要是用于呈现符号的抽象基类,经常和<QgsMarkerSymbolLayer>类搭配使用。而<QgsMarkerSymbolLayer>类标记符号层的抽象基类,也经常和<QgsSymbol>类搭配使用。

显然< QgsSymbol >类和<QgsMarkerSymbolLayer>类一个用于标记,一个用于呈现。

通过<QgsSymbol>类的继承关系不难发现可以呈现点、线、标记等,如图3.2.1-1所示。

图3.2.1-1 <QgsSymbol>类的继承关系

与之相搭配的,<QgsMarkerSymbolLayer>类的继承关系如图3.2.1-2所示。

图3.2.1-2 <QgsMarkerSymbolLayer>类的继承关系

接下来我们就如何实现基于QGIS二次开发实现地图符号库操作给出详细过程。

3.2.2 地图符号库实现过程

这里我们首先打开项目的ui文件,在主界面添加需要使用的QAction控件,分别为“自定义符号管理”、“qgs符号管理”、“更改矢量符号显示”。为了便于代码的编辑,将添加的按钮的objectName分别命名为“actionSelfStylelibMng”、“actionQgsStylelibMng”、“actionChgSymbolRender”。操作如图3.2.2-1所示。

图3.2.2-1 对ui进行操作

将设定的ui进行保存后,即可回到Visual Studio中,对相应的代码进行适当的编辑。

首先,需要进入头文件中,定义必要的函数,这是由于QT的信号与槽的机制,必须要进行信号与槽的相关绑定,这里我们主要预先声明了两个函数,分别是“void on_actionSelfStylelibMng_triggered()”和“void on_actionQgsStylelibMng_triggered()”。如图3.2.2-2所示。

图3.2.2-2 声明函数

接下来,需要对声明的函数进行详细的定义。on_actionSelfStylelibMng_triggered()函数通过调用“Smart3dMap::S3d_StyleManagerLib::getSingletonPtr()->excuteSysStyleManager()”来执行系统样式管理器,使用第三方库 Smart3dMap 中的 S3d_StyleManagerLib 类的单例模式对象,调用 excuteSysStyleManager() 方法,用于调用自定义样式库管理器。

on_actionQgsStylelibMng_triggered()函数主要加载用户样式库路径中的样式,并通过 QgsStyleManagerDialog 展示一个 QGIS 的样式管理对话框。并且在调用的过程中创建或访问一个静态的 QgsStyle 对象,同时确保样式库只加载一次,避免重复初始化。操作如图3.2.2-3所示。

图3.2.2-3 定义函数

需要说明的是,这里的符号库的设计和使用都属于是二次窗口,在QGIS中的调用也是独立于一级主窗口。因此,这里可以通过git拉取所需的符号设计库的方法进行调用,将QGIS设计完好的二次开发ui和逻辑在自己的系统中进行直接的调用,如图3.2.2-4所示。

图3.2.2-4 设计ui文件

同样的,拉取的还有需要的头文件和执行文件,如图3.2.2-5所示。

图3.2.2-5 拉取的执行文件

进行完如上步骤,编译即可得到相应的融合了地图符号库的系统,如图3.2.2-6所示。

图3.2.2-6 系统界面

3.3 结果展示

完成3.2部分的系统构建后,我们便可以使用系统的地图符号库了,打开“自定义符号管理”,可以看到这里可以实现地图符号的设计、存储与显示。如图3.3-1所示。

图3.3-1 自定义符号管理

这里我们也可以进行符号导入操作,打开“qgs符号管理”,依次点击【Import/Export】-【Import】-【File】,将从QGIS提供的官方符号库下载的“”符号文件导入,即可得到改XML符号文件中所得的符号标记,如图3.3-2所示。

图3.3-2 修改XML符号标记

点击想要导入的符号,再点击“Import”即可导入,在“All”中即可观察到刚刚导入的符号,如图3.3-3所示。

图3.3-3 导入的符号显示

同样,这里也可以通过点击“更改符号系统显示”实现符号的更改,如图3.3-4所示。

图3.3-4 更改符号系统的显示

同样,当我们点击【矢量符号】-【qgs符号系统】,也可以实现地图的符号库汇中的点符号、线符号、面符号和颜色表的编辑操作,如图3.3-5所示。

图3.3-5 符号修改

3.4 关键代码

这里的关键代码是针对符号库的打开操作和调用操作。

具体代码的功能主要是on_actionSelfStylelibMng_triggered()函数通过调用“Smart3dMap::S3d_StyleManagerLib::getSingletonPtr()->excuteSysStyleManager()”来执行系统样式管理器,使用第三方库 Smart3dMap 中的 S3d_StyleManagerLib 类的单例模式对象,调用 excuteSysStyleManager() 方法,用于调用自定义样式库管理器。

on_actionQgsStylelibMng_triggered()函数主要加载用户样式库路径中的样式,并通过 QgsStyleManagerDialog 展示一个 QGIS 的样式管理对话框。并且在调用的过程中创建或访问一个静态的 QgsStyle 对象,同时确保样式库只加载一次,避免重复初始化。

源代码如下:

//打开qgs样式库
void YLGIS::on_actionSelfStylelibMng_triggered()
{Smart3dMap::S3d_StyleManagerLib::getSingletonPtr()->excuteSysStyleManager();
}
//打开样式管理器
void YLGIS::on_actionQgsStylelibMng_triggered()
{//显示属性表static QgsStyle style;if (style.symbolCount() == 0){sqlite3_initialize();style.load(QgsApplication::userStylePath());}QgsStyleManagerDialog* dlg = new QgsStyleManagerDialog(&style);dlg->show();
}
//自定义符号库
#include "S3dmStyleManager.h"
#include "qgsapplication.h"
#include "qgsmarkersymbollayer.h"
#include "qgsfillsymbollayer.h"
#include "qfiledialog.h"
#include "QgsSymbolLayerRegistry.h"
#include "QgsApplication.h"
#include "qgsfillsymbollayer.h"
#include "qmessagebox.h"
#include "qgsvectorlayer.h"
#include "S3dmSymbolManager.h"
#include "S3dmApplySymbolDlg.h"
QgsStyle Smart3dMap::S3dmStyleManager::m_style;
Smart3dMap::S3dmStyleManager::S3dmStyleManager()
{
}
Smart3dMap::S3dmStyleManager::~S3dmStyleManager()
{
}
bool Smart3dMap::S3dmStyleManager::initStyle()
{sqlite3_initialize();return m_style.load(QgsApplication::userStylePath());
}
QgsStyle * Smart3dMap::S3dmStyleManager::getS3dmStyle()
{if (m_style.symbolCount() == 0){initStyle();}return &m_style;
}
QgsSymbol * Smart3dMap::S3dmStyleManager::getSymbol(std::string name)
{if (m_style.symbolCount() == 0){initStyle();}return m_style.symbol(QString::fromLocal8Bit(name.c_str()));
}
QgsSymbol * Smart3dMap::S3dmStyleManager::getSymbol(std::string name, const QColor & color)
{if (m_style.symbolCount() == 0){initStyle();}QgsSymbol* oriSymbol = m_style.symbol(QString::fromLocal8Bit(name.c_str()));if (oriSymbol == nullptr){return nullptr;}QgsSymbol* symbol = oriSymbol->clone();//添加一个背景图层QgsSymbol::SymbolType qgsType =symbol->type();if (qgsType != QgsSymbol::SymbolType::Line){if (qgsType == QgsSymbol::SymbolType::Marker){QgsSimpleMarkerSymbolLayer *simplelayer = new QgsSimpleMarkerSymbolLayer();simplelayer->setColor(color);simplelayer->setStrokeStyle(Qt::PenStyle::NoPen);symbol->insertSymbolLayer(0,simplelayer);}else if (qgsType == QgsSymbol::SymbolType::Fill){QgsSimpleFillSymbolLayer *simplelayer = new QgsSimpleFillSymbolLayer();simplelayer->setColor(color);simplelayer->setStrokeStyle(Qt::PenStyle::NoPen);symbol->insertSymbolLayer(0, simplelayer);}}return symbol;
}
// -------------------------------- 材质管理对象 --------------- //
Smart3dMap::S3d_StyleManagerLib * Smart3dMap::S3d_StyleManagerLib::getSingletonPtr()
{static S3d_StyleManagerLib instance;return &instance;
}
void Smart3dMap::S3d_StyleManagerLib::excuteSysStyleManager()
{S3dmSymbolManager* geo3dStyleManager = new S3dmSymbolManager();if (geo3dStyleManager == nullptr){geo3dStyleManager = new S3dmSymbolManager(nullptr);geo3dStyleManager->setObjectName("excuteSysStyleManager");geo3dStyleManager->setWindowFlags(geo3dStyleManager->windowFlags() | Qt::Dialog);}geo3dStyleManager->show();
}
__int64 Smart3dMap::S3d_StyleManagerLib::excuteSysStyleSelector()
{S3dmSymbolManager* geo3dStyleManager = new S3dmSymbolManager();QgsStyle* qStyle = QgsStyle::defaultStyle();if (geo3dStyleManager == nullptr){QString dbpath = QgsApplication::userStylePath();qStyle->load(dbpath);}else{qStyle = geo3dStyleManager->getStyle();if (qStyle == nullptr){return 0;}}S3dmApplySymbolDlg dlg(qStyle, nullptr, S3dmApplySymbolDlg::symbolType::POLYGON, NULL);int res = dlg.exec();if (res == QDialog::Accepted){return (__int64)dlg.getSymbol();}else{return 0;}return 0;
}
Smart3dMap::S3d_StyleManagerLib::S3d_StyleManagerLib()
{
}
Smart3dMap::S3d_StyleManagerLib::~S3d_StyleManagerLib()
{
}

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

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

相关文章

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集VA-I-FGSM介绍相关定义算法流程 VAI-FGSM代码实现VAI-FGSM算法实现攻击效果 代码汇总vaifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对…

Elasticsearch:使用 Ollama 和 Go 开发 RAG 应用程序

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 Ollama 通过 Go 创建 RAG 应用程序来利用本地模型。 关于各种开放模型&#xff0c;有很多话要说。其中一些被称为 Mixtral 系列&#xff0c;各种规模都有&#xff0c;而一种可能不太为人所知的是 openbiollm&#xff0c;这…

实战案例——ZooKeeper集群部署(新手教程超详细)

案例目标 了解ZooKeeper分布式应用程序协调服务使用3台机器搭建ZooKeeper集群使用ZooKeeper集群 案例分析 规划节点 ZooKeeper集群节点规划 Ip 主机名 节点 192.168.110.10 zookeeper1 集群节点 192.168.110.20 zookeeper2 集群节点 192.168.110.30 zookeeper3 …

上手教程:使用Terraform打造弹性VPC架构

最近Akamai发布的虚拟专用云&#xff08;VPC&#xff09;功能提供了一种隔离的网络&#xff0c;让云资源可以用私密的方式进行通信。 关于Akamai VPC功能&#xff0c;最棒的地方在于它有着极高的灵活性。用户可以通过Cloud Manager、开发人员工具&#xff08;如CLI&#xff09…

基于python的扫雷游戏

游戏 游戏目标&#xff1a; 揭开所有非地雷的格子。 如果揭开地雷&#xff0c;游戏失败。 使用标记功能&#xff08;&#x1f6a9;&#xff09;来标记可能的地雷位置。 格子类型&#xff1a; 空白格子&#xff1a;表示周围没有地雷。 数字格子&#xff1a;显示周围 8 个格子…

利用Java爬虫速卖通按关键字搜索AliExpress商品

在这个信息爆炸的时代&#xff0c;数据的价值日益凸显。对于电商领域的从业者来说&#xff0c;能够快速获取商品信息成为了一项重要的技能。速卖通&#xff08;AliExpress&#xff09;作为全球领先的跨境电商平台&#xff0c;拥有海量的商品数据。本文将介绍如何使用Java语言编…

Java中三大构建工具的发展历程(Ant、Maven和Gradle)

&#x1f438; 背景 我们要写一个Java程序&#xff0c;一般的步骤是编译&#xff0c;测试&#xff0c;打包。 这个构建的过程&#xff0c;如果文件比较少&#xff0c;我们可以手动使用java, javac,jar命令去做这些事情。但当工程越来越大&#xff0c;文件越来越多&#xff0c…

ubuntu快速入门

1.进入某个文件夹 cd workspace/2.tab自动补全 3.列出当前文件夹所有文件 ls列出所有文件包括隐藏文件 ls -a 4.创建文件夹 mkdir linuxLearn 5.创建文件 gedit command.sh在commmand.sh键入 echo hello echo hi? echo how are you? PS:touch hello.txt(也可以创建新…

meshy的文本到3d的使用

Meshy官方网站&#xff1a; 中文官网&#xff1a; Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网&#xff1a; Meshy目前似乎还没有单独的英文官网&#xff0c;但您可以在中文官网上找到英文界面或相关英文资料。 链…

嵌入式入门Day34

网络编程 Day1 为什么要学习网络编程&#xff1f;网络发展历史APRAnet阶段TCP/IP两个协议阶段网络体系结构及OSI开放系统系统互联模型网络体系结构概念OSI开放系统互联模型 TCP和UDP异同网络基础相关的概念字节序IP地址的转换IP地址子网掩码端口号 为什么要学习网络编程&#x…

代码解析:安卓VHAL的AIDL参考实现

以下内容基于安卓14的VHAL代码。 总体架构 参考实现采用双层架构。上层是 DefaultVehicleHal&#xff0c;实现了 VHAL AIDL 接口&#xff0c;并提供适用于所有硬件设备的通用 VHAL 逻辑。下层是 FakeVehicleHardware&#xff0c;实现了 IVehicleHardware 接口。此类可模拟与实…

【视觉惯性SLAM:四、相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容&#xff0c;它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型&#xff0c;以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…

【前端,TypeScript】TypeScript速成(二):逻辑控制与循环

TypeScript 当中的逻辑控制 if-else if-else 的使用和其它语言非常相似&#xff1a; let answer: yes|no|maybe|undefined undefinedlet httpStatus: 200 | 404 | 500 | 200 | 404 | 500 200function processHttpStatus(s: 200 | 404 | 500 | 200 | 404 | 500) {// 一律使…

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇&#xff0c;讲述如何将JSON文档存储到数据库中&#xff0c;包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab&#xff0c;其中color列的长度设为4000。若color的长度需要设为32767&a…

TOGAF之架构标准规范-业务架构

TOGAF标准规范中&#xff0c;业务架构阶段的主要工作是开发支持架构愿景的业务架构。 如上所示&#xff0c;业务架构&#xff08;Business Architecture&#xff09;在TOGAF标准规范中处于B阶段&#xff0c;该阶段的主要内容包括阶段目标、阶段输入、流程步骤、架构方法。 阶段…

科技创新 数智未来|清科·沙丘投研院走进竹云

12月20日&#xff0c;清科沙丘投研院带领企投家团队走进竹云交流分享&#xff0c;聚焦技术创新、企业数字化管理、行业前沿应用案例等热点议题&#xff0c;深入探讨数字技术如何点燃企业高质量发展的澎湃动力&#xff0c;共话企业数字化、智能化发展之道。 达晨财智股权管理部…

【免费分享】mysql笔记,涵盖查询、缓存、存储过程、索引,优化。

概括 本篇笔记涵盖基础查询、视图、存储过程、函数、索引、优化、分库分表。适合在学完mysql后进行时常观看。下面展示部分内容。如果需要可以在文章底部的链接进行下载查看。 简介 数据库 数据库&#xff1a;DataBase&#xff0c;简称 DB&#xff0c;存储和管理数据的仓库…

Docker 安装全攻略:从入门到上手

Docker 安装全攻略&#xff1a;从入门到上手 在当今的软件开发与部署领域&#xff0c;Docker 已经成为了一项不可或缺的关键技术。它能够将应用程序及其依赖项打包成轻量级、可移植的容器&#xff0c;极大地简化了开发、测试和部署的流程。本文将详细讲解在不同操作系统下 Doc…

mysql建立主从集群

mysql建立主从集群需要多个mysql服务器&#xff0c;主从数据库是通过log日志来进行同步的&#xff0c;所以需开启log-bin。本地安装多个mysql参考底部 主数据库配置 打开主数据库my.ini配置文件&#xff0c;给其配置server_id1 [mysqld] port3306 basedirD:/phpstudy_pro/1/…

curl+openssl 踩坑笔记

curl编译&#xff1a;点击跳转 踩坑一 * SSL certificate problem: unable to get local issuer certificate * closing connection #0 curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.se/docs/sslcerts.html …