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



### 如何在 QGIS加载矢量或栅格图 #### 使用 QGIS 软件界面加载QGIS 的图形用户界面上,可以通过简单的菜单选项来加载矢量或栅格图。具体操作如下: 1. **加载矢量图层** 在 QGIS 主窗口中,点击 `Layer` -> `Add Layer` -> `Add Vector Layer...` 打开对话框。选择本地磁盘上的矢量文件路径并确认加载。 2. **加载栅格图** 同样,在 QGIS 主窗口中,点击 `Layer` -> `Add Layer` -> `Add Raster Layer...` 打开对话框。指定本地磁盘上的栅格文件路径并完成加载。 这种交互方式适用于大多数常规用途,简单直观[^1]。 --- #### 开发环境中的程序化加载 对于开发者而言,可以利用 Python 或 C++ 编程接口实现自动化加载矢量栅格图的功能。 ##### 利用 PyQGIS 加载 PyQGISQGIS 提供的官方 Python API 接口,支持脚本化的图管理功能。以下是加载矢量栅格图的具体代码示例: ```python from qgis.core import QgsVectorLayer, QgsRasterLayer, QgsProject # 加载矢量图层 vector_layer_path = "/path/to/your/vector_file.shp" vector_layer_name = "My_Vector_Layer" vlayer = QgsVectorLayer(vector_layer_path, vector_layer_name, "ogr") if not vlayer.isValid(): print(f"Failed to load the vector layer: {vector_layer_path}") else: QgsProject.instance().addMapLayer(vlayer) # 加载栅格图 raster_layer_path = "/path/to/your/raster_file.tif" raster_layer_name = "My_Raster_Layer" rlayer = QgsRasterLayer(raster_layer_path, raster_layer_name) if not rlayer.isValid(): print(f"Failed to load the raster layer: {raster_layer_path}") else: QgsProject.instance().addMapLayer(rlayer) ``` 上述代码展示了如何通过编程的方式向 QGIS 工程中动态添加矢量栅格图,并验证其有效性[^5]。 --- ##### 基于 C++ 的开发流程 C++ 是另种常见的开发语言,尤其适合需要高性能的应用场景。以下是个典型的加载矢量栅格图的过程概述: 1. 配置开发环境:确保安装了 QGIS SDK 对应的编译工具链(如 Visual Studio),同时引入必要的头文件库文件[^3]。 2. 初始化 QGIS 应用实例: ```cpp #include <qgsapplication.h> #include <qgsproviderregistry.h> int main(int argc, char *argv[]) { QString myGuiPrefixPath("/usr/share/qgis"); QgsApplication app(argc, argv, true); app.setPrefixPath(myGuiPrefixPath, true); QgsProviderRegistry::instance(myGuiPrefixPath + "/../share/qgis/providers/"); return app.exec(); } ``` 3. 创建地图画布对象 (`QgsMapCanvas`) 并冻结画面以防止绘制干扰[^2]: ```cpp #include <qgsmapcanvas.h> QgsMapCanvas* canvas = new QgsMapCanvas; canvas->freeze(true); // 冻结画布 ``` 4. 添加矢量或栅格图到画布上: ```cpp #include <qgsvectorlayer.h> #include <qgsrasterlayer.h> QString vectorFilePath = "/path/to/your/vector_file.shp"; QString vectorLayerName = "Sample_Vector_Layer"; QgsVectorLayer* vectorLayer = new QgsVectorLayer(vectorFilePath, vectorLayerName, "ogr"); if (!vectorLayer->isValid()) { qDebug() << "Invalid vector layer!"; } else { canvas->setLayers({vectorLayer}); } QString rasterFilePath = "/path/to/your/raster_file.tif"; QString rasterLayerName = "Sample_Raster_Layer"; QgsRasterLayer* rasterLayer = new QgsRasterLayer(rasterFilePath, rasterLayerName); if (!rasterLayer->isValid()) { qDebug() << "Invalid raster layer!"; } else { canvas->setLayers({rasterLayer}); } canvas->freeze(false); // 解冻画布 canvas->refresh(); // 更新视图 canvas->zoomToFullExtent(); // 显示全图范围 ``` 以上代码片段说明了如何在自定义应用程序中集成 QGIS 功能模块,从而实现矢量栅格图加载与展示[^4]。 --- #### 总结 无论是通过 GUI 还是编程手段,都可以高效地在 QGIS加载矢量或栅格图。GUI 方法更适合初学者快速入门,而基于 PyQGIS 或 C++ 的解决方案则提供了更大的灵活性扩展能力。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值