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

跨平台QGIS二次开发环境实战:从源码编译到工程配置(QGIS 3.28 + Qt 5.15)

1. 跨平台QGIS开发环境全景概览第一次接触QGIS二次开发的朋友可能会被复杂的依赖关系吓到特别是当需要在不同操作系统上搭建环境时。我花了整整两周时间踩遍了Ubuntu和Windows平台的所有坑最终总结出这套可复现的配置方案。QGIS作为开源GIS软件的标杆其二次开发能力可以帮助我们快速构建专业级地理信息应用但前提是要先跨过环境配置这道门槛。这里我们选择QGIS 3.28和Qt 5.15的组合这是目前最稳定的开发配对。在实际项目中我发现这个版本组合既能用上新特性又避免了最新版可能存在的兼容性问题。特别提醒千万不要随意混用不同版本的Qt和QGIS我在早期项目中就因为用了Qt 5.14导致空间分析模块崩溃白白浪费了三天排查时间。2. Ubuntu环境编译实战2.1 系统准备与依赖安装Ubuntu 22.04是目前最合适的编译平台它的默认软件仓库已经包含Qt 5.15.2。我曾在20.04上尝试编译结果因为Qt版本过低导致大量模块无法通过。执行以下命令前建议先更新软件源sudo apt update sudo apt upgrade -y官方文档列出的依赖项多达近百个我将其分类整理为几个核心组。下面这个增强版安装命令加入了我在实际使用中发现必需的附加组件sudo apt-get install -y build-essential ccache cmake git ninja-build \ libgdal-dev libgeos-dev libproj-dev libqt5svg5-dev \ libqt5webkit5-dev libqt5xmlpatterns5-dev qttools5-dev \ libsqlite3-dev libspatialindex-dev libspatialite-dev \ python3-dev python3-pyqt5 pyqt5-dev-tools特别提醒如果遇到无法定位软件包错误可能需要启用universe仓库。我在公司内网环境部署时就遇到了这个问题解决方法是在/etc/apt/sources.list中添加ubuntu官方源。2.2 源码编译加速技巧QGIS的完整编译通常需要1-2小时通过这几个技巧可以缩短到30分钟以内ccache配置在~/.bashrc中添加以下配置我实测编译时间从78分钟降到42分钟export CCACHE_SLOPPINESSpch_defines,time_macros export CCACHE_CPP2yes并行编译使用make -j$(nproc)充分利用多核CPU。我的Ryzen 7 5800X使用16线程编译速度提升近8倍选择性编译在cmake配置时关闭不需要的模块。比如项目不涉及3D功能时cmake -DWITH_3DOFF -DWITH_SERVEROFF ..2.3 调试环境配置用Qt Creator调试QGIS需要特别注意这几个参数设置在项目配置的Run选项卡中添加环境变量QT_PLUGIN_PATH/home/yourname/dev/cpp/apps/qgis/plugins GDAL_DATA/home/yourname/dev/cpp/apps/qgis/share/gdal对于大型项目建议调整调试器设置GDB启动命令增加-ex set pagination off -ex handle SIG33 pass nostop noprint遇到断点不生效时检查是否开启了QML调试这会导致C断点失效3. Windows平台快速部署3.1 OSGeo4W安装详解Windows平台推荐使用OSGeo4W安装器这是最稳定的方案。安装时要注意选择Advanced Install时必须勾选以下组件qgis-ltr-dev (核心开发库)qgis-ltr-debug (调试符号)qt5-libs-devel (Qt开发文件)安装路径不要包含中文或空格我遇到过因路径导致的链接错误安装完成后需要设置系统环境变量set OSGEO4W_ROOTC:\OSGeo4W set PATH%OSGEO4W_ROOT%\bin;%PATH%3.2 Visual Studio项目配置在Qt Creator中创建新项目后需要在.pro文件中添加这些关键配置# QGIS核心库链接 LIBS -L$${OSGEO4W_ROOT}/apps/qgis-ltr-dev/lib \ -lqgis_core -lqgis_gui -lqgis_analysis # 解决常见的M_PI未定义问题 DEFINES _USE_MATH_DEFINES # 字符编码警告屏蔽 QMAKE_CXXFLAGS /wd4819部署时最容易遗漏的是DLL文件必须将以下目录的文件复制到输出文件夹C:\OSGeo4W\binC:\OSGeo4W\apps\Qt5\bin你使用的Qt安装目录下的bin文件夹4. 跨平台工程配置秘籍4.1 CMake统一管理方案为了实现Ubuntu和Windows共用同一套代码我设计了这样的CMake结构if(UNIX) set(QGIS_INCLUDE_DIR /home/${USER}/dev/cpp/apps/qgis/include) set(QGIS_LIB_DIR /home/${USER}/dev/cpp/apps/qgis/lib) elseif(WIN32) set(QGIS_INCLUDE_DIR $ENV{OSGEO4W_ROOT}/apps/qgis-ltr-dev/include) set(QGIS_LIB_DIR $ENV{OSGEO4W_ROOT}/apps/qgis-ltr-dev/lib) endif() target_include_directories(MyApp PRIVATE ${QGIS_INCLUDE_DIR}) target_link_directories(MyApp PRIVATE ${QGIS_LIB_DIR})4.2 常见编译问题解决Proj.db找不到设置PROJ_LIB环境变量指向包含proj.db的目录Qt插件加载失败在main.cpp最前面添加#include QApplication #include QDir int main(int argc, char *argv[]) { QApplication::addLibraryPath(QDir::cleanPath(QCoreApplication::applicationDirPath()/plugins)); }调试时卡顿在Qt Creator的调试选项里关闭Load system GDB pretty printers4.3 性能优化建议在Windows上将QGIS核心DLL加入排除列表可以显著提升调试启动速度对于频繁调用的QGIS API考虑使用缓存机制。例如static QgsCoordinateReferenceSystem sCrs(4326); // 比每次都创建新对象快3-5倍多线程处理时注意QGIS对象大多不是线程安全的需要做好同步控制5. 实战API调用示例下面这个完整的示例展示了如何初始化QGIS环境并调用核心功能#include qgsapplication.h #include qgsproviderregistry.h #include qgsvectorlayer.h int main() { // 必须最先初始化 QgsApplication app(argc, argv, true); // 设置插件路径重要 app.setPluginPath(/path/to/qgis/plugins); // 初始化提供器 QgsProviderRegistry::instance(~/dev/cpp/apps/qgis/plugins); // 创建图层 QgsVectorLayer *layer new QgsVectorLayer(/path/to/shapefile.shp, My Layer, ogr); if(!layer-isValid()) { qDebug() 图层加载失败 layer-error().message(); } // 获取QGIS版本信息 qDebug() 当前QGIS版本 Qgis::version(); return app.exec(); }这个例子包含了我在实际项目中最常用的几个关键操作。特别注意插件路径的设置这是90%的初始化失败问题的根源。在团队协作时建议把这些路径配置写入项目README避免新人踩坑。

