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

QGIS3.28的二次开发八:显示shp的属性表

这里实现两个基本的 GIS 软件需求:矢量图层的属性表显示,以及根据属性筛选要素。

具体需求如下:

  • 加载一个矢量图层并打开其属性表;
  • 输入筛选条件确认无误后,画布上和属性表中均只显示筛选后的要素。

QGIS 提供了若干类用于实现图层属性表。属性表基于 Qt 的 QTableView 实现,利用了 QT中的Model/View 机制。QGIS 用于实现属性表所涉及到类比较多,彼此关系也不太直观, 这里仅做简单的总结。

本篇文章主要用到的与实现图层属性表相关的类有四个,分别为

QgsVectorLayerCache

该类继承自QObject,用于缓存给定QgsVectorLayer的特征,缓存的特征可以通过QgsAbstractCacheIndex进行索引,对给定用例进行适当的索引可能会大大提高性能。构造QgsAttributeTableModel时,只能使用图层的数据缓存,而不能直接使用原图层,应该是为了避免数据冲突之类的问题。

 QgsAttributeTableModel 

一个由QgsVectorLayerCache支持的模型,继承自QAbstractTableModel,它能够为QAbstractItemView提供特征/属性信息,作为QgsAttributeTableView的后端数据源。也能够为它的QModelIndexes生成编辑器小部件,在本QGIS源代码中主要被称为“主模型”。

QgsAttributeTableView

该类继承自QgsTableView,进而继承自QTableView。提供QgsVectorLayer特性的表视图,是最终显示图层属性表的视图组件。

QgsAttributeTableFilterModel

该类的继承关系如下图所示,为QSortFilterProxyModel和QgsFeatureModel的子类。其基类QSortFilterProxyModel作为数据源模型和视图的中间处理器,提供对源模型数据筛选和排序的能力。基类使用时必须通过setSourceModel()方法指定其源模型,然后调用QTreeView 的setModel()方法传入QSortFilterProxyModel这个中间模型(而非传入源模型),这样视图显示的数据就可以通过本中间模型进行排序和筛选而不影响到源模型中的数据。

运行截图

关键代码

