利用QGIS 3.26.2实现GIS工程实战总结

  • Post author:
  • Post category:其他


1.前言


QGIS作为一款开源的桌面GIS软件,其易用性、稳定性和可扩展性受到越来越多的技术人员和学者的好评与支持,并且基于社区的开发模式使QGIS的研发和迭代非常迅速。目前,QGIS已经具有完整且稳定的桌面GIS功能,并且逐渐地在移动GIS、web GIS等方向进行扩展,可以与众多开源GIS软件和模块相互支持,形成工具链,并构成功能全面的GIS软件体系,在开源GIS中具有独特且完整的应用前景。

本博文通过QGIS开源库实现一个GIS工程,通过本工程,可以学习如何利用QGIS库建立自己的GIS工程。QGIS通过源码编译安装和非源码安装,请参考:


  1. Win10下通过源码编译安装QGIS

  2. VS2019+QT5.15.2+QGIS二次开发环境搭建(非源码方式)

2.开发环境简述

开发环境如下:

  • Windows 10 教育版 21H1 19043.928。
  • Qt 5.14.1。
  • QGIS 3.26.2。
  • Visual Studio 2019  版本16.4.5 。
  • CMake 3.23.0。

3.启动VS,创建Qt工程

启动VS后,新建项目,搜索Qt,找到QtWidgetsApplication后进行创建新项目,我这里直接用默认名称QtWidgetsApplication1。

注意,在导入模块的时候要把XML勾选上,否则运行的时候会报错。如果这里不勾选,也可以创建好后,在VS中的扩展->QT VS Tools -> QT project settings ->Qt Modules中进行添加(下图)。




接着修改项目文件:



main.cpp

#include "QtWidgetsApplication1.h"
#include <QtWidgets/QApplication>
#include <qgsapplication.h>
 
int main(int argc, char *argv[])
{
    QgsApplication a(argc, argv, true);
    QgsApplication::setPrefixPath("F:/OSGeo4WQGIS/apps/qgis", true);
    QgsApplication::initQgis();    //初始化QGIS应用
 
    QtWidgetsApplication1 w;    //创建一个窗体,类似于Qt
    w.show();
    return a.exec();
}


QtWidgetsApplication1.h

#pragma once
#include "ui_QtWidgetsApplication1.h"
#include <QtWidgets/QMainWindow>
 
#include <qmenu.h>
#include <qaction.h>
#include <qgsmapcanvas.h>
 
class QtWidgetsApplication1 : public QMainWindow
{
    Q_OBJECT
 
public:
    QtWidgetsApplication1(QWidget *parent = Q_NULLPTR);
 
private:
    Ui::QtWidgetsApplication1Class ui;
    // create the menus and then add the actions to them.
    QMenu* fileMenu;
    QAction* openFileAction;
    //map canvas
    QgsMapCanvas* mapCanvas;
    QList<QgsMapLayer*> layers;
 
public slots:
    void on_openFileAction_triggered();
 
public:
    void addVectorLayer();
};


QtWidgetsApplication1.cpp

#include "QtWidgetsApplication1.h"
 
#include <qmenubar.h>
#include <qmessagebox.h>
#include <qfiledialog.h>
 
#include <qgsvectorlayer.h>
 
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(600, 400);
 
    // create the menus and then add the actions to them.
    fileMenu = this->menuBar()->addMenu("File");
    openFileAction = new QAction("Open", this);
    this->connect(openFileAction, SIGNAL(triggered(bool)), this, SLOT(on_openFileAction_triggered()));
    fileMenu->addAction(openFileAction);
 
    // initialize the map canvas
    mapCanvas = new QgsMapCanvas();
    this->setCentralWidget(mapCanvas);
 
    mapCanvas->setCanvasColor(QColor(255, 255, 255));
    mapCanvas->setVisible(true);
    mapCanvas->enableAntiAliasing(true);
}
 
void QtWidgetsApplication1::on_openFileAction_triggered() 
{
    addVectorLayer();
}
 
void QtWidgetsApplication1::addVectorLayer()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
    QStringList temp = fileName.split('/');
    QString basename = temp.at(temp.size() - 1);
    QgsVectorLayer* vecLayer = new QgsVectorLayer(fileName, basename, "ogr");
 
    if (!vecLayer->isValid())
    {
        QMessageBox::critical(this, "error", QString("layer is invalid: \n") + fileName);
        return;
    }
    mapCanvas->setExtent(vecLayer->extent());
    layers.append(vecLayer);
    mapCanvas->setLayers(layers);
    mapCanvas->refresh();
}

4

. 配置项目属性



C++ ->常规 -> 附加包含目录

中添加以下项

C:\OSGeo4W\include
C:\OSGeo4W\apps\qgis\include



链接器 ->常规 -> 附加库目录

中添加以下项:

C:\OSGeo4W\apps\qgis\lib

其中上述目录、库路径为

Win10下通过源码编译安装QGIS

博文编译安装之后生成的路径,请参见该博文并根据自己本机实际路径更改。

在“

链接器” ->”输入” -> “附加依赖项

”中添加以下项:

qgis_app.lib
qgis_core.lib
qgis_gui.lib

如果遇到编译错误,请参考《

VS2019+QT5.15.2+QGIS二次开发环境搭建(非源码方式)

》博文解决。搜索C:\OSGeo4W目录下的所有的dll及plugins目录将其放到程序同一个目录下,启动,



https://grass.osgeo.org/download/sample-data/

下载GIS测试样本数据。如下是选择rivers.shp后展示的河流release版本的运行效果:


注意:可以将一些不必要的dll删除,如:在release版本下可以删除debug版的Qt相关的dll。



在实际开发时,强烈建议用release版本的库开发,不要用debug,具体原因参见



Win10下通过源码编译安装QGIS

》博文。

5.启动工程及错误解决



https://grass.osgeo.org/download/sample-data/

下载GIS测试样本数据。启动debug版程序,选择测试数据,发现奔溃了,编译出的QGIS官方自带的gis.exe也崩溃。原因如下:


Win10下通过源码编译安装QGIS

博文提到的安装即官方提供的库好多是release版本的,即

QGIS-master 3.26.2 源码在debug版本下链接的是Release版本的库导致崩溃,当全部切换到Release版本下,程序不会崩溃,能正常运行。主要涉及到如下库:

  • qca-qt5.lib
  • Qt5WebKit.lib
  • Qt5WebKitWidgets.lib

QGIS-master 3.26.2 源码通过CMake编译(具体参见

Win10下通过源码编译安装QGIS

)生成的VS2019解决方案下的好多工程debug版下链接的是Release版本的库,从而导致奔溃。所以强烈建议:



在实际开发时,强烈建议用release版本的库开发,不要用debug

,如果要设置断点,则按如下方法设置:

以Vs2019为例

打开工程属性页 – 配置选择release – 配置属性

1、C/C++ – 常规 – 调试信息格式

默认配置:空或无

调试配置:程序数据库(/Zi)或(/ZI)

2、C/C++ – 优化 – 优化

默认配置:最大优化(优化速度)(/O2)

调试配置:禁止(/Od)


3、链接器 – 调试 – 生成调试信息

默认配置:否

调试配置:是(/DEBUG)

备注: 若Release下需断点调试则对上面三条配置“调试配置”;而需取消Release断点调试则对上面三条设置”默认配置”即可。当调试好后,给客户版本时,请恢复到默认配置。



6.debug版本调试遇到的各种问题汇总

6.1.debug版的qca-qt5库生成



https://download.kde.org/stable/qca/

下载qca-qt5库的源码,注意:版本不能太高。本人通过测试发现,版本太高,如2.3.4, CMake生成VS的解决方案时会报错,不能生成VS解决方案。如下,本人选择的2.1.3版本:


通过CMake生成VS2019的解决方案后,编译出debug和release版本的qca-qt5的lib和dll,分别拷贝或替换OSGeo4W\apps\Qt5\bin\qca-qt5d.dll、OSGeo4W\apps\Qt5\bin\qca-qt5.dll、OSGeo4W\apps\Qt5\lib\qca-qt5d.lib、OSGeo4W\apps\Qt5\lib\qca-qt5.lib。

6.2. Qt5WebKit、Qt5WebKitWidgets库

因为 Qt5WebKit、Qt5WebKitWidgets库在Qt 5.1.0版本之后被剔除了,所以在高版本的Qt,如本人用的是5.14.1,不存在这两个库。解决方法为:从如下Qt官网


Index of /archive/qt

下载Qt 5.1.0版本安装到在本机,然后从安装目录下将Qt5WebKitd.dll、Qt5WebKit.dll、Qt5WebKitd.lib、Qt5WebKit.lib、Qt5WebKitWidgetsd.dll、Qt5WebKitWidgets.dll、Qt5WebKitWidgetsd.lib、Qt5WebKitWidgetslib分别拷贝或替换OSGeo4W\apps\Qt5\bin\ OSGeo4W\apps\Qt5\lib\ 对应的该文件。

在Qt 5.1.0安装目录下搜索出icudt51.dll、icuin51.dll、icuuc51.dll,因为打包主程序时要用到这几个dll。

因为Windows下的Qt 5.1.0用到VS 2012中的sdk,所以还需装个VS 2012,Visual Studio 2012 官方简体中文旗舰版下载地址一【官方链接】:

点击这里直接下载

然后从VS2012安装目录下搜索出 msvcp110d.dll、msvcrpd.dll等库,后期打包要用。



版权声明:本文为danshiming原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。