QGis(一)加載柵格圖層和矢量圖層

在使用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();
}
加載柵格和矢量圖層就完成了,效果如下圖:



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