#include "DefMainWindow.h"
#include <qgsattributetableview.h>	// 显示图层属性表的视图组件
#include <qmessagebox.h>	// 弹出提示框DefMainWindow::DefMainWindow(QWidget *parent) :QMainWindow(parent),mCanvas(this)
{ui.setupUi(this);ui.verticalLayout->addWidget(&mCanvas);mpVectorLayer = new QgsVectorLayer("E:\\TestImage\\中华人民共和国\\中华人民共和国.shp", "中华人民共和国");// 因为图层编码为utf8,这里也需要设置编码为utf8mpVectorLayer->setProviderEncoding("utf-8");// 参数一为要缓存特征的图层,参数二为缓存的大小,这里我们直接将缓存大小设定为要素数量,即全部缓存mpVectorLayerCache = new QgsVectorLayerCache(mpVectorLayer, mpVectorLayer->featureCount());// 创建源模型mpAttrTableModel = new QgsAttributeTableModel(mpVectorLayerCache);// 在使用此模型作为任何其他中间模型的源模型之前,将该图层加载到模型中mpAttrTableModel->loadLayer();// 创建中间模型,用于制作属性表筛选器// 参数一为Canvas画布,参数二为源模型// 筛选执行的过程中,画布上同样要更新渲染(只显示筛选后的要素)mpAttrTableFilterModel = new QgsAttributeTableFilterModel(&mCanvas, mpAttrTableModel);// 为中间模型设置源模型,由于上面创建中间模型的构造函数中已经设置了源模型,所以此句可以忽略mpAttrTableFilterModel->setSourceModel(mpAttrTableModel);// 将图层加载到Canvas画布mCanvas.setLayers(QList<QgsMapLayer*>() << mpVectorLayer);// 将画布缩放到完整范围,用于显示完整图层mCanvas.zoomToFullExtent();QObject::connect(ui.btnOpenAttributeTable, &QPushButton::clicked, this, &DefMainWindow::onOpenAttributeTableButtonClicked);QObject::connect(ui.btnApplyWhereClause, &QPushButton::clicked, this, &DefMainWindow::onApplyWhereClauseButtonClicked);
}// 点击“打开属性表”按钮,弹出属性表窗口
void DefMainWindow::onOpenAttributeTableButtonClicked()
{// 创建视图QgsAttributeTableView* pView = new QgsAttributeTableView(this);// 该方法来自QWidget,设置窗口为半模态类型pView->setWindowModality(Qt::WindowModality::WindowModal);// 设置窗口属性// Qt::Window 表示无论是否有父窗口部件,新窗口部件都是一个窗口,通常有一个窗口边框和一个标题栏pView->setWindowFlag(Qt::Window);// 设置窗口标题pView->setWindowTitle(u8"图层属性表");// 设置模型 void QgsAttributeTableView::setModel(QgsAttributeTableFilterModel * filterModel)	pView->setModel(mpAttrTableFilterModel);// 设置窗口大小pView->resize(700, 450);// 展示窗口pView->show();
}// 输入查询语句,筛查属性值
void DefMainWindow::onApplyWhereClauseButtonClicked()
{// 获取输入的查询语句QString whereClause = ui.leWhereClause->text();// 设置的同时会进行查询,如果查询出现错误则返回falseif (!mpVectorLayer->setSubsetString(whereClause)){// 如果有查询出现错误if (mpVectorLayer->dataProvider()->hasErrors()){// 显示记录的错误信息QMessageBox::warning(this, u8"错误", QString(u8"查询执行错误。返回信息:\n\n%1").arg(mpVectorLayer->dataProvider()->errors().join("\n")));// 清除记录的错误信息mpVectorLayer->dataProvider()->clearErrors();}// 如果查询字符串设置失败,而且没有错误,说明设置过滤表达式失败else{QMessageBox::warning(this, u8"错误", u8"设置过滤表达式失败。");}}
}

 查询功能详解

// 输入查询语句,筛查属性值
void DefMainWindow::onApplyWhereClauseButtonClicked()
{// 获取输入的查询语句QString whereClause = ui.leWhereClause->text();// 设置的同时会进行查询,如果查询出现错误则返回falseif (!mpVectorLayer->setSubsetString(whereClause)){// 如果有查询出现错误if (mpVectorLayer->dataProvider()->hasErrors()){// 显示记录的错误信息QMessageBox::warning(this, u8"错误", QString(u8"查询执行错误。返回信息:\n\n%1").arg(mpVectorLayer->dataProvider()->errors().join("\n")));// 清除记录的错误信息mpVectorLayer->dataProvider()->clearErrors();}// 如果查询字符串设置失败,而且没有错误,说明设置过滤表达式失败else{QMessageBox::warning(this, u8"错误", u8"设置过滤表达式失败。");}}
}

(1)bool QgsVectorLayer::setSubsetString(const QString & subset)

subset可以是sql语句的where子句,也可以是特定于底层数据提供程序和数据存储的其他定义字符串。如果设置subset字符串成功则返回true,否则返回false。QgsVectorLayer::setSubsetString()方法会将用户输入的subset应用到图层上,筛选子句被设置成功后,会自动映射到以其为源的数据缓冲,即之前建立的 QgsVectorLayerCache 对象上。相应的数据源模型也将得到更改,进而中间模型也会改,最终反映到 QgsAttributeTableView 的显示上。

(2)const QgsVectorDataProvider * QgsVectorLayer::dataProvider()const 

以正确的方式返回该层的数据提供程序,它可能是nullptr。在获取和处理图层错误信息时,需要通过QgsVectorLayer::dataProvider()方法获取QgsVectorDataProvider 类。这个类是对一切矢量数据源类型的抽象,类似于数据处理的中间件。

 (3)bool QgsVectorDataProvider::hasErrors()const

