Qt4.8.6+mingw+Qgis2.4.0基於QGis的二次開發

關於QGis的二次開發,大致看了一下,基本都是在VC+QT的環境下做環境部署,而且QGis的版本非常老,在mingw下直接開發搭建環境的例子少之又少,基於最新的Qgis2.4.0版本做了相應的嘗試,併成功搭建相應的環境,大致的配置如下:

由於在搭建的過程之中遇到的問題實在太多,沒有一一記錄下來,所以在本文中沒有做過多的描述,如有疑問可以聯繫[email protected],或者留言

環境搭建






pro文件配置

QT       += core gui xml

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = qgisdemo
TEMPLATE = app


SOURCES += main.cpp# \
    #mainwindow.cpp

#INCLUDEPATH += qgis-2.4.0
#INCLUDEPATH += qgis-2.4.0\core
#INCLUDEPATH += qgis-2.4.0\core\symbology-ng
#INCLUDEPATH += qgis-2.4.0\analysis
#INCLUDEPATH += qgis-2.4.0\gui

INCLUDEPATH += qgis-2.4.0
INCLUDEPATH += qgis-2.4.0/core
INCLUDEPATH += qgis-2.4.0/core/symbology-ng
INCLUDEPATH += qgis-2.4.0/analysis
INCLUDEPATH += qgis-2.4.0/gui


FORMS    += mainwindow.ui

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_analysis
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_analysis
else:unix:!macx: LIBS += -L$$PWD/lib/ -llibqgis_analysis

INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_core
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_core
else:unix:!macx: LIBS += -L$$PWD/lib/ -llibqgis_core

INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_gui
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_gui
else:unix:!macx: LIBS += -L$$PWD/lib/ -llibqgis_gui

INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/



實例

#include <QApplication>
#include <QString>
#include <QWidget>

#include <qgis.h>
#include <qgsapplication.h>
#include <qgsproviderregistry.h>
#include <qgssinglesymbolrendererv2.h>
#include <qgsmaplayerregistry.h>
#include <qgsvectorlayer.h>
#include <qgsmapcanvas.h>
#include <qgsgeometry.h>

#include "mouseprocess.h"
#include "paintprocess.h"


int main( int argc, char *argv[] )
{

    QgsApplication a( argc, argv ,true);

    //////////////////////////////////////////////////////////////////////////

    //注意這三行代碼需要更改路徑;
    QString myPluginsDir        ="D:/Qt/workspace/qgis-2.4.0/qgis-2.4.0/build/output/plugins";//插件路徑(編譯好的qgis文件夾下的plugins文件夾);
    QString myLayerPath1         ="F:/gis/data_1_3/10m_admin_0_countries.shp";//圖層路徑,必須設置爲你電腦裏面shp文件的路徑,不然打不開數據;
    QString myLayerPath2         ="F:/gis/qgis_sample_data/shapefiles/airports.shp";//圖層路徑,必須設置爲你電腦裏面shp文件的路徑,不然打不開數據;

    //////////////////////////////////////////////////////////////////////////
    QgsProviderRegistry::instance( myPluginsDir); //初始化插件的目錄;

    QgsVectorLayer * mypLayer1 = new QgsVectorLayer( myLayerPath1, "myLayer1", "ogr" ); //初始化矢量圖層;
    QgsVectorLayer * mypLayer2 = new QgsVectorLayer( myLayerPath2, "myLayer2", "ogr" ); //初始化矢量圖層;
    QgsVectorLayer * mypLayer3 = new QgsVectorLayer(); //初始化矢量圖層;
    mypLayer3->setRendererV2(QgsFeatureRendererV2::defaultRenderer(QGis::Point));

    QgsFeatureIterator iter = mypLayer2->getFeatures();
    QgsFeature feature;
    while(iter.nextFeature(feature)){
        QgsGeometry *geo = feature.geometry();
        QgsPoint point = geo->asPoint();
        //qDebug() << point.x() << point.y() << endl;
    }

    for(int index = 0; index < 100; index ++){
        QgsPoint point;

        double xmin = -4.4802e+06;
        double xmax = 4.61512e+06;
        double ymin = 1.43353e+06;
        double ymax = 6.50259e+06;

        point.setX(xmin + (xmax - xmin) * ((double) qrand()) / RAND_MAX);
        point.setY(ymin + (ymax - ymin) * ((double) qrand()) / RAND_MAX);

        QgsFeature feature;
        QgsGeometry *geo = QgsGeometry::fromPoint(point);
        feature.setGeometry(geo);
        mypLayer3->addFeature(feature);
        mypLayer3->updateFeature(feature);

        qDebug() << point.x() << point.y() << endl;
    }

    QList<QgsPoint> ring;

    //-4.4802e+06 4.61512e+06 1.43353e+06 6.50259e+06
    ring.append(QgsPoint(-4.4802e+06, 1.43353e+06));
    ring.append(QgsPoint(4.61512e+06, 6.50259e+06));
    ring.append(QgsPoint(2.61512e+06, 4.50259e+06));
    //mypLayer2->addRing(ring);

    qDebug() << mypLayer2->featureCount() << endl;

    //QgsSingleSymbolRendererV2 *mypRenderer = new QgsSingleSymbolRendererV2( mypLayer->geometryType() );
    QList <QgsMapCanvasLayer> myLayerSet;
    // mypLayer->setRenderer( mypRenderer );
    //mypLayer->setRendererV2(mypRenderer);

    QgsMapLayerRegistry::instance()->addMapLayer( mypLayer1, true );
    QgsMapLayerRegistry::instance()->addMapLayer( mypLayer2, true );
    QgsMapLayerRegistry::instance()->addMapLayer( mypLayer3, true );

    //myLayerSet.append( QgsMapCanvasLayer(mypLayer3, true ) );
    myLayerSet.append( QgsMapCanvasLayer(mypLayer2, true ) );
    //myLayerSet.append( QgsMapCanvasLayer(mypLayer1, true ) );

    QgsRectangle extent = mypLayer2->extent();
    qDebug() << extent.xMinimum() << extent.xMaximum() << extent.yMinimum() << extent.yMaximum() << endl;

    QgsMapCanvas * mypMapCanvas = new QgsMapCanvas( 0, 0 );
    mypMapCanvas->setExtent(mypLayer2->extent() );
    mypMapCanvas->enableAntiAliasing( true);
    mypMapCanvas->setCanvasColor( QColor(255, 255, 255 ) );
    mypMapCanvas->freeze( false );
    mypMapCanvas->setLayerSet( myLayerSet);
    mypMapCanvas->setVisible( true );
    mypMapCanvas->refresh();
    mypMapCanvas->show();

    MouseProcess *mouseProcess = new MouseProcess();
    PaintProcess *paintProcess = new PaintProcess();
    QObject::connect(mypMapCanvas, SIGNAL(xyCoordinates(QgsPoint)), mouseProcess, SLOT(xyCoordinates(QgsPoint)));
    QObject::connect(mypMapCanvas, SIGNAL(renderComplete(QPainter*)), paintProcess, SLOT(renderComplete(QPainter*)));
    return a.exec();
}




運行結果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章