写在前面:
本笔记根据多方资料整理而成,旨在为QGIS二次开发提供学习参考。内容仅供交流学习,欢迎共同探讨。

一、关于QGIS

QGIS 是一个功能强大的桌面GIS软件本身,为用户提供了图形化界面(GUI)来进行地图制作、空间数据管理、空间分析、地理信息可视化等所有GIS任务。它依赖于OSGeo4W,在Windows系统上,官方推荐的QGIS安装方式就是通过OSGeo4W安装器。当你从QGIS官网下载Windows安装程序时,你实际上下载的是OSGeo4W安装器的一个精简版,它会自动为你安装QGIS和其最小所需的依赖项。

二、关于OSGeo4W

OSGeo4W 是一个用于分发开源地理信息系统(OSGeo)软件的 安装包管理系统,而 QGIS 是它管理的 最重要的软件之一它的主要工作是下载、安装、更新和管理一大批在Windows上运行的开源GIS软件及其所有的依赖库

“依赖库”是什么? 像QGIS这样的复杂软件并非完全独立开发,它需要调用许多其他人写好的基础功能库(例如用于处理GDAL地理数据、PROJ坐标投影、GEOS几何运算等)。这些库就是“依赖”。手动管理这些依赖非常复杂且容易出错。

OSGeo4W 完美解决了这个问题。它提供了一个命令行和图形化界面,让你可以轻松地:选择QGIS,它会自动把所有需要的依赖库(GDAL, PROJ, GEOS等)都一并安装好;你还可以通过它安装GRASS GIS、SAGA GIS、gvSIG等 dozens 种其他GIS软件和命令行工具;可以同时安装QGIS的长期发布版(LTR)和最新开发版(Nightly),并轻松切换;用一个命令就能更新所有已安装的软件和库到最新版本。

三、版本信息

Visual Studio:2022

QGIS(LTR):3.44.2

Qt:5.15.13

四、下载QGIS+QT

OSGeo4W官网下载地址:Download · QGIS Web Site

点击下载,下载成功后如图所示:

右击以管理员身份运行(很重要!!!),进入安装向导。

设置存储路径,笔者存储在F:\OSGeo4W,注意如果刚刚没有以管理员身份运行的话,这里无法选择All Users。

选择第一个网址,继续点击下一页。

根据自己需要选择不同版本:

  • 长期发行版(LTR),以qgis-ltr列出
  • 开发版(DEV),以qgis-dev列出
  • Desktop: 桌面版
  • Libs: 开发版
特性LTR (Long-Term Release) 长期支持版DEV (Development) / 常规版
定位稳定、可靠、用于生产环境新功能、前沿、用于测试和体验
更新频率低(约每一年发布一个新的大版本)高(约每四个月发布一个新的大版本)
支持周期(每个版本发布后,会提供至少一年的bug修复和安全更新)(通常只支持到下一个常规版发布)
稳定性非常高。经过充分测试,bug较少。较低。包含最新代码,可能引入新的未知bug和API变动。
新功能较少。版本发布时的新功能在后续一年内基本冻结。非常多。第一时间包含所有最新功能和改进。
适用场景商业项目、科研项目、生产环境、系统集成、二次开发QGIS核心开发者、功能测试者、急于体验最新功能的高级用户

笔者选择下载ltr版本,为了让开发环境完整且正常工作,需要安装以下两个组件:

1. 从Desktop分类安装:qgis-ltr (运行时环境)

  • 这是什么? 这是完整的 QGIS 桌面应用程序本身和所有它运行所需的运行时库(DLL 文件)。

  • 为什么需要? 当在 Visual Studio 中编译完成二次开发程序后,要让它能运行起来,就必须有这些 DLL 文件。您的程序不是独立存在的,它需要调用这些 QGIS 的动态链接库。

2. 从Libs分类安装:qgis-ltr-devel (开发包)

  • 这是什么? 这是开发包。它不包含可执行程序,只包含编译所需的头文件 (.h) 导入库文件 (.lib) 和用于生成文档的文件。

  • 为什么需要? 当在 Visual Studio 中编写代码时,#include <qgsmapcanvas.h> 这样的语句需要找到头文件。当链接器工作时,它需要找到 qgis_core.lib 这样的库文件来生成你的.exe文件。这个包就提供了这些文件。

一个重要提示:当选择安装qgis-ltr-devel时,安装器会自动标记并安装所有它依赖的其他开发包(如gdal-devel,proj-devel,qt5-devel 等),这是最省心、最不容易出错的方式。

安装操作如下,输入qgis-ltr,点击Desktop下的Skip,点击后会显示版本号,注意不要点击Enter键。

