7. 矢量图层数据查询选择和保存

news2024/11/22 22:06:03

文章目录

  • 前言
  • 数据查询
    • QGis
    • 代码实现
      • 获取图层数据的字段QgsField
      • 获取图层数据QgsFeature以及QgsAttribute
  • 数据选择
    • QGis
    • 代码实现
  • 创建虚拟图层并保存为shape文件
    • QGis
    • 代码实现
  • 总结

前言

  • 前几章分别介绍了qgis二次开发环境搭建、整体框架、二次开发初始化、Map canvas、矢量图层加载、栅格图层加载
  • 本章介绍矢量图层加载之后对图层数据的查询、选择以及保存
  • 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps

为了获取地理空间数据的详细信息及统计结果,需要使用数据选择、筛选、查询与统计等方法。
数据查询可以获得矢量数据与栅格数据的属性信息;
数据选择(仅针对矢量图层)是指通过空间位置、属性信息等特征选取的部分地理要素,被选择的地理要素可以进一步被其他的编辑工具或分析工具处理;
数据筛选是指通过表达式等方式仅加载矢量数据中的部分要素,以便进一步制图或处理;
数据统计可以针对这些属性信息进行统计操作。

数据查询

QGis

  • 以myplaces.shp为例,添加图层后,右键菜单选择Open Attribute Table, 如下图
    在这里插入图片描述
  • 可以看到一个二维表格,显示矢量图层的数据,如下图
    在这里插入图片描述
  • 其数据存储和关系型数据库相同
  • 表头NAME、PLACE、ADDR_CITY等等相当于数据库中的字段,在QGis中以QgsField类表示
  • 每一行是一个Feature,feature除表中的数据外还有空间属性,在QGis中以QgsFeature类表示
  • 每一行的每一列是一个具体的数据,在QGis中以QgsAttributes类表示
  • 可以从表格中筛选数据,点击下图所示按钮
    在这里插入图片描述
  • 输入表达式,如下图
    在这里插入图片描述
  • 选择Filter Current Selection后,点击按钮后,效果如下图所示
    在这里插入图片描述
    在这里插入图片描述

代码实现

获取图层数据的字段QgsField

  • QgsField代表字段,详情见文档
  • QgsVectorLayer中的函数QgsFields fields()用于获取字段
void MainWindow::getFieldsSlot()
{
    //添加测试图层
    QString filename = QStringLiteral("maps/shapefile/myplaces.shp");
    QFileInfo ff(filename);
    QgsVectorLayer* layer = (QgsVectorLayer*)mApp->addVectorLayer(filename,ff.baseName());
    zoomToFirstLayer<QgsVectorLayer*>();

    mVectorDataDockWidget->show();
    mVectorDataDockWidget->plainTextEdit()->clear();
    for(auto field : layer->fields())
    {
        mVectorDataDockWidget->plainTextEdit()->appendPlainText(QString("%1:%2").arg(field.name()).arg(field.typeName()));
    }
}

在这里插入图片描述
在这里插入图片描述

获取图层数据QgsFeature以及QgsAttribute

  • QgsFeature代表图层中一个特征,该特征包含一个featureId,空间特征(点、线、面以及其坐标)和字段/值属性列表。详情见文档
  • QgsAttributes是feature的字段/值属性,详情见文档
  • QgsVectorLayer的函数QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() )用户获取features,其参数QgsFeatureRequest用于过滤数据,默认参数会获取所有feature
  • QgsFeature的函数attributes()用于获取feature的属性
  • 首先演示获取所有feature,代码如下
void MainWindow::getFeaturesSlot()
{
    //添加测试图层
    QString filename = QStringLiteral("maps/shapefile/myplaces.shp");
    QFileInfo ff(filename);
    QgsVectorLayer* layer = (QgsVectorLayer*)mApp->addVectorLayer(filename,ff.baseName());
    zoomToFirstLayer<QgsVectorLayer*>();

    mVectorDataDockWidget->show();
    mVectorDataDockWidget->plainTextEdit()->clear();

    QgsFeatureIterator it = layer->getFeatures();
    QgsFeature f;
    while(it.nextFeature(f))
    {
        QString str;
        str.append(QString("%1").arg(f.id()));
        str.append(" ");
        QgsAttributes attrs = f.attributes();
        for(int i = 0;i < attrs.size();++i)
        {
            str.append(attrs[i].toString());
            str.append(" ");
        }
        mVectorDataDockWidget->plainTextEdit()->appendPlainText(str);
    }
}

