QGIS二次开发三:显示Shapefile

Shapefile 为 OGR 所支持的最重要的数据格式之一,自然可以被 QGIS 加载。那么该如何显示Shapefile呢?

一、先上代码

#include <qgsapplication.h>
#include <qgsproviderregistry.h>
#include <qgsmapcanvas.h>
#include <qgsvectorlayer.h>

int main(int argc, char **argv)
{
	// 创建 QgsApplication 实例
	QgsApplication app(argc, argv, true);
	// 设置并检查数据插件目录
	QgsProviderRegistry::instance("D:/OSGeo4W/apps/qgis-ltr/plugins");

	// 控制台打印已载入的插件目录
	qDebug() << "QGIS data providers loaded:" << QgsProviderRegistry::instance()->providerList();

	// 设置 GDAL 数据目录环境变量
	qputenv("GDAL_DATA", "D:\\OSGeo4W\\apps\\gdal\\share\\gdal");

	// 创建 QgsCanvas 画布实例
	QgsMapCanvas c;

	// 从磁盘 .shp 文件创建矢量图层
	QgsVectorLayer* pVectorLayer = new QgsVectorLayer(u8"E:\\TestImage\\全国省界\\全国省界.shp", u8"省界");

	// 确认图层是否创建成功
	qDebug() << "Is layer valid:" << pVectorLayer->isValid();

	// 将图层添加到画布上
	c.setLayers(QList<QgsMapLayer*>() << pVectorLayer);

	// 设置画布窗体标题并显示画布
	// 画布本身是 QWidget 的子类,因此可以承担 QWidget 的所有操作
	c.setWindowTitle(u8"QGIS 二次开发:画布");
	c.show();

	// 缩放到图层的空间范围
	c.zoomToFullExtent();

	// 启动 QgsApplication 实例
	return app.exec();
}

二、效果图

 三、代码讲解

(一)

// 创建 QgsApplication 实例
QgsApplication app(argc, argv, true);

需要头文件<qgsapplication.h>

参见QGIS API Documentation: QgsApplication Class Reference

该类继承自QApplication,提供对QGIS特定资源(如主题路径、数据库路径等)的访问。

构造函数接受 5 个参数。其中 3 个是必备参数。前两个参数传入 main 函数的两个参数即可,第三个参数表示是否激活图形界面 GUI,一般设置为 true,除非你想做一个命令行的程序,如单纯用于数据处理,无需界面的程序。这里我们设置为 true。 

(二)

// 设置并检查数据插件目录
QgsProviderRegistry::instance("D:/OSGeo4W/apps/qgis-ltr/plugins");

需要头文件<qgsproviderregistry.h>

官方文档QGIS API Documentation: QgsProviderRegistry Class Reference

参数如下,pluginPath为数据插件的路径


QgsProviderRegistry * QgsProviderRegistry::instance(const QString & pluginPath = QString())	

数据驱动插件为一系列的动态链接库文件,存放于 QGIS 开发包的 plugins 目录下

// 控制台打印已载入的插件目录
qDebug()<<"QGIS data providers loaded:"<<QgsProviderRegistry::instance()->providerList();

 调用 QgsProviderRegistry 的成员函数 providerList() 可以返回一个存放所有支持的数据驱动插件的 QStringList 字符串列表,可以用于 debug。

参见QGIS API Documentation: QgsProviderRegistry Class Reference

(三) 

// 设置 GDAL 数据目录环境变量
qputenv("GDAL_DATA", "D:\\OSGeo4W\\apps\\gdal\\share\\gdal");

随后程序会检测 GDAL 的环境变量 GDAL_DATA 是否设置。该环境变量为一个目录,存放 GDAL 所需的资源和数据文件等。利用 Qt 提供的全局函数 qputenv() 可以方便的设置环境变量而无需修改操作系统设置,该环境变量仅在当前程序中生效。

参见官方文档 https://doc.qt.io/qt-5/qtglobal.html#qputenv

(四)

// 创建 QgsCanvas 画布实例
QgsMapCanvas c;

头文件<qgsmapcanvas.h>

它是 Qt 用于描述图形场景的 QGraphicsView 的子类,用于显示GIS类型的数据。

官方文档 QGIS API Documentation: QgsMapCanvas Class Reference 

(五)

// 从磁盘 .shp 文件创建矢量图层
QgsVectorLayer* pVectorLayer = new QgsVectorLayer(u8"E:\\TestImage\\全国省界\\全国省界.shp", u8"省界");

 头文件<qgsvectorlayer.h>

创建 QgsVectorLayer 的实例。该类在 QGIS 中描绘一个矢量图层,是 QgsMapLayer 的子类。

继承关系如下

Inheritance graph

构造函数原型为

QgsVectorLayer::QgsVectorLayer	(
    const QString & path = QString(),
    const QString & baseName = QString(),
    const QString & providerLib = "ogr",
    const QgsVectorLayer::LayerOptions & options = QgsVectorLayer::LayerOptions() 
)	

 path为参数的路径或url,baseName为在图例中展示的图层名称,

参见QGIS API Documentation: QgsVectorLayer Class Reference

图层创建完成后,可调用 isValid() 方法查看是否创建成功。

// 确认图层是否创建成功
qDebug() << "Is layer valid:" << pVectorLayer->isValid();

该方法位于QgsVectorLayer的父类QgsMapLayer中,返回图层的状态,创建成功则返回True,否则返回False。如果返回False,则可以通过QgsMapLayer的error()方法进步查看错误详情。

(六)

// 将图层添加到画布上
c.setLayers(QList<QgsMapLayer*>() << pVectorLayer);

图层创建成功后,将其添加到画布。调用画布类 QgsMapCanvas 的 setLayers() 方法即可,该方法会设置一个将在画布上面显示的图层列表。

函数原型如下,参见 QGIS API Documentation: QgsMapCanvas Class Reference

void QgsMapCanvas::setLayers(const QList< QgsMapLayer * > & layers)	

该方法接受一个图层基类 QgsMapLayer 指针的列表。通常情况下,图层越位于列表前面(即下标越小),绘制顺序越靠后(即越靠近观察者)。

(七)

// 设置画布窗体标题并显示画布
// 画布本身是 QWidget 的子类,因此可以承担 QWidget 的所有操作
c.setWindowTitle(u8"QGIS 二次开发:画布");
c.show();

在 Qt 中,只要是 QWidget 及其子类都可以作为单独的程序窗体处理。QgsMapCanvas 作为 QGraphicsView 的子类,当然也是QWidget的子类,我们可以使用QWidget的公共槽函数setWindowTitle()为其设置窗口标题,然后使用show()让其像普通的窗口一样显示出来。

(八)

// 缩放到图层的空间范围
c.zoomToFullExtent();

调用QgsMapCanvas的zoomToFullExtent(),这一步操作会让 QgsMapCanvas 缩放到内部所有可见图层的完整范围,就是让所有可见图层都完整地显示出来。

参见 QGIS API Documentation: QgsMapCanvas Class Reference

(九)

// 启动 QgsApplication 实例
return app.exec();

 最后,启动 QgsApplication (即 QApplication)。exec() 方法位于QgsApplication的父类QApplication中,目的是让程序进入主循环。主循环被打断后(如所有窗口关闭),程序结束。

参见官方文档 QApplication Class | Qt Widgets 5.15.14

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)

今日份题目&#xff1a; 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 s 只包含小写字母。 示例1 输入&#xff1a;s "abaccdeff" 输出&#xff1a;b 示例2 输入&#xff1a;s "" 输出&#xff1a; 提示 0 …

MySQL流程控制(二十八)

二八佳人体似酥&#xff0c;腰悬利剑斩愚夫&#xff0c;虽然不见人头落,暗里教君骨髓枯。 上一章简单介绍了MySQL变量(二十七) ,如果没有看过,请观看上一章 一. 定义条件与处理程序 定义条件是事先定义程序执行过程中可能遇到的问题&#xff0c;处理程序定义了在遇到问题时应…

BIO,NIO,AIO总结

文章目录 1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例 1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO的特性/NIO与IO区别1)Non-blocking IO&#xff08;非阻塞IO&#xff09;2)Buffer(缓冲区)3)Channel (通道)4)Selector (选择器) 2.3 NIO 读数据和写数据方式…

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接 背景目标依赖配置文件如下项目结构如下相关配置如下启动代码如下Controller如下启动成功接口调用成功 背景 工作做了一段时间&#xff0c;回忆起之前有个公司有线下笔试&#xff0c;要求考生做一个什么功能&#x…

无涯教程-Perl - fileno函数

描述 此函数返回指定的FILEHANDLE的文件描述符号(由C和POSIX函数使用)。通常,这仅在使用select函数和任何低级tty函数时才有用。 语法 以下是此函数的简单语法- fileno FILEHANDLE返回值 此函数返回FILEHANDLE的文件描述符(数字),失败时不确定。 Perl 中的 fileno函数 - 无…

考研算法38天:反序输出 【字符串的翻转】

题目 题目收获 很简单的一道题&#xff0c;但是还是有收获的&#xff0c;我发现我连scanf的字符串输入都忘记咋用了。。。。。我一开始写的 #include <iostream> #include <cstring> using namespace std;void deserve(string &str){int n str.size();int…

c语言每日一练(3)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

element-plus:el-date-picker日期只选择年月不要日