qgis-ltr这个包只包含了运行QGIS桌面软件所必需的可执行文件(.exe)、动态链接库(.dll)和资源文件。它的目的是让用户能够打开并使用QGIS软件进行绘图和分析,而不是为了开发。要进行二次开发需要的是 头文件(.h)、导入库(.lib) 和用于调试的符号文件(.pdb),这些都在devel包里。继续输入qgis-ltr-devel,点击Libs下的Skip,点击后显示版本号。

OSGeo4W中的QGIS及其所有依赖库(GDAL、PROJ等)都是使用特定版本的Qt(通常是Qt 5.15.x)和特定编译器(MSVC)编译的。如果从Qt官网下载另一个版本的Qt,或者用不同编译器(如MinGW)编译的Qt,会产生二进制不兼容问题,导致链接失败或运行时崩溃。

所以继续在OSGeo4W上安装Qt5开发包,继续输入qt5-devel,进行同样的操作,点击Libs下的Skip,点击后显示版本号,点击下一页安装。
注意:Qt 版本一定是5.15.x,QGIS 3.x 系列与 Qt 6 不兼容。

安装完成如下图。

五、环境配置

打开Visual Studio 2022,点击菜单栏的扩展—管理扩展,然后在右上角搜索框中输入Qt,找到Qt Visual Studio Tools(通常由Qt Company提供),点击“下载”。下载完成后,关闭所有VS窗口,安装程序会自动运行,安装完成后重新打开VS。

重新打开Visual Studio,点击菜单栏的 扩展—Qt VS Tools—Options—Versions,在弹出的窗口中,点击右侧的Add 按钮。添加一个新的Qt版本:

Name: 取一个容易识别的名字,例如QtOSGeo4W

Location: 浏览到OSGeo4W中的Qt目录,笔者设置的地址是F:\OSGeo4W\apps\Qt5

点击确定保存,现在VS就知道去哪里找到Qt的编译工具和库文件了。

在VS2022中创建QT Widegets项目,由于QGIS二次开发环境必须在Release环境下才能运行,因此将Debug删去,只保留Release版本。其他默认下一步,成功创建项目。

设置项目属性,右键项目,选择属性—C/C++—常规—附加包含目录,添加下载的OSGeo4W的相关库存储路径:

F:\OSGeo4W\apps\qgis-ltr\include

F:\OSGeo4W\apps\Qt5\include

F:\OSGeo4W\apps\Qt5\include\QtCore

F:\OSGeo4W\apps\Qt5\include\QtWidgets

F:\OSGeo4W\apps\Qt5\include\QtXml

F:\OSGeo4W\apps\Qt5\include\QtGui(根据自己设置的安装路径修改)

选择链接器—常规—附加库目录,添加下载的OSGeo4W的相关库存储路径:

F:\OSGeo4W\apps\Qt5\lib

F:\OSGeo4W\apps\qgis-ltr\lib(根据自己设置的安装路径修改)

选择链接器—输入—附加依赖项,添加以下内容:

qgis_core.lib

qgis_app.lib

qgis_gui.lib

Qt5Core.lib

Qt5Gui.lib

Qt5Widgets.lib

选择C/C++—预处理器—预处理器定义,输入:_USE_MATH_DEFINES 

选择常规—C++语言标准,设置为 ISO C++17标准(/std:c++17)。

输入以下示例代码,注意修改成自己的路径,图层路径不要出现中文:

#include "QGIS.h"//修改为自己的项目名
#include <QtWidgets/QApplication>
#include <qgsapplication.h>
#include <qgsmapcanvas.h>
#include <qgsrasterlayer.h>
#include <qgsmaptoolpan.h>
#include <QDebug>
#include <QDir> // 添加这个头文件int main(int argc, char* argv[])
{// 设置PROJ库的环境变量 - 这是关键!// 根据您的OSGeo4W安装路径调整qputenv("PROJ_LIB", "F:/OSGeo4W64/share/proj");// 使用QgsApplication代替QApplication,并启用GUIQgsApplication a(argc, argv, true);// 设置QGIS的安装路径(根据您的实际安装路径修改)QgsApplication::setPrefixPath("F:/OSGeo4W64/apps/qgis-ltr", true);// 初始化QGIS资源QgsApplication::initQgis();QMainWindow main_window;QgsMapCanvas map_canvas;// 创建栅格图层,指定TIFF文件路径QgsRasterLayer layer(R"(F:\GIS-TA\QGIS\QGIS\rs.tif)", "My Raster Layer");// 将图层添加到画布map_canvas.setLayers({ &layer });map_canvas.setExtent(layer.extent());map_canvas.refresh();QgsMapToolPan map_tool_pan(&map_canvas);map_canvas.setMapTool(&map_tool_pan);main_window.setCentralWidget(&map_canvas);main_window.resize(800, 600);main_window.show();int exit_code = a.exec();// 清理QGIS资源QgsApplication::exitQgis();return exit_code;
}

