在使用QGis庫來進行二次開發之前,需要對源碼進行編譯,生成適合所使用開發環境的開發庫。本文及後面的文章都是基於QGis1.8.0版本在vs2010下編譯的庫。
在將QGis添加到自己的工程中需要配置一些工程屬性:
(1)在vs2010工程屬性裏設置include和lib目錄,並在linker鏈接裏添加
qgis_analysis.lib
qgis_core.lib
qgis_gui.lib
(2)在預處理命令定義裏添加:
CORE_EXPORT=__declspec(dllimport)
GUI_EXPORT=__declspec(dllimport)
ANALYSIS_EXPORT=__declspec(dllimport)
上面的設置好就可以了。
本文介紹分別加載柵格圖像和矢量圖層,併疊加顯示:
需要添加的頭文件:
#include "qgssymbol.h"
#include "qgsrenderer.h"
#include <qgsapplication.h>
#include <qgsproviderregistry.h>
#include <qgsmaplayerregistry.h>
#include <qgsvectorlayer.h>
#include <qgsrasterlayer.h>
#include <qgsmapcanvas.h>
#include <qgssinglesymbolrenderer.h>
#include <qgssinglesymbolrendererv2.h>
注:在創建柵格和矢量圖層之前,需要註冊插件庫,不然不會顯示。使用如下的代碼註冊插件庫:
QDir dir;
QString currentPath = dir.currentPath(); //之所以要獲取當前運行的路徑是因爲在vs裏面運行和Release文件夾下單獨運行路徑不一樣,下面幾句代碼免得每次都修改
if ( currentPath.endsWith("UAVBeta")) <span style="white-space:pre"> </span>//UAVBeta爲我的工程名稱
{
myPluginDir = QString::fromLocal8Bit("..\\Win32\\Release\\plugins\\plugins");
}
else
{
myPluginDir = QString::fromLocal8Bit(".\\plugins\\plugins");
}
QgsProviderRegistry::instance(myPluginDir);
一、加載柵格圖像
加載柵格圖像的詳細步驟在下面代碼裏:
void AddRasterImage(QString filename)
{
QFileInfo fileInfo(filename);
QString rasterdir = fileInfo.filePath();
QString rasterbasename = fileInfo.completeBaseName();
QgsMapCanvas *mainMapCanvas = new QgsMapCanvas();
//(1)根據文件名創建柵格圖層
QgsRasterLayer *myrLayer = new QgsRasterLayer(filename, rasterbasename);
if ( myrLayer == NULL)
{
return;
}
if ( !myrLayer->isValid() )
{
delete myrLayer;
return ;
}
if ( mainMapCanvas && mainMapCanvas->isDrawing() )
{
return ;
}
//(2)將柵格圖層添加到圖層管理器中
QgsMapLayerRegistry::instance()->addMapLayer((QgsMapLayer*)myrLayer, TRUE);
QList<QgsMapCanvasLayer> myLayerSet; //添加多個圖層,就要一個鏈表保存
myLayerSet.push_back(QgsMapCanvasLayer(myrLayer,true));
mainMapCanvas->setLayerSet(myLayerSet);
//(3)刷新顯示柵格圖層
mainMapCanvas->freeze(false);
mainMapCanvas->setVisible(true);
mainMapCanvas->zoomToFullExtent();
mainMapCanvas->setCanvasColor(QColor(255,255,255));
mainMapCanvas->refresh();
}
二、加載矢量圖層
加載矢量圖層跟柵格圖層差不多的步驟,這裏矢量圖層指的是shp文件。具體代碼如下:
void AddVectorLayer(QString filename)
{
QFileInfo fileInfo(filename);
QString vectordir = fileInfo.filePath();
QString vectorbasename = fileInfo.completeBaseName();
QString myProviderName = "ogr";
QgsMapCanvas *mainMapCanvas = new QgsMapCanvas();
//創建矢量圖層
QgsVectorLayer *mypLayer = new QgsVectorLayer(filename, vectorbasename, myProviderName);
if ( mypLayer == NULL)
{
return;
}
if ( !mypLayer->isValid() )
{
delete mypLayer;
return ;
}
if ( mainMapCanvas && mainMapCanvas->isDrawing() )
{
return ;
}
//設置標號,使shp顯示是實線的形式,不是填充形式
QgsSymbol* pSym = new QgsSymbol(QGis::Line);
pSym->setColor(QColor(255,0,255));
pSym->setLineStyle(Qt::SolidLine);
pSym->setLineWidth(0.2);
//將標號添加到圖層的渲染器中
QgsSingleSymbolRenderer* mypRenderer = new QgsSingleSymbolRenderer(mypLayer->geometryType());
mypRenderer->addSymbol(pSym);
mypLayer->setRenderer(mypRenderer);
//添加圖層到圖層管理器中
QgsMapLayerRegistry::instance()->addMapLayer(mypLayer, true);
//這裏爲了分開介紹柵格和矢量,所以分別定義了 myLayerSet。如果在一個工程中,可以將
//myLayerSet當做全局的,那麼柵格和矢量的疊加就可以通過下面的代碼控制
QList<QgsMapCanvasLayer> myLayerSet;
if(myLayerSet.isEmpty())
{
myLayerSet.push_back(QgsMapCanvasLayer(mypLayer, true));
}
else
{
myLayerSet.push_front(QgsMapCanvasLayer(mypLayer,true));
}
mainMapCanvas->setLayerSet(myLayerSet);
//將圖層設置到圖層繪畫板QgsMapCanvas上
mainMapCanvas->setExtent(mypLayer->extent());
mainMapCanvas->enableAntiAliasing(true);
mainMapCanvas->setCanvasColor(QColor(255,255,255));
mainMapCanvas->freeze(false);
mainMapCanvas->setDragMode(QGraphicsView::RubberBandDrag);
mainMapCanvas->setVisible(true);
mainMapCanvas->zoomToFullExtent();
mainMapCanvas->refresh();
}
加載柵格和矢量圖層就完成了,效果如下圖: