Qt4.8.6+mingw+Qgis2.4.0基于QGis的二次开发

来源:互联网 发布:在家赚钱 知乎 编辑:程序博客网 时间:2024/06/01 18:49

关于QGis的二次开发,大致看了一下,基本都是在VC+QT的环境下做环境部署,而且QGis的版本非常老,在mingw下直接开发搭建环境的例子少之又少,基于最新的Qgis2.4.0版本做了相应的尝试,并成功搭建相应的环境,大致的配置如下:

由于在搭建的过程之中遇到的问题实在太多,没有一一记录下来,所以在本文中没有做过多的描述,如有疑问可以联系husteryou@163.com,或者留言

环境搭建






pro文件配置

QT       += core gui xmlgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = qgisdemoTEMPLATE = appSOURCES += 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\guiINCLUDEPATH += qgis-2.4.0INCLUDEPATH += qgis-2.4.0/coreINCLUDEPATH += qgis-2.4.0/core/symbology-ngINCLUDEPATH += qgis-2.4.0/analysisINCLUDEPATH += qgis-2.4.0/guiFORMS    += mainwindow.uiwin32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_analysiselse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_analysiselse:unix:!macx: LIBS += -L$$PWD/lib/ -llibqgis_analysisINCLUDEPATH += $$PWD/DEPENDPATH += $$PWD/win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_coreelse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_coreelse:unix:!macx: LIBS += -L$$PWD/lib/ -llibqgis_coreINCLUDEPATH += $$PWD/DEPENDPATH += $$PWD/win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_guielse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibqgis_guielse:unix:!macx: LIBS += -L$$PWD/lib/ -llibqgis_guiINCLUDEPATH += $$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();
}

运行结果


3 0