若出现如下的错误:

这是因为代码(使用的某个第三方库,比如QGIS或其依赖库的代码)使用了微软标准库扩展(STL Extensions)中的功能:stdext::make_checked_array_iterator 和相关的迭代器。这些功能(以 stdext:: 开头)是 微软独有的、非C++标准 的扩展。微软警告说,这些扩展在未来的版本中会被移除,不再支持。
解决方案:

在“解决方案资源管理器”中,右键点击你的项目 -> “属性”。在属性页中,导航到 “配置属性” -> “C/C++” -> “预处理器”。点击 “预处理器定义” 这一项右边的下拉箭头,选择 “编辑...”,在弹出的对话框中,点击右上角的 “新建” 图标。添加宏定义:_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING


若出现类似以下的运行报错,显示找不到QGIS相关的dll,无法继续执行代码,则将相关dll文件放在项目.exe目录下:

F:\OSGeo4W\apps\Qt5\bin

F:\OSGeo4W\bin

F:\OSGeo4W\apps\qgis-ltr\bin(根据自己设置的安装路径修改)

若出现如下报错,则将下列文件夹复制到.exe目录下:
F:\OSGeo4W\apps\Qt5\plugins\platforms(根据自己设置的安装路径修改)

运行成功如下图所示:

欢迎交流!🌹🌹


参考内容:
QGIS二次开发环境配置(VS2019+QT5.12.2+QGIS3.26.3)

【QGIS】【OsGeo4w】安装方法-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对接旅游行业安全需求:旅游安全急救实训室的功能构建与育人目标

随着我国旅游行业的快速发展&#xff0c;游客安全需求日益凸显&#xff0c;安全应急处置能力已成为旅游服务人才的核心竞争力。旅游安全急救实训室作为旅游服务与管理专业中的重要教学场所&#xff0c;其功能构建与育人目标影响人才培养质量与行业安全水平。点击获取方案 一、行…

Typora处理markdown文件【给.md文档加水印】

①文件→偏好设置→外观→打开主题文件夹②在打开的文件夹中放入水印图像③右键点击github.css文件后&#xff0c;点击编辑&#xff0c;进入编辑页面④将代码块中内容粘贴到文件最后 更多效果请自行探索 #write::before {content: "CSDN果子当夜宵&#xff1a;bigxie.blog…

基于单片机的六足机器人控制系统设计

基于单片机的六足机器人控制系统设计摘 要本设计主要是基于单片机的六足机器人控制系统设计&#xff0c;综合分析六足机器人的结构、步态和控制算法&#xff0c;结合云端服务器、WIFI 技术、蓝牙技术、语音识别技术和手势识别技术进行多种控制模式的设计&#xff0c;并提出不同…

RK3568 Trust

文章目录1、环境介绍2、前言3、ARM TrustZone3.1、什么是ARM TrustZone3.2、cpu特权等级3.3、ARM Trusted Firmware4、Rockchip 平台的 Trust4.1、实现机制4.2、启动流程4.3、生命周期4.4、Trust 编译打包流程分析5、总结1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件…

C语言数据结构——详细讲解《二叉树与堆的基本概念》

C语言数据结构——详细讲解《二叉树与堆的基本概念》前言一、树的基础概念1.1 为什么需要树&#xff1f;1.2 树的定义与结构1.3 树的核心术语1.3 树的核心术语1.4 树的表示方法&#xff08;孩子兄弟表示法&#xff09;结构定义为什么用孩子兄弟表示法&#xff1f;1.5 树的实际应…

STAR-CCM+|雷诺数回顾

【1】引言 前序已经学习了K-epsilon湍流模型溯源的基础知识&#xff0c;今天再学习一些更为基础的知识&#xff0c;回顾一下雷诺数ReReRe。 【2】雷诺数定义 雷诺数公式为&#xff1a; ReρvDμRe\frac{\rho vD}{\mu}ReμρvD​ 式中&#xff0c; ρ\rhoρ——流体密度&…

Java中的死锁

锁的合理使用能够保证共享数据的安全性&#xff0c;但是 使用不当也会可能引起死锁。1. 死锁概念 死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去&#xff0c;如果系统资源充足&#xff0c;进程的资源请求…

基于STM32F103C8T6的智能家居健康环境监测系统

项目开发背景 随着城市化进程加速和居民生活水平提升&#xff0c;人们对家居环境健康与安全的需求日益增强。现代住宅常因装修材料、密闭空间及外部污染导致甲醛超标、PM2.5浓度升高、温湿度失衡等问题&#xff0c;长期暴露此类环境中易引发呼吸道疾病、过敏反应等健康隐患。传…