相关文章:

跨平台QGIS二次开发环境实战:从源码编译到工程配置(QGIS 3.28 + Qt 5.15)

1. 跨平台QGIS开发环境全景概览 第一次接触QGIS二次开发的朋友可能会被复杂的依赖关系吓到,特别是当需要在不同操作系统上搭建环境时。我花了整整两周时间踩遍了Ubuntu和Windows平台的所有坑,最终总结出这套可复现的配置方案。QGIS作为开源GIS软件的标杆…...

数据集成工具深度评测:SeaTunnel 与 DataX、Sqoop、Flume、Flink CDC 在实时场景下的性能较量

1. 实时数据集成工具选型的关键指标 在数据驱动的时代,企业每天需要处理海量实时数据流。选择合适的数据集成工具直接影响业务系统的响应速度和决策效率。我经历过多次数据同步工具选型的痛苦过程,总结出实时场景下最关键的5个评估维度: 首先…...

ParrelSync跨平台终极指南:Windows、macOS和Linux完整配置教程

ParrelSync跨平台终极指南:Windows、macOS和Linux完整配置教程 【免费下载链接】ParrelSync (Unity3D) Test multiplayer without building 项目地址: https://gitcode.com/gh_mirrors/pa/ParrelSync ParrelSync是一款专为Unity3D开发者设计的高效工具&#…...

RePKG开发者指南:深入理解C逆向工程实现原理

RePKG开发者指南:深入理解C#逆向工程实现原理 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款强大的 Wallpaper Engine PKG文件提取与TEX图像转换工具&#…...

在Jetson Nano上构建海康威视相机Docker镜像:从SDK集成到Python应用部署

1. 环境准备与基础配置 在Jetson Nano上构建海康威视相机Docker镜像的第一步,是确保硬件和基础软件环境就绪。我建议从官方渠道下载最新的JetPack SDK,这个工具包包含了CUDA、cuDNN等深度学习推理必需的组件。安装完成后,记得运行nvidia-smi命…...

ParrelSync自定义参数功能:打造专属多人游戏测试环境的终极指南

ParrelSync自定义参数功能:打造专属多人游戏测试环境的终极指南 【免费下载链接】ParrelSync (Unity3D) Test multiplayer without building 项目地址: https://gitcode.com/gh_mirrors/pa/ParrelSync ParrelSync是一款专为Unity3D开发者设计的高效多人游戏测…...

