QGIS二次开发(1)—加载矢量、栅格图层(QGIS 2.14.16 && Qt-4.8.6 && VS2010 )

前言

1、QGIS二次开发只需要相关的:头文件(.h)、库文件(.lib和.dll)即可。本教程基于QGIS 2.14.16版本,如果对源码编译感兴趣,可在木君的博文:《QGIS 2.14编译(QGIS 2.14.16 && Qt-4.8.6 && VS2010 )》中一探详情。
2、本教程仅适合Release版本的开发。

具体过程

1、在完成源码编译的基础上,进行二次开发前,木君建议将生成的依赖文件(头文件.h、库文件.lib和.dll)组织到一起,便于调用。例如,木君的组织如下图所示,其中头文件置于include文件夹中,静态库文件置于lib文件夹中,动态链接库文件置于bin文件夹下。

各文件夹中的依赖项如下:

2、在VS2010中,新建Qt Application工程,工程名如“qgis_killer”,然后直接点击“finish”即可完成创建。对应生成的文件主要有3个,分别是:“QgisKiller.h”(大小写在创建工程时可指定)、“QgisKiller.cpp”和“main.cpp”。
3、添加工程依赖项。首先在“调试”中配置依赖的dll路径:

然后配置依赖的头文件路径,木君的配置可供参考:

然后在“C++/预处理器”中添加:

最后是配置相关的lib文件路径:

4、按照上述步骤配置完成后,编辑项目的UI文件:

双击打开后,作如图所示编辑,添加两个功能菜单,一个是“添加矢量图层”,另一个是“添加栅格图层”,对应的菜单控件名称分别为:action_addShp和action_addRaster。

然后即可在“QgisKiller.h”和“QgisKiller.cpp”中添加相应的槽函数,实现添加图层功能。
5、“QgisKiller.h”中的代码如下:

#ifndef QGISKILLER_H
#define QGISKILLER_H

#include <QtGui/QMainWindow>
#include "ui_qgiskiller.h"
#include <QList>
#include <QTextCodec>

#include <qgsmapcanvas.h>
#include <qgsmaplayer.h>

class QgisKiller : public QMainWindow
{
	Q_OBJECT

public:
	QgisKiller(QWidget *parent = 0, Qt::WFlags flags = 0);
	~QgisKiller();

	public slots:
		// 添加矢量图层集
		void slotAddVectorLayerSet();

		// 添加栅格图层集
		void slotAddRasterLayerSet();

private:
	Ui::QgisKillerClass ui;

	// 定义地图画布
	QgsMapCanvas* m_pMapCanvas;
	// 定义地图画布上的图层集(一个画布可以对应多个图层)
	QList<QgsMapCanvasLayer> m_MapCanvasLayerSet;
};

#endif // QGISKILLER_H

6、“QgisKiller.cpp”中的代码如下:

#include "QgisKiller.h"

#include <QDialog>
#include <QFileDialog>
#include <QMessageBox>

#include <qgsvectorlayer.h>
#include <qgsmaplayerregistry.h>
#include <qgsrasterlayer.h>

QgisKiller::QgisKiller(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);

	QTextCodec *codec = QTextCodec::codecForName("gbk");
	QTextCodec::setCodecForLocale(codec);
	QTextCodec::setCodecForCStrings(codec);
	QTextCodec::setCodecForTr(codec);

	m_pMapCanvas = new QgsMapCanvas();
	setCentralWidget( m_pMapCanvas );
	m_pMapCanvas->enableAntiAliasing( true );
	m_pMapCanvas->setCanvasColor( QColor( 255, 255, 255 ) );
	m_pMapCanvas->setVisible( true );

	connect(ui.action_addShp, SIGNAL(triggered()), this, SLOT(slotAddVectorLayerSet()));
	connect(ui.action_addRaster, SIGNAL(triggered()), this, SLOT(slotAddRasterLayerSet()));
}

QgisKiller::~QgisKiller()
{

}

void QgisKiller::slotAddVectorLayerSet()
{
	// 选择矢量文件
	QString strShpFilePath = QFileDialog::getOpenFileName(this, "加载矢量图层", "", "*.shp");
	QString src = strShpFilePath.trimmed();
	QFileInfo fi( src );
	QString strBaseFileName = fi.completeBaseName();

	QgsDebugMsg( "completeBaseName: " + strBaseFileName );

	// 创建矢量图层
	QgsVectorLayer* pVectorLayer = new QgsVectorLayer( strShpFilePath, strBaseFileName, "ogr", false); 
	Q_CHECK_PTR( pVectorLayer );

	if ( !pVectorLayer )
	{
		m_pMapCanvas->freeze(false);
		return;
	}

	if ( !pVectorLayer->isValid() )
	{
		QMessageBox::critical(this, "错误", "图层非法");
		delete pVectorLayer;
		return;
	}

	QgsMapLayerRegistry::instance()->addMapLayer( (QgsMapLayer*)pVectorLayer, true );
	m_MapCanvasLayerSet.append( QgsMapCanvasLayer(pVectorLayer, true) );
	m_pMapCanvas->setExtent( pVectorLayer->extent() );
	m_pMapCanvas->setLayerSet( m_MapCanvasLayerSet );
	m_pMapCanvas->freeze( false );
	m_pMapCanvas->setVisible( true );
	m_pMapCanvas->refresh();
}

void QgisKiller::slotAddRasterLayerSet()
{
	// 选择栅格文件
	QString strShpFilePath = QFileDialog::getOpenFileName(this, "加载栅格图层", "", "*.tif");
	QStringList strItemList = strShpFilePath.split( "/" );
	QString strBaseFileName = strItemList.at(strItemList.size() - 1);

	// 创建栅格图层
	QgsRasterLayer* pRasterLayer = new QgsRasterLayer( strShpFilePath, strBaseFileName, "gdal"); 
	if(!pRasterLayer->isValid())
	{
		QMessageBox::critical(this, "错误", "图层非法");
		return;
	}
	QgsMapLayerRegistry::instance()->addMapLayer( pRasterLayer );
	m_MapCanvasLayerSet.append( pRasterLayer );
	m_pMapCanvas->setExtent( pRasterLayer->extent() );
	m_pMapCanvas->setLayerSet( m_MapCanvasLayerSet );
	m_pMapCanvas->setVisible( true );
	m_pMapCanvas->freeze( false );
	m_pMapCanvas->refresh();
}

7、“main.cpp”中的代码如下:

#include "QgisKiller.h"
#include <QtGui/QApplication>
#include<QApplication>
#include<QWidget>

#include <qgsapplication.h>
#include <qgsproviderregistry.h>

int main(int argc, char *argv[])
{
	QTextCodec *codec=QTextCodec::codecForName("utf-8");
	QTextCodec::setCodecForLocale(codec);
	QTextCodec::setCodecForCStrings(codec);
	QTextCodec::setCodecForTr(codec);

	QgsApplication qgsApp(argc, argv, true);
	QString strMyPluginDir = QString::fromLocal8Bit("D:/qgis_2_14_master/src/build/output/plugins/RelWithDebInfo");
	QgsProviderRegistry::instance(strMyPluginDir);
	QgsApplication::initQgis();

	QgisKiller w;
	w.show();
	return qgsApp.exec();
}

8、运行效果如图:
(1)添加矢量图层:

(2)添加栅格图层:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值