当前位置: 首页 > news >正文

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()
{
}

相关文章:

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

实习三 地图符号库操作 3.1 任务要求 基于QGIS&#xff0c;实现地图符号的设计/存储与显示&#xff1b;基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号&#xff0c;改变矢量图层的显示效果&#xff1b;可编辑地图的符号库汇中的点符号、线符号、面符号…...

线性代数行列式

目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得&#xff1a;分…...

Vision Transformer (ViT) 论文的第二句话

Vision Transformer (ViT) 论文的第二句话 flyfish 原句&#xff1a; “In vision, attention is either applied in conjunction with convolutional networks, or used to replace certain components of convolutional networks while keeping their overall structure in…...

Github 2024-12-27 Java开源项目日报Top10

根据Github Trendings的统计,今日(2024-12-27统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9Kotlin项目1C#项目1非开发语言项目1C++项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型:Ot…...

气相色谱-质谱联用分析方法中的常用部件,分流平板更换

分流平板&#xff0c;是气相色谱-质谱联用分析方法中的一个常用部件&#xff0c;它可以实现气相色谱柱流与MS检测器流的分离和分流。常见的气质联用仪分流平板有很多种&#xff0c;如单层T型分流平板、双层T型分流平板、螺旋分流平板等等。 操作视频http://www.spcctech.com/v…...

centos7 免安装mysql5.7及配置(支持多个mysql)

一&#xff09; 下载免安装包&#xff1a; mysql下载地址: https://dev.mysql.com/downloads/mysql/下载时&#xff0c;选择以前5.7版本&#xff1a; image 下载第一个TAR压缩包&#xff1a; image 二&#xff09; 定义安装路径并解压安装包 1、假设需要把MySQL放到 /usr/local…...

Python的Pandas--Series的创建和实现

1.Series函数的格式&#xff1a; pandas.Series(data,index,dtype,name,copy) data&#xff1a;一组数据&#xff08;ndarray类型、list、dict等类&#xff09;或标量值 index&#xff1a;数据索引标签。如果不指定&#xff0c;默认为整数&#xff0c;从0开始 dtype&#x…...

OCR实践-问卷表格统计

前言 书接上文 OCR实践—PaddleOCROCR实践-Table-Transformer 本项目代码已开源 放在 Github上&#xff0c;欢迎参考使用&#xff0c;Star https://github.com/caibucai22/TableAnalysisTool 主要功能说明&#xff1a;对手动拍照的问卷图片进行统计分数&#xff08;对应分数…...

uniapp中的条件编译

在script中 // #ifdef APP-PLUS console.log("11"); // #endif// #ifdef MP-WEIXIN console.log("22"); // #endif 在template中 <!-- #ifdef APP-PLUS --><view>哈哈哈</view> <!-- #endif --><!-- #ifdef MP-WEIXIN -->…...

Segment Routing Overview

大家觉得有意义和帮助记得及时关注和点赞!!! Segment Routing (SR) 是近年来网络领域的一项新技术&#xff0c;“segment” 在这里 指代网络隔离技术&#xff0c;例如 MPLS。如果快速回顾网络设计在过去几十年的 发展&#xff0c;我们会发现 SR 也许是正在形成的第三代网络设计…...

【K8s】专题十五(6):Kubernetes 网络之 Pod 网络调试

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…...

CMake 构建项目并整理头文件和库文件

本文将介绍如何使用 CMake 构建项目、编译生成库文件&#xff0c;并将头文件和库文件整理到统一的目录中以便在其他项目中使用。 1. 项目结构 假设我们正在构建一个名为 rttr 的开源库&#xff0c;初始的项目结构如下&#xff1a; D:\WorkCode\Demo\rttr-master\|- src\ …...

Boost之log日志使用

不讲理论&#xff0c;直接上在程序中可用代码&#xff1a; 一、引入Boost模块 开发环境&#xff1a;Visual Studio 2017 Boost库版本&#xff1a;1.68.0 安装方式&#xff1a;Nuget 安装命令&#xff1a; #只安装下面几个即可 Install-package boost -version 1.68.0 Install…...

多功能jquery图片预览放大镜插件

xZoom是一款多功能的jquery图片预览放大镜插件。它支持多种图片放大模式&#xff0c;可以和Fancy Box或Magnific Pop-up等插件结合使用&#xff0c;功能非常强大。 在线预览 下载 使用方法 在页面中引入jquery和xzoom.css以及xzoom.js文件。 <link rel"stylesheet&…...

CSS系列(39)-- Shapes详解

前端技术探索系列&#xff1a;CSS Shapes详解 ✨ 致读者&#xff1a;探索形状布局的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Shapes&#xff0c;这个强大的形状布局特性。 基础形状 &#x1f680; 圆形与椭圆 /* 基础圆形 */ .circle {widt…...

AI 神经网络在智能家居场景中的应用

在科技持续进步的当下&#xff0c;智能家居领域正经历着深刻变革&#xff0c;AI 神经网络技术的融入成为推动这一变革的关键力量&#xff0c;为家居生活带来了诸多显著变化与提升&#xff0c;本文将几种常见的AI算法应用做了一下总结&#xff0c;希望对物联网从业者有所帮助。 …...

Rocky DEM tutorial7_Conical Dryer_锥形干燥器

tutorial 7_Conical Dryer_锥形干燥器 文章目录 tutorial 7_Conical Dryer_锥形干燥器0. 目的1. 模型介绍2. 模型设置2.1设置physics2.2 导入几何2.3 设置motion2.4 Boundary边界设置2.5 设置材料2.6设置材料间相互作用2.7 创建粒子2.8 设置颗粒进口2.9 求解器设置3. 后处理Enj…...

CSS(二):美化网页元素

目录 字体样式 文本样式 列表样式 背景图片 字体样式 字体相关的 CSS 属性&#xff1a; font-family&#xff1a;设置字体font-size&#xff1a;设置字体大小font-weight&#xff1a;设置字体的粗细&#xff08;如 normal, bold, lighter 等&#xff09;color&#xff1a;…...

平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题

本MATLAB 代码实现了平方根无迹卡尔曼滤波&#xff08;SR-UKF&#xff09;算法&#xff0c;用于处理三维非线性状态估计问题 文章目录 运行结果代码概述代码 运行结果 三轴状态曲线对比&#xff1a; 三轴误差曲线对比&#xff1a; 误差统计特性输出&#xff08;命令行截图&…...

【论文笔记】Visual Alignment Pre-training for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Visual Alignment Pre-tra…...

【数据结构与算法】树,森林,二叉树之间的转换

树的定义&#xff08;递归定义&#xff09;树是满足以下条件的结构&#xff1a;有且仅有一个根节点&#xff08;没有父节点的节点&#xff09;其他节点分成 m 个互不相交的子树每个子树本身也是一棵树树的基本术语术语解释例子根节点最顶层的节点&#xff0c;没有父节点文件夹系…...

状态机中的人物状态

一&#xff0c;人物惯性移动using System.Collections; using System.Collections.Generic; using UnityEngine;public class CharMove3 : MonoBehaviour {public Transform charTrans; //角色坐标public Vector3 currentVelocity; //当前速度public float maxSpeed; //最大速率…...

Mavlink协议解析:从Pixhawk飞控到QGC地面站的完整通信流程

Mavlink协议深度解析&#xff1a;构建Pixhawk与QGC的高效通信桥梁 当Pixhawk飞控的LED指示灯开始规律闪烁&#xff0c;QGC地面站的地图上突然出现了一个蓝色圆点——这看似简单的连接背后&#xff0c;隐藏着一套精密的通信语言体系。Mavlink协议就像无人机系统的神经网络&#…...

隐私优先方案:OpenClaw+Qwen3-14B镜像处理敏感数据的5层防护

隐私优先方案&#xff1a;OpenClawQwen3-14B镜像处理敏感数据的5层防护 1. 为什么需要本地化隐私方案 去年处理一批客户调研数据时&#xff0c;我犯过一个致命错误——把包含联系方式的原始表格上传到某公有云AI平台进行清洗。三天后&#xff0c;公司邮箱突然收到匿名勒索邮件…...

从设计到上线:基于快马平台开发一个具备完整功能的qclaw官网实战指南

从设计到上线&#xff1a;基于快马平台开发一个具备完整功能的qclaw官网实战指南 最近接手了一个qclaw官网的开发需求&#xff0c;需要从零开始构建一个具备完整功能的官方网站。经过调研&#xff0c;我选择了InsCode(快马)平台作为开发环境&#xff0c;因为它不仅提供了完整的…...

OpenClaw + Seedance 2.0实战:从零搭建全自动AI视频生成流水线

OpenClaw Seedance 2.0实战&#xff1a;从零搭建全自动AI视频生成流水线 前言 这篇记录我用OpenClaw Agent串联Seedance 2.0满血版API&#xff0c;搭建全自动视频生产流水线的完整过程。包括架构设计、Skill编写、API调用细节和踩坑记录。 一、架构设计 用户输入&#xff…...

OpenClaw 的模型架构中,是否使用了非自回归生成(NAR)模块?

关于OpenClaw模型架构中是否使用了非自回归生成模块&#xff0c;这其实是一个挺有意思的问题。在讨论具体细节之前&#xff0c;或许可以先聊聊非自回归生成本身在技术演进中的位置。 非自回归生成&#xff0c;也就是NAR&#xff0c;和常见的自回归生成方式不太一样。自回归生成…...

C语言转译LDPC码:试用比特翻转算法逼近香农极限

作者&#xff1a;绳匠_ZZ0为什么我要学LDPC&#xff1f;前几篇文章中&#xff0c;我已经实现了卷积码&#xff08;Viterbi译码&#xff09;和RS卷积级联码&#xff0c;它们在低信噪比下表现不错。但学长和我提到&#xff1a;Turbo码和LDPC码能够逼近香农极限&#xff0c;在相同…...

嵌入式开发中静态代码扫描的必要性与实践

1. 为什么嵌入式开发需要静态代码扫描&#xff1f; 在嵌入式系统开发中&#xff0c;代码质量直接关系到产品的稳定性和安全性。由于嵌入式设备通常部署在关键基础设施、工业控制或消费电子产品中&#xff0c;代码缺陷可能导致严重后果。静态代码扫描作为代码质量保障的重要手段…...

如何高效使用Dism++:Windows系统维护的终极解决方案

如何高效使用Dism&#xff1a;Windows系统维护的终极解决方案 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 你是否曾为Windows系统运行缓慢而烦恼&#xff1f…...