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

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

环境搭建

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW91ZmFuZ3l1YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW91ZmFuZ3l1YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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();
}




执行结果

Qt4.8.6+mingw+Qgis2.4.0基于QGis的二次开发的更多相关文章

  1. [github项目]基于百度地图二次开发实现的车辆监管(包含车辆定位、车辆图片和方向控制,电子围栏,图形绘制等功能)前端实现(不包含后端实现)

    前言:基于百度地图javascript版本开发,百度地图中所用的key已承诺仅用于测试,不用于商业用途 注:本文所有代码可以到github上进行下载,github地址:http://map.eguid ...

  2. 深入理解基于selenium的二次开发

    对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是为了易于维护,很多人可能不懂得维护的价值是什么,和到底要 ...

  3. Topshelf+Quartz3.0基于控制台应用程序快速开发可调度windows服务

    1.TopShelf TopShelf是一个开源的跨平台的宿主服务框架.可通过.Net Core/.Net Framwork控制台应用程序快速开发windows服务,更加便于服务调试. 本文基于.Ne ...

  4. jmeter4.0 源码编译 二次开发

    准备: 1.jmeter4.0源码 - apache-jmeter-4.0_src.zip 2.IDE Eclipse - Oxygen.3 Release (4.7.3) 3.JDK - 1.8.0 ...

  5. 基于Django+celery二次开发动态配置定时任务 ( 二)

    一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...

  6. Linux基于webRTC的二次开发(二) 实现远程桌面共享

    webRTC中的desktop_capture模块提供了捕获桌面和捕获窗口的相关功能,而实现远程桌面共享功能需要将desktop_capture捕获的画面作为peerconnection的视频源,下面 ...

  7. C#基于AE组件二次开发常见问题

    由于本人从事的是在.net平台下进行GIS的二次开发,所以第一篇博文就说一下:我最近在项目中出现的常见的问题,如果能够给大家增加一点点便利,也是我的荣幸,如果大家对于这次博文有什么意见和建议,欢迎大家 ...

  8. 基于Django+celery二次开发动态配置定时任务 ( 一 )

    需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...

  9. Linux基于webRTC的二次开发(一)

    最近在做Linux平台下webRTC的二次开发,一路摸索,中间踩了不少坑,这一篇博客先来简单介绍下Linux上如何使用GCC编译webRTC. 为什么使用GCC编译? 这其实是无奈之举,Linux下w ...

随机推荐

  1. 构建属于自己的ORM框架之二--IQueryable的奥秘

    上篇文章标题乱起,被吐槽了,这次学乖了. 上篇文章中介绍了如何解析Expression生成对应的SQL语句,以及IQueryable的一些概念,以及我们所搭建的框架的思想等.但还没把它们结合并应用起来 ...

  2. UI篇---RadioButton(单选按钮)

    单选按钮RadioButton在Android平台上也应用的非常多,比如一些选择项的时候,会用到单选按钮,实现单选按钮由两部分组成,也就是RadioButton和RadioGroup配合使用 Radi ...

  3. Json::Value使用心得

    Json::Value 是sourceforge开源项目jsoncpp的数据对象,用来处理json数据  下载 1.打印Json数据 Json::Value jv; Json::FastWriter ...

  4. 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化

    http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...

  5. tomcat server获取用户的请求地址

    当用户 与 tomcat之间 用 nginx做跳转时, HttpServletRequest 中的 getRemoteHost()方法获取到的只是nginx的地址,而不能拿到用户真正的请求地址 解决方 ...

  6. 为Elasticsearch添加中文分词

    Elasticsearch的中文分词很烂,所以我们需要安装ik.首先从github上下载项目,解压: cd /tmp wget https://github.com/medcl/elasticsear ...

  7. 安卓app开发方式之webApp

    1.phonegap: 专注于webapp调用native的功能.2.ionic: 专注于webapp的前端ui技术,需要与phonegap(准确的说是和Cordova配合使用).ionic是一个专注 ...

  8. 第二百六十九天 how can I 坚持

    什么是明事理,搞不懂啊,好烦. 有点像我妈. 为什么突然就想买房了呢,为什么?年龄到了,考虑的东西就不一样了. 哎,不要想太多,睡觉.

  9. CoffeeScript学习(2)—— 变量

    变量基础 对于变量的定义的话,形式如下所示 xxx = yyy ------编译后------ var xxx = yyy; 保留字 我们知道,在原生js中的保留字是不能作为变量名或者属性名的.如果我 ...

  10. lib 和 dll 的区别、生成以及使用详解

    首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代码共享的方式. 静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可 ...