1. 程式人生 > 其它 >QGIS二次開發-新建工程並顯示一個圖層

QGIS二次開發-新建工程並顯示一個圖層

一、環境

開發環境為VS2019+Qt14,編譯器為MSVC【MingW在windows下的動態庫為.a檔案,但是直接現在的現成的qgis動態庫是dll的,所以選擇msvc,以免麻煩】

配置vs+qt環境,參考:https://www.cnblogs.com/judes/p/8992231.html

二、安裝QGIS相關

1、安裝桌面版【只是使用Qt開發的一個工具,可以用來玩玩,只要這個工具有的功能,理論上實都能通過二次開發QGIS庫開發出來】,參考:https://www.cnblogs.com/judes/p/15143756.html

2、安裝好桌面版之後,需要下載QGIS執行庫【後續二次開發所依賴的庫】,開啟配置工具

3、按照下圖依次下一步

這裡需要注意下,我最開始按照其他部落格選擇最後一個,但是下載失敗,一直提示license有問題,選擇第二個就ok了

然後等待下載,會比較慢,我在家裡是每秒幾百k,大概等了半小時

3、下載完成

後面二次開發的依賴就在這裡面

如果不想自己下載安裝這麼多東西,也可以直接網上找現成的編譯好了的依賴庫,我就是這樣做的【下文也按照此路徑進行配置】,下載來是這樣的:

跟上面差不多。此外也可以網上找如何對QGIS進行原始碼編譯的方法,是基於CMake的,如果是跨環境估計就得用這方法了。

三、下載地圖瓦片資料

qgis的的瓦片資料型別是shp的,可在此網站下載:http://download.geofabrik.de/,下載下來裡面有很多,如建築、學校、工廠等等,這裡做實驗隨便留一個備用

四、新建工程及環境配置

1、開啟vs,新建Qt gui widget工程,原始檔如下:

2、右鍵專案,為專案新增svg和xml的Qt模組

為啥要加這模組呢,是因為QGis原始碼裡會用到。

3、設定附加包目錄【標頭檔案目錄】

D:\soft\OSGeo4W64\include

D:\soft\OSGeo4W64\apps\qgis-ltr\include

4、設定附加庫目錄【lib檔案的目錄】

D:\soft\OSGeo4W64\apps\qgis-ltr\lib

5、設定附加依賴項【依賴的dll動態庫】

qgis_core.lib

qgis_app.lib

qgis_gui.lib

6、編譯程式生成exe【必須是64位和release,64位是因為要與QGis位數一致】

7、將相關動態庫放到exe同一路徑,以免執行失敗

①、路徑1的dll

D:\soft\OSGeo4W64\apps\qgis-ltr\bin

D:\soft\OSGeo4W64\bin

②、路徑2的dll

D:\soft\OSGeo4W64\apps\Qt5\bin

③、路徑3的資料夾

D:\soft\OSGeo4W64\apps\Qt5\plugins下的整個platforms資料夾

最終可執行資料夾是這樣的:

注意都要複製,不然後面程式碼寫了也不能執行,會報無dll錯誤和Qtplatforms錯誤。至此二次開發環境就ok了。

五、程式碼編寫

1、qtwidgetsapplication.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_qtwidgetsapplication.h"


#include <qmenu.h>
#include <qaction.h>
#include <qgsmapcanvas.h>

class QtWidgetsApplication : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication(QWidget *parent = Q_NULLPTR);

private:
    Ui::QtWidgetsApplicationClass ui;




    QMenu* fileMenu;
    QAction* openFileAction;
    QgsMapCanvas* mapCanvas;
    QList<QgsMapLayer*> layers;

public slots:
    void on_openFileAction_triggered();
    //

public:
    void addVectorLayer();
};

2、qtwidgetsapplication.cpp

#include "qtwidgetsapplication.h"

#include <qmenubar.h>
#include <qmessagebox.h>
#include <qfiledialog.h>
#include <qgsvectorlayer.h>

QtWidgetsApplication::QtWidgetsApplication(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    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 QtWidgetsApplication::on_openFileAction_triggered()
{
    addVectorLayer();
}


void QtWidgetsApplication::addVectorLayer()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
    //QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*");
    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();
}

3、main.cpp

#include "qtwidgetsapplication.h"
#include <QtWidgets/QApplication>

#include <qgsapplication.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtWidgetsApplication w;
    w.show();
    return a.exec();
}

原理就是在mainwindow裡,增加一個點選action,點選後開啟shp檔案,並將檔案存到記憶體裡,然後依次繪製到畫布中。




長風破浪會有時,直掛雲帆濟滄海!
可通過下方連結找到博主
https://www.cnblogs.com/judes/p/10875138.html