QGis(一)加载栅格图层和矢量图层

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tszhangjunqiao/article/details/38518141

在使用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();
}
加载栅格和矢量图层就完成了,效果如下图:



猜你喜欢

转载自blog.csdn.net/tszhangjunqiao/article/details/38518141