2025职场进阶:B端产品经理必备的计算机专业技能精要

当前企业级服务市场竞争日益激烈&#xff0c;2025年的B端产品经理不仅需要深厚的行业认知&#xff0c;还必须具备扎实的计算机专业技能&#xff0c;才能设计出真正符合技术趋势与业务需求的企业级产品。而其中&#xff0c;人工智能技术已经成为B端产品不可或缺的组成部分&#…

有效三角形的个数(数组单调性)

目录 一&#xff1a;题目链接 二&#xff1a;题目思路 三&#xff1a;代码实现 一&#xff1a;题目链接 题目的要求是找出当前数组能组成三角形三元组的个数。 二&#xff1a;题目思路 有一种暴力枚举解法&#xff0c;利用三层 for 循环来一一枚举三元组的情况&#xff0c;如…

Rust在医疗系统中的应用:安全、性能与合规性实践(上)

Rust在医疗系统中的应用:安全、性能与合规性实践 摘要 医疗系统对软件安全与性能存在严苛双重需求,既需抵御内存漏洞、数据加密风险等安全威胁(如历史医疗设备因软件问题召回案例所示),又需满足电子健康记录(EHR)系统、医学影像处理等高并发数据场景的性能要求,同时需…

读写锁 shared_mutex 共享互斥量介绍

文章目录读数据对数据没有影响&#xff0c;为什么还需要shared_mutex1. 保证读取数据的“一致性”和“时效性”2. 协调“读”与“写”的竞争关系总结好的&#xff0c;我们来详细介绍 C17 中的 std::shared_mutex&#xff08;共享互斥量&#xff0c;俗称读写锁&#xff09;的使用…

Nestjs框架: 基于装饰器与Guards的完成RBAC权限系统设计与实现

概述 在现代权限管理系统中&#xff0c;RBAC&#xff08;基于角色的访问控制&#xff09;是广泛采用的一种模型RBAC 核心思想是通过角色来管理用户权限通过角色绑定用户、资源和权限&#xff0c;实现细粒度的访问控制为了实现这一目标&#xff0c;我们需要在数据库中设计合理的…

机器学习如何精准预测高值

一、概念理解“机器学习对于高值的预测保守”&#xff0c;这是建模里很常见的现象&#xff0c;尤其在生态、气候、遥感这类数据分布高度偏斜的场景。通常可以从以下几个角度理解&#xff1a;1. 数据分布与样本稀缺在训练集里&#xff0c;高值样本往往非常少&#xff0c;远低于中…

蜂窝物联网模组:智能门禁产品上的关键部件

随着物联网技术的快速发展&#xff0c;蜂窝物联网模组正逐步成为智能门禁系统的关键通信组件。蜂窝模组凭借其广覆盖、高可靠性和低功耗特性&#xff0c;正从传统门禁系统的补充角色转变为智能门禁的核心通信组件&#xff0c;尤其在智慧社区、商业楼宇和政府机构等场景中展现出…

[光学原理与应用-417]:非线性光学 - 线性光学(不引发频率的变化)与非线性光学(引发频率变化)的异同

一、定义与物理机制&#xff1a;线性响应 vs 非线性响应线性光学定义&#xff1a;光与物质相互作用时&#xff0c;介质的极化强度与入射光电场强度呈线性关系&#xff08;Pϵ0​χ(1)E&#xff09;&#xff0c;输出光强与输入光强成正比&#xff08;Iout​∝Iin​&#xff09;-…

深入探讨AI在三大核心测试场景中的应用

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;软件测试领域正经历深刻变革。传统手动测试和基于规则的自动化测试已难以应对日益复杂的系统架构与海量用户行为。AI测试通过引入机器学习、自然语言处理、计算机视觉等技术&#xff0c;显著提升了测试效率、…

[linux仓库]性能加速的隐形引擎:深度解析Linux文件IO中的缓冲区奥秘

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; Linux Linux is not Unix &#xff01; &#x1f680; 今天来学习C语言缓冲区和内核缓存区的区别以及缓存类型。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c…

一、计算机的数据存储

计算机的世界只有0和1。 1.1 进制 十进制整数->二进制整数&#xff1a;除2倒取余二进制->十进制&#xff1a;权值相加法 结论&#xff1a;1位8进制值 3位二进制值&#xff0c;1位十六进制值 4位二进制值 public class JinZhiDemo {public static void main(String[]…

SpringBoot集成XXL-JOB保姆教程

第一步&#xff1a; 下载xxl-job源码到本地&#xff0c;地址如下&#xff1a; xxl-job: 一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 第二步&#xff1a; 创建…