QGIS二次开发(地图符号库操作)
实习三 地图符号库操作
3.1 任务要求
- 基于QGIS,实现地图符号的设计/存储与显示;
- 基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号,改变矢量图层的显示效果;
- 可编辑地图的符号库汇中的点符号、线符号、面符号和颜色表。
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,实现地图符号的设计/存储与显示;基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号,改变矢量图层的显示效果;可编辑地图的符号库汇中的点符号、线符号、面符号…...

线性代数行列式
目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得:分…...
Vision Transformer (ViT) 论文的第二句话
Vision Transformer (ViT) 论文的第二句话 flyfish 原句: “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…...

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

centos7 免安装mysql5.7及配置(支持多个mysql)
一) 下载免安装包: mysql下载地址: https://dev.mysql.com/downloads/mysql/下载时,选择以前5.7版本: image 下载第一个TAR压缩包: image 二) 定义安装路径并解压安装包 1、假设需要把MySQL放到 /usr/local…...
Python的Pandas--Series的创建和实现
1.Series函数的格式: pandas.Series(data,index,dtype,name,copy) data:一组数据(ndarray类型、list、dict等类)或标量值 index:数据索引标签。如果不指定,默认为整数,从0开始 dtype&#x…...

OCR实践-问卷表格统计
前言 书接上文 OCR实践—PaddleOCROCR实践-Table-Transformer 本项目代码已开源 放在 Github上,欢迎参考使用,Star https://github.com/caibucai22/TableAnalysisTool 主要功能说明:对手动拍照的问卷图片进行统计分数(对应分数…...
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) 是近年来网络领域的一项新技术,“segment” 在这里 指代网络隔离技术,例如 MPLS。如果快速回顾网络设计在过去几十年的 发展,我们会发现 SR 也许是正在形成的第三代网络设计…...

【K8s】专题十五(6):Kubernetes 网络之 Pod 网络调试
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全…...

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

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

多功能jquery图片预览放大镜插件
xZoom是一款多功能的jquery图片预览放大镜插件。它支持多种图片放大模式,可以和Fancy Box或Magnific Pop-up等插件结合使用,功能非常强大。 在线预览 下载 使用方法 在页面中引入jquery和xzoom.css以及xzoom.js文件。 <link rel"stylesheet&…...
CSS系列(39)-- Shapes详解
前端技术探索系列:CSS Shapes详解 ✨ 致读者:探索形状布局的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Shapes,这个强大的形状布局特性。 基础形状 🚀 圆形与椭圆 /* 基础圆形 */ .circle {widt…...
AI 神经网络在智能家居场景中的应用
在科技持续进步的当下,智能家居领域正经历着深刻变革,AI 神经网络技术的融入成为推动这一变革的关键力量,为家居生活带来了诸多显著变化与提升,本文将几种常见的AI算法应用做了一下总结,希望对物联网从业者有所帮助。 …...
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 属性: font-family:设置字体font-size:设置字体大小font-weight:设置字体的粗细(如 normal, bold, lighter 等)color:…...

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

【论文笔记】Visual Alignment Pre-training for Sign Language Translation
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Visual Alignment Pre-tra…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...