查询出现错误会返回true

(4)QStringList QgsVectorDataProvider::errors()const

获取记录的错误信息

(5)void QgsVectorDataProvider::clearErrors()

清除记录的错误信息

注意:查询时输入的待查询的字符串要用单引号!

参考文章 文章页 | mriiiron's blog 

相关文章:

QGIS3.28的二次开发八:显示shp的属性表

这里实现两个基本的 GIS 软件需求&#xff1a;矢量图层的属性表显示&#xff0c;以及根据属性筛选要素。 具体需求如下&#xff1a; 加载一个矢量图层并打开其属性表&#xff1b;输入筛选条件确认无误后&#xff0c;画布上和属性表中均只显示筛选后的要素。 QGIS 提供了若干…...

虚拟机安装 Ubuntu桌面版,宿主机无法访问虚拟机 ufw 防火墙简单使用

虚拟机安装 Ubuntu桌面版&#xff0c;宿主机无法访问虚拟机 问题处理安装ssh服务ufw防火墙 放行ssh服务ufw 常用命令 问题 本次安装使用的 ubuntu-22.04.2-desktop-amd64 &#xff0c;网络连接使用的是桥接&#xff0c;查看ubuntu的ip是正常的&#xff0c;与宿主机在同一个网段…...

jquery发送ajax练习