在这里插入图片描述
在这里插入图片描述

  • 筛选数据的代码如下,将字段RAINFALL的值大于200.0的保留
    QString str = QString("\"RAINFALL\" > 200.0");
    auto request = QgsFeatureRequest().setFilterExpression(str);
    QgsFeatureIterator it = layer->getFeatures(request);
  • 完整测试代码如下
void MainWindow::getFeaturesSlot()
{
    //添加测试图层
    QString filename = QStringLiteral("maps/shapefile/myplaces.shp");
    QFileInfo ff(filename);
    QgsVectorLayer* layer = (QgsVectorLayer*)mApp->addVectorLayer(filename,ff.baseName());
    zoomToFirstLayer<QgsVectorLayer*>();

    mVectorDataDockWidget->show();
    mVectorDataDockWidget->plainTextEdit()->clear();

    //带feature的expression
    QString str = QString("\"RAINFALL\" > 200.0");
    auto request = QgsFeatureRequest().setFilterExpression(str);
    QgsFeatureIterator it = layer->getFeatures(request);
    QgsFeature f;
    while(it.nextFeature(f))
    {
        QString str;
        str.append(QString("%1").arg(f.id()));
        str.append(" ");
        QgsAttributes attrs = f.attributes();
        for(int i = 0;i < attrs.size();++i)
        {
            str.append(attrs[i].toString());
            str.append(" ");
        }
        mVectorDataDockWidget->plainTextEdit()->appendPlainText(str);
    }
}

在这里插入图片描述

数据选择

QGis

  • 在“Attributes Toolbar”工具栏中,单击按钮右侧的下拉按钮,弹出的菜单中展示了交互式选择的四种方式,如下图所示
    在这里插入图片描述
  • 选择要素之后,颜色变为黄色,如下图
    在这里插入图片描述
  • 在默认情况下,选择的要素以黄色的点、线或黄色面填充符号突出显示在地图画布上。在QGIS的“Options”对话框的“Canvas & Legend”选项卡中,通过“Selection color”选项即可更改选择要素的颜色
    在这里插入图片描述

代码实现

  • QgsVectorLayer的一组选择函数实现了多种选择方式,代码如下
void select( QgsFeatureId featureId );
void select( const QgsFeatureIds &featureIds );
void selectAll();
void selectByRect( QgsRectangle &rect, Qgis::SelectBehavior behavior = Qgis::SelectBehavior::SetSelection );
void selectByExpression( const QString &expression, Qgis::SelectBehavior behavior = Qgis::SelectBehavior::SetSelection, QgsExpressionContext *context = nullptr );
void selectByIds( const QgsFeatureIds &ids, Qgis::SelectBehavior behavior = Qgis::SelectBehavior::SetSelection );
void deselect( QgsFeatureId featureId );
void deselect( const QgsFeatureIds &featureIds );
void removeSelection();
void reselect();
void modifySelection( const QgsFeatureIds &selectIds, const QgsFeatureIds &deselectIds );

  • 完整测试代码如下