<el-date-picker v-model"value" type"month" format"YYYY-MM" value-format"YYYY-MM" />使用format属性将时间显示格式修改为YYYY–MM 年月格式 使用value-format将绑定值的格式修改为YYYY–MM年月格式

vcruntime140_1.dll修复的方法大全,缺失vcruntime140_1.dll解决方法分享

vcruntime140_1.dll这个文件在电脑里属于挺重要的一个文件&#xff0c;一但它缺失了&#xff0c;那么很多程序都是运行不了的&#xff0c;今天我们就来讲解一下这个vcruntime140_1.dll修复以及它的一些作用和属性。 一.vcruntime140_1.dll的作用 vcruntime140_1.dll是Microso…

【java安全】无Commons-Collections的Shiro550反序列化利用

文章目录 【java安全】无Commons-Collections的Shiro550反序列化利用Shiro550利用的难点CommonsBeanutils1是否可以Shiro中&#xff1f;什么是serialVersionUID&#xff1f;W 无依赖的Shiro反序列化利用链POC 【java安全】无Commons-Collections的Shiro550反序列化利用 Shiro5…

使用go-zero快速构建微服务

本文是对 使用go-zero快速构建微服务[1]的亲手实践 编写API Gateway代码 mkdir bookstore && cd bookstorego mod init bookstore mkdir api && goctl api -o api/bookstore.api syntax "v1"info(title: "xx使用go-zero"desc: "xx用…

Visual Studio配置PCL库

Visual Studio配置PCL库 Debug和Release配置新建项目配置属性表测试参考 Debug和Release Debug和Release的配置过程一模一样&#xff0c;唯一区别就在于最后一步插入的附加依赖项不同&#xff0c;因此下面以debug为例。 配置新建项目 1、新建一个C空项目&#xff0c;模式设置…

SQL分类及通用语法数据类型(超详细版)

一、SQL分类 SQL是结构化查询语言&#xff08;Structured Query Language&#xff09;的缩写。它是一种用于管理和操作关系型数据库系统的标准化语言。SQL分类如下&#xff1a; DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML:…

16-2_Qt 5.9 C++开发指南_使用样式表Qss自定义界面

进行本篇介绍学习前&#xff0c;请先参考链接01_1_Qt工程实践_Qt样式表Qss&#xff0c;后再结合本篇进行融合学习如何使用样式表定义界面。 文章目录 1. Qt样式表2. Qt样式表句法2.1 一般句法格式2.2 选择器 (selector)2.3 子控件&#xff08;sub-controls&#xff09;2.4 伪状…

UE5.2 LyraDemo源码阅读笔记(四)

上一篇&#xff08;三&#xff09;讲到在模式玩法UI点击Elimination进入淘汰赛模式。 UI选择点击Elimination后&#xff0c;触发蓝图W_HostSessionScreen的HostSession节点&#xff0c;有&#xff1a; 调用这个方法切换关卡后&#xff0c;会调用到LyraGameMode.cpp的 ALyraGam…

【Gitee的使用】Gitee的简单使用,查看/创建SSH公匙、创建版本库、拉取代码、提交代码

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章简单介绍&#xff0c;如何在Gitee上面创建版本库、拉取…

Zookeeper基础操作

搭建Zookeeper服务器 windows下部署 下载地址: https://mirrors.cloud.tencent.com/apache/zookeeper/zookeeper-3.7.1/ 修改配置文件 打开conf目录&#xff0c;将 zoo_sample.cfg复制一份&#xff0c;命名为 zoo.cfg打开 zoo.cfg&#xff0c;修改 dataDir路径&#xff0c…

2023最新性能测试面试题(带答案)

一、性能测试开展过程&#xff1a; 答&#xff1a;第一步&#xff1a;找产品沟通哪些接口需要压测&#xff0c;需要达到什么样的预期值(TPS和响应时间) 第二步&#xff1a;编写测试计划&#xff0c;人员、时间周期、工具 第三步&#xff1a;环境搭建 第四步&#xff1a;造数…

产品缺陷管理软件:了解功能与选择要点

在现代社会&#xff0c;产品缺陷管理软件已经成为了各个行业必不可少的工具。它可以帮助企业更好地管理和解决产品中存在的缺陷问题&#xff0c;提高产品质量和客户满意度。然而&#xff0c;市场上存在着众多的产品缺陷管理软件&#xff0c;如何选择一款好用、适合自己的软件成…

山东气象 × 和鲸科技:第一届齐鲁风云气象智能算法挑战赛圆满收官

7 月 20 日&#xff0c;中国气象局印发《人工智能气象应用工作方案&#xff08;2023 - 2030年&#xff09;》&#xff0c;旨在加快布局国产人工智能气象应用技术体系建设&#xff0c;推动人工智能技术在气象观测、预报及服务中的深度融合应用&#xff0c;为监测精密、预报精准、…