VS2019调试配置报错解析:Designtime生成失败与IntelliSense不可用的深度排查指南

1. 问题现象与初步诊断 当你打开VS2019项目时突然弹出"配置Debug|Win32的Designtime生成失败,IntelliSense可能不可用"的红色错误提示,代码编辑窗口里的智能提示全部消失,连最基本的语法高亮都失效了——这种场景我遇到过不下20次。…...

大麦抢票神器:3分钟快速上手,轻松搞定热门演出门票

大麦抢票神器:3分钟快速上手,轻松搞定热门演出门票 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 你是一个文章写手&#x…...

如何通过Odoo合同自动化与电子签名实现企业文档管理数字化转型

如何通过Odoo合同自动化与电子签名实现企业文档管理数字化转型 【免费下载链接】odoo Odoo. Open Source Apps To Grow Your Business. 项目地址: https://gitcode.com/GitHub_Trending/od/odoo 企业在合同管理过程中常面临效率低下、合规风险高、协作成本大等挑战。传统…...

基于PyTorch Geometric的交通网络流量预测与优化

基于PyTorch Geometric的交通网络流量预测与优化 【免费下载链接】pytorch_geometric Graph Neural Network Library for PyTorch 项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric 问题定义:破解城市交通网络的复杂性挑战 交通网络的图…...

Carsim Tiretester保姆级教程:从零生成轮胎特性曲线(附完整Excel数据导入流程)

Carsim Tiretester保姆级教程:从零生成轮胎特性曲线(附完整Excel数据导入流程) 刚接触车辆动力学仿真的工程师或学生,常常会被轮胎特性曲线的生成过程困扰。轮胎作为车辆与地面唯一的接触点,其力学特性直接影响整车的操…...

LLaMA-Omni代码贡献指南:如何参与这个开源语音AI项目

LLaMA-Omni代码贡献指南:如何参与这个开源语音AI项目 【免费下载链接】LLaMA-Omni LLaMA-Omni is a low-latency and high-quality end-to-end speech interaction model built upon Llama-3.1-8B-Instruct, aiming to achieve speech capabilities at the GPT-4o l…...

终极fabio配置验证指南:避免生产环境错误的10个实用技巧

终极fabio配置验证指南:避免生产环境错误的10个实用技巧 【免费下载链接】fabio Consul Load-Balancing made simple 项目地址: https://gitcode.com/gh_mirrors/fa/fabio fabio是一个快速、现代的零配置负载均衡HTTP(S)和TCP路由器,专为Consul管…...

如何实现Chaos Mesh全链路国际化:从文档到UI的完整指南

如何实现Chaos Mesh全链路国际化:从文档到UI的完整指南 【免费下载链接】chaos-mesh Chaos Mesh 是一个云原生混沌工程平台,用于测试、故障注入和混沌工程。 * 用于混沌工程、故障注入和流量管理、支持 Prometheus 和 Grafana。 * 有什么特点&#xff1a…...

AWS Shell异步操作:非阻塞命令执行的终极指南

AWS Shell异步操作:非阻塞命令执行的终极指南 【免费下载链接】aws-shell An integrated shell for working with the AWS CLI. 项目地址: https://gitcode.com/gh_mirrors/aw/aws-shell AWS Shell是一款专为AWS CLI设计的强大交互式生产力工具,它…...

终极color库API参考手册:从入门到精通CSS颜色处理

终极color库API参考手册:从入门到精通CSS颜色处理 【免费下载链接】color 项目地址: https://gitcode.com/gh_mirrors/col/color color库是一个功能强大的JavaScript库,专为颜色转换和操作而设计,支持CSS颜色字符串,让开发…...

如何使用Kubernetes Python Client实现安全策略:准入Webhook完整指南

如何使用Kubernetes Python Client实现安全策略:准入Webhook完整指南 【免费下载链接】python Official Python client library for kubernetes 项目地址: https://gitcode.com/gh_mirrors/python1/python Kubernetes Python Client是官方提供的Python客户端…...

拨叉[831002] 2-钻φ60孔夹具

拨叉作为机械传动系统中的关键零件,其加工精度直接影响设备运行的稳定性。在2-钻φ60孔的工序中,专用夹具的核心作用在于通过精准定位与可靠夹紧,确保孔径尺寸、位置度及表面粗糙度等关键指标符合设计要求。该夹具采用“一面两销”定位原理&a…...

Go UUID终极指南:为什么选择go.uuid而非标准库的5大理由