void MainWindow::selectFeaturesSlot()
{
    //添加测试图层
    QString filename = QStringLiteral("maps/shapefile/myplaces.shp");
    QFileInfo ff(filename);
    QgsVectorLayer* layer = (QgsVectorLayer*)mApp->addVectorLayer(filename,ff.baseName());
    zoomToFirstLayer<QgsVectorLayer*>();

    QString expression = QString("\"RAINFALL\" > 200.0");
    //选择所有
    //    layer->selectAll();
    //按照id选择
    //    QgsFeatureId id = 0;
    //    layer->select(id);
    //按照多个id选择
    //    QgsFeatureIds ids;
    //    ids << 0 << 1 << 2 << 3;
    //    layer->select(ids);
    //按照表达式选择
    //    layer->selectByExpression(expression);
    //按照区域选择,并且使用rubberband显示区域
    QgsRectangle rect(1006585,6222254,1010253,6219118);
    layer->selectByRect(rect);
    QgsPointXY point1(1006585,6222254);
    QgsPointXY point2(1010253,6222254);
    QgsPointXY point3(1006585,6219118);
    QgsPointXY point4(1010253,6219118);
    QgsRubberBand *rubberBand = new QgsRubberBand(mApp->mapCanvas(),QgsWkbTypes::PolygonGeometry);
    rubberBand->addPoint(point1);
    rubberBand->addPoint(point2);
    rubberBand->addPoint(point4);
    rubberBand->addPoint(point3);
    rubberBand->show();
    //选择feature并且闪烁
    //    QgsMapCanvasUtils::flashMatchingFeatures(mApp->mapCanvas(),layer,expression);
    //选择Feature并zoom
    //    QgsMapCanvasUtils::zoomToMatchingFeatures(mApp->mapCanvas(),layer,expression);
}

在这里插入图片描述
在这里插入图片描述

创建虚拟图层并保存为shape文件

虚拟图层是在不改变矢量数据源的情况下,改变某些空间或属性信息,或者组合多个矢量图层,并以虚拟图层的方式展现数据。虚拟图层并不直接指向数据源,而是通过SQL查询语句等引用一个或多个矢量图层。

QGis

  • 此处介绍如何通过虚拟图层将“2017.xlsx”文件连接到吉林省地级行政区划文件(jilin_dist.shp)
  • 分别加载这两个图层
    在这里插入图片描述
  • 打开图层jilin_dist的Attribute Table,如下图
    在这里插入图片描述
  • 打开图层2017–Sheet1的Attribute Table,如下图
    在这里插入图片描述
  • 添加一个虚拟图层,将上述两个图层的数据连接到一起
    在这里插入图片描述
  • 在“Layer name”文本框中输入新生成的虚拟图层的名称;在“Embedded layers”组合框中单击“Import”按钮,将上述两个图层加入列表中,并在“Local name”选项中设置图层名称,同时将其作为SQL查询语句的表名称。单击“Add”按钮可以输入图层位置;单击“Remove”按钮可以删除图层。在“Query”文本框中输入以下查询语句:
SELECT * FROM jilin_dist left outer join prec on jilin_dist.NAME = prec.city;
  • 该语句可以通过jilin_dist图层的“NAME”字段和prec图层的“city”字段将prec图层的属性连接到jilin_dist图层中。
  • 单击“Add”按钮即可在图层列表中看到该虚拟图层。打开virtual_layer图层的Attribute Table可以看到连接后的数据表,如下图
    在这里插入图片描述

代码实现

  • QgsVirtualLayerDefinition定义虚拟图层连接信息,详情见文档
  • 其成员函数void addSource( const QString &name, const QString &source, const QString &provider, const QString &encoding = "" );用于添加添加图层。代码如下
    //QgsVirtualLayerDefinition
    QgsVirtualLayerDefinition def;
    //add embedded layers
    def.addSource("prec","maps/virtuallayer/2017.xlsx|layername=Sheet1","ogr");
    def.addSource("jilin_dist","maps/virtuallayer/jilin_dist.shp","ogr");

  • 成员函数void setQuery( const QString &query )用于设置查询语句
    //查询语句
    def.setQuery("SELECT * FROM jilin_dist left outer join prec on jilin_dist.NAME = prec.city;");
  • 新建矢量图层QgsVectorLayer,数据源provider传入virtual,代码如下
const QgsVectorLayer::LayerOptions options { QgsProject::instance()->transformContext() };
QgsVectorLayer *vl = new QgsVectorLayer( def.toString(), QStringLiteral( "test" ), QStringLiteral( "virtual" ), options );
  • QgsVectorFileWriter用于将图层保存至文件,详情见文档
  • 其成员函数writeAsVectorFormatV3用于保存,虚拟图层保存至文件的代码如下
        QgsVectorFileWriter::SaveVectorOptions opt;
        QgsVectorFileWriter::writeAsVectorFormatV3(vl,"maps/virtuallayer/myvurtual.shp",QgsProject::instance()->transformContext(),opt);