jquery发送ajax练习 工具代码运行结果 工具 HBuilder X 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>通过ajax进行图片的提取和显示</title><style>div{background-color: beige;color: red;font-s…...

adb用法,安卓的用户CA证书放到系统CA证书下

设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01; ​​​​​​​测试环境&#xff1a;redmi 5 plus、miui10 9.9.2dev&#xff08;安卓8.1&#xff09;、已root win下安装手机USB驱动&#xff08;过程略&#xff0c…...

【LVS-NAT配置】

配置 node1&#xff1a;128&#xff08;客户端&#xff09; node2&#xff1a;135&#xff08;调度器&#xff09; RS&#xff1a; node3&#xff1a;130 node4&#xff1a;132 node2添加网络适配器&#xff08;仅主机模式&#xff09; [rootnode2 ~]# nmtui[rootnode2 ~]#…...

时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测

时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测。基于贝叶斯(bayes)…...

注意:阿里云服务器随机分配可用区说明

阿里云服务器如有ICP备案需求请勿选择随机可用区&#xff0c;因为当前地域下的可用区可能不支持备案&#xff0c;阿里云百科分享提醒大家&#xff0c;如果你的购买的云服务器搭建网站应用&#xff0c;网站域名需要使用这台云服务器备案的话&#xff0c;不要随机分配可用区&…...

【Vue】使用print.js插件实现打印预览功能,超简单

目录 一、实现效果 二、实现步骤 【1】安装插件 【2】在需要打印的页面导入 【3】在vue文件中需要打印的部分外层套一层div&#xff0c;给div设置id。作为打印的区域 【4】在打印按钮上添加打印事件 【5】在methods中添加点击事件 三、完整代码 一、实现效果 二、实现步…...

3.5 Spring MVC参数传递

Spring MVC的Controller接收请求参数的方式有多种&#xff0c;本节主要介绍Spring MVC下的HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON参数传递方式&#xff0c;同时解决POST请求中文乱码问题。 1. HttpServletRequest参数传递 Controller RequestM…...

linux程序保护机制gcc编译选项

预备知识&#xff1a; 计算机内存的结构通常包括以下几个主要部分&#xff1a; 1.代码段(Code Segment)&#xff1a;也称为文本段&#xff0c;存储程序的可执行指令。代码段是被标记为可执行的&#xff0c;程序从代码段中获取指令并执行。 2.数据段(Data Segment)&#xff1a…...

指针与引用:C语言中的内存魔法

开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 也把我学习过程中搜集的资料分享给大家&#xff0c;希望可以帮助大家少走弯路&#xff0c;链接&#xff1a;h…...

docker desktop搭建 nginx

【docker 桌面版】windows 使用 docker 搭建 nginx 拉取 nginx 镜像 docker pull nginx运行容器 docker run -d -p 80:8081 --name nginx nginx本地磁盘创建 nginx 目录 D:\DockerRep\nginx复制 docker 中的 nginx 配置文件 查看运行的容器 docker ps -a docker cp 9f0f82d66dd…...

Redis缓存雪崩、击穿、穿透?

我们谈谈Redis在实际项目中用作缓存时经常碰到的&#xff0c;也是经常面试的三大问题&#xff1a;缓存穿透、缓存击穿、缓存雪崩&#xff0c;以及这些问题的常用解决方法。 在介绍这三大问题之前&#xff0c;我们需要先了解Redis作为一个缓存中间件&#xff0c;在项目中是如何…...

Kettle系列(一)下载安装与基础配置

Kettle系列&#xff08;一&#xff09;下载安装与基础配置 说明一、下载二、目录结构三、基础配置&#xff08;1&#xff09;环境变量&#xff08;2&#xff09;kettle配置 四、连接mysql8五、连接其他数据库六、总结 说明 更新时间&#xff1a;2023/08/13 17:47 本文记录了wi…...

MuMu模拟器运行一段时间后Device.Present耗时突然上升

1&#xff09;MuMu模拟器运行一段时间后Device.Present耗时突然上升 2&#xff09;​如何在运行过程中获得温度信息 3&#xff09;Input System鼠标更换主按键的Bug 4&#xff09;如何禁止Unity向https://config.uca.cloud.unity3d.com发送设备信息 这是第347篇UWA技术知识分享…...

14-矩阵相乘及其运算法则

矩阵与向量的乘法 在这一篇文章中我们就将基于上一篇重新审视矩阵的这个视点来理解矩阵的乘法&#xff0c;那么在这一篇&#xff0c;我们主要来看一下矩阵和向量的乘法。这里这个线性方程组是上一小节给大家举的模拟的一个非常简单的小型经济系统的例子&#xff0c;我们可以把…...

redis学习笔记(八)

文章目录 redis的配置redis的核心配置选项Redis的使用 redis的配置 cat /etc/redis/redis.confredis 安装成功以后,window下的配置文件保存在软件 安装目录下,如果是mac或者linux,则默认安装/etc/redis/redis.conf redis的核心配置选项 绑定ip&#xff1a;访问白名单&#x…...

Wlan——无线服务集和AP的基本概念以及AP的配置

目录 WLAN服务集的基本概念 AP的基本概念 AP的分类 AP模式的切换 胖&#xff08;FAT&#xff09;AP介绍 胖AP的工作模式 接入模式和路由模式的区别 胖AP的组网方式 瘦&#xff08;FIT&#xff09;AP介绍 瘦AP的工作模式 瘦AP的组网方式 胖AP和瘦AP的区别 AP的配置…...

【必看】时序逻辑仿真成组合逻辑?你知道原因吗?

对于初学者&#xff0c;一般会遇到这种情况&#xff0c;明明写的时序逻辑&#xff0c;结果仿真结果却是组合逻辑&#xff0c;然后看遍设计代码&#xff0c;始终找不到原因&#xff0c;交流群、知乎这种问题随处可见。但不要怀疑软件问题&#xff0c;modelsim这些专用软件基本不…...

PyTorch翻译官网教程-LANGUAGE MODELING WITH NN.TRANSFORMER AND TORCHTEXT

官网链接 Language Modeling with nn.Transformer and torchtext — PyTorch Tutorials 2.0.1cu117 documentation 使用 NN.TRANSFORMER 和 TORCHTEXT进行语言建模 这是一个关于训练模型使用nn.Transformer来预测序列中的下一个单词的教程。 PyTorch 1.2版本包含了一个基于论…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...