Go UUID终极指南:为什么选择go.uuid而非标准库的5大理由 【免费下载链接】go.uuid UUID package for Go 项目地址: https://gitcode.com/gh_mirrors/go/go.uuid 在Go语言开发中,生成全局唯一标识符(UUID)是常见的需求。虽然…...

FlowState Lab跨周期波动模式提取效果:从秒级到年度的规律发现

FlowState Lab跨周期波动模式提取效果:从秒级到年度的规律发现 1. 时间序列分析的革命性突破 时间序列分析领域最近迎来了一项重要突破。传统方法往往只能聚焦单一时间尺度,要么分析高频交易数据,要么研究季节性规律,很难同时捕…...

ECharts地图标注避坑指南:解决区域地图显示不全、标注错位等常见问题

ECharts地图标注避坑指南:解决区域地图显示不全、标注错位等常见问题 当你在使用ECharts绘制区域地图时,是否遇到过地图显示不全、标注点位置偏移、JSON数据格式错误等问题?这些问题看似简单,却可能耗费开发者大量时间排查。本文将…...

STM32实战指南_基于STM32F103的智能交通灯系统设计与实现(硬件+软件+调试)

1. 项目背景与需求分析 十字路口的交通拥堵是城市治理的经典难题。传统定时切换的交通灯就像个固执的老头子,不管车多车少都按固定节奏工作,经常出现一边排长龙、另一边空荡荡的尴尬场景。这次我们要用STM32F103这颗"最强大脑"给交通灯装上&qu…...

OpenWrt固件下载与配置教程:R5S设备从入门到精通

OpenWrt固件下载与配置教程:R5S设备从入门到精通 【免费下载链接】openwrt openwrt编译更新库X86-R2C-R2S-R4S-R5S-N1-小米MI系列等多机型全部适配OTA自动升级 项目地址: https://gitcode.com/GitHub_Trending/openwrt5/openwrt GitHub_Trending/openwrt5/op…...

动态数据源配置加密终极指南:如何选择最安全的填充模式保护敏感数据 [特殊字符]️

动态数据源配置加密终极指南:如何选择最安全的填充模式保护敏感数据 🛡️ 【免费下载链接】dynamic-datasource dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务 项目地址: https://gitcode.com/gh_mirrors/dy/…...

Z-Image-Turbo_Sugar脸部Lora效果增强:ControlNet+Lora联合调控Sugar脸部结构

Z-Image-Turbo_Sugar脸部Lora效果增强:ControlNetLora联合调控Sugar脸部结构 想生成那种又纯又欲、甜度爆表的Sugar风格脸部图片吗?是不是经常遇到模型生成的脸型不够精致、五官比例失调,或者风格不够统一的问题?今天&#xff0c…...

如何构建现代搜索应用:ReactiveSearch与GraphQL的终极集成指南

如何构建现代搜索应用:ReactiveSearch与GraphQL的终极集成指南 【免费下载链接】reactivesearch Search UI components for React and Vue 项目地址: https://gitcode.com/gh_mirrors/re/reactivesearch ReactiveSearch是一个强大的React和Vue搜索UI组件库&a…...

线程与进程的区别与联系:操作系统入门详解(含 Python 示例)

、先搞懂:进程与线程到底是什么?(通俗类比官方定义) 1.1 生活化类比:快速建立认知 如果把计算机的操作系统比作一个大型工厂: 进程:就是工厂里的一个个独立车间。每个车间有自己专属的生产资…...

Kubernetes 与 GitOps 最佳实践

Kubernetes 与 GitOps 最佳实践 一、前言 哥们,别整那些花里胡哨的。GitOps 是现代 Kubernetes 运维的重要趋势,今天直接上硬货,教你如何在 Kubernetes 中实现 GitOps 工作流。 二、GitOps 核心概念 概念描述优势声明式配置所有配置以声明式方…...

终极指南:VSCode Rainbow Fart如何通过Vue.js打造沉浸式编程体验

终极指南:VSCode Rainbow Fart如何通过Vue.js打造沉浸式编程体验 【免费下载链接】vscode-rainbow-fart 一个在你编程时疯狂称赞你的 VSCode 扩展插件 | An VSCode extension that keeps giving you compliment while you are coding, it will checks the keywords …...

Cadence启动文件背后的设计哲学:为什么.cdsinit总覆盖不了.cdsenv的设置?

Cadence启动文件背后的设计哲学:为什么.cdsinit总覆盖不了.cdsenv的设置? 当你在Cadence Virtuoso中反复调整波形显示参数,却发现每次重启后设置都被重置时,背后隐藏的是一套精妙的EDA工具配置体系。这个看似简单的"设置失效…...