在这里插入图片描述
在这里插入图片描述

  • 保存的图层文件如下
    在这里插入图片描述

总结

  • 分别演示了:
    • QGis软件矢量图层数据的查询、选择和保存
    • 二次开发c++ api的图层数据的查询、选择和保存

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

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

相关文章

在 Mac M1 上运行 Llama 2 并进行训练

在 Mac M1 上运行 Llama 2 并进行训练 Llama 2 是由领先的人工智能研究公司 Meta &#xff08;前Facebook&#xff09;开发并发布的下一代大型语言模型 (LLM)。 它基于 2 万亿个公共数据 token 进行了预训练&#xff0c;旨在帮助开发人员和企业组织构建基于人工智能的生成工具和…

通过pipeline配置sonar自动化实现过程解析

这篇文章主要介绍了通过pipeline配置sonar自动化实现过程解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.sonar配置webhooks&#xff0c; 2.url填写jenkins的地址&#xff1a;http://jenkinsurl/sonarqu…

TensorFlow2从磁盘读取图片数据集的示例(tf.keras.utils.image_dataset_from_directory)

import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.resnet import ResNet50#数据所在文件夹 base_dir ./data/cats_and_dogs train_dir os…

Docker搭建nacos2.x集群+nginx代理

说明&#xff1a; 如果只需要搭建单节点nacos&#xff0c;请参照我的这篇文章 一、环境准备 资源版本说明docker1.17用于安装nacos及mysql等依赖nacos2.1.1nacosmysql5.6用于数据持久化&#xff0c;本文使用mysql8.0.34 二、安装mysql 说明&#xff1a; 本次安装mysql将以d…

CorelDRAW和InDesign软件的功能区别

Corel和Ilustrator都是基于矢量的排版软件。另一方面&#xff0c;InDesign的主要目的是基于包含不同基本网格设计&#xff0c;以及标题和段落样式信息的母版页来制作多页面布局&#xff0c;例如杂志或书籍&#xff0c;这为了使出版物保持一致。 CorelDRAW图形套件是加拿大Core…

ME1W隐式增强 增加字段学习

需要增加 eina-IDNLF字段 而ME1W中原本是没有的&#xff0c;所以需要改动这个结构 改动后会在这里加入 同时如果程序本身不会输出的话&#xff0c;需要自己加&#xff0c;可以用增强 光标放在 ENHANCEMENT-SECTION 上&#xff0c;然后点击增强按钮 创建完后&#xff0c;你的增强…

【软件测试】自动化测试selenium

目录 一、什么是自动化测试 二、Selenium介绍 1、Selenium是什么 2、Selenium的原理 三、了解Selenium的常用API 1、webDriver API 1.1、元素定位 1.1.1、CSS选择器 1.1.2、Xpath元素定位 1.1.3、面试题 1.2、操作测试对象 1.3、添加等待 1.4、打印信息 1.5、浏览…

数学预备知识

函数篇&#xff1a; 一次函数、反比例函数、二次函数、指数函数、对数函数、幂函数、三角函数、反三角函数、极点坐标等等 初中数学 【a&#xff0c;b】&#xff1a;开区间 &#xff08;a&#xff0c;b&#xff09;&#xff1a;闭区间 ∞ &#xff1a;无穷大 ∞&#xff1…

webpack类似的工具还有哪些?

一、模块化工具 模块化是一种处理复杂系统分解为更好的可管理模块的方式 可以用来分割&#xff0c;组织和打包应用。每个模块完成一个特定的子功能&#xff0c;所有的模块按某种方法组装起来&#xff0c;成为一个整体(bundle) 在前端领域中&#xff0c;并非只有webpack这一款…

Selenium+Pytest自动化测试框架详解

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承&#xff1b;一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 一、测试框架简介 测试框架有什么优点 代码复用率高&…

ZKP6.1 Discrete-log-based Polynomial Commitments (Preliminary)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 6: Discrete-log-based Polynomial Commitments (Yupeng Zhang) Recall How to build an efficient SNARK? A polynomial commitment scheme A polynomial interactive oracle proof (IOP) SNARK for general circuits Plo…

【推荐】一个国内免费体验的AI论文写作网站-「智元兔 AI」

在当今技术飞速发展的时代&#xff0c;越来越多的领域开始应用人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;。其中&#xff0c;AI写作工具备受瞩目&#xff0c;备受推崇。在众多的选择中&#xff0c;智元兔AI是一款在笔者使用过程中非常有帮助的…

会议邀请 | 思腾合力邀您共赴CNCC 2023中国计算机大会

CNCC 2023于10月26日-28日将在沈阳的沈阳新世界博览馆举办。思腾合力作为行业领先的人工智能基础架构解决方案商&#xff0c;受邀参加本次盛会。在会上展出思腾AI算力服务器&#xff0c;诚挚邀请众多参会嘉宾莅临展位&#xff0c;共同探讨人工智能与智能算力的产业趋势&#xf…

VS的使用时遇到了basePath不能是相对路径的问题,如何处理?

使用VS&#xff0c;当你编译运行代码时出现以下的问题 解决方法 原因&#xff1a;文件库的路径存在问题&#xff0c;需要把相对路径改为绝对路径。 如何解决&#xff1a;去右键点击解决方案&#xff0c;选择属性-》调试-》命令中的参数被设置为相对路径。就可以解决以上的问题…

UE5 ChaosVehicles载具 增加方向盘动画 (连载三)

掌握该流程就能实现方向盘、码表指针、按钮等动画制作 1.复制一个骨骼&#xff0c;位置在方向盘的旋转中心&#xff0c;注意骨骼角度要与方向盘倾角一样&#xff0c;我这里是11.9&#xff0c;然后绑定权重 2.打开动画蓝图&#xff0c;把前车轮的角度值x转向比&#xff08;通…

泛型的使用案例,以及年月日的定制排序,传入Comparator对象

简易版&#xff1a;传送门&#xff1a;过关展将之——birthday排序&#xff08;年月日排序&#xff09;-CSDN博客 实现过程; public static void main(String[] args) {ArrayList<Employee> arrayList new ArrayList<>();Employee grace new Employee("G…

面对“双十一”这样的大促,品牌方还能多做些什么?

小编叨叨&#xff1a;当前市场环境不佳&#xff0c;经济下行时用户对于商品价格最敏感&#xff0c;当然价格也是决定企业经营利润&#xff0c;市场竞争力及用户口碑的重要核心影响因素&#xff0c;所以我们特地为企业准备了商品智能定价咨询及数据运营咨询服务&#xff0c;有需…

英语——分享篇——每日200词——3201-3400

3201——air-conditioning——[eərkəndɪʃnɪŋ]——n.空调设备&#xff1b;vt.给…装上空调——air-conditioning——air-condition空调(熟词)ing鹰(谐音)——空调设备的噪音让鹰不得安宁——The trains dont even have proper air-conditioning, grumbles Mr So. ——地铁…

深度学习_5_模型拟合_梯度下降原理

需求: 想要找到一条直线&#xff0c;能更好的拟合这一些点 如何确定上述直线就是最优解呢&#xff1f; 由计算机算出所有点与我们拟合直线的误差&#xff0c;常见的是均方误差 例如&#xff1a;P1与直线之间的误差为e1 将P1坐标带入直线并求误差得&#xff1a; 推广到所有点&a…

买充电桩你必须要知道三件事

分享一套开源充电桩云平台&#xff08;v2.5.1&#xff09;-- 支持二轮(电动自行车)、四轮(电动汽车) 中国电动汽车充电基础设施促进联盟的信息部主任&#xff0c;仝宗旗&#xff0c;在2022年接受了《中国汽车报》采访的时候&#xff0c;提到过一个数据。 电动车主在小区成功安…