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