2. qgis c++ api 整体框架详解

整体架构

QGis库官方文档

下表是官方文档中的模块说明:

文档说明
coreThe CORE library contains all basic GIS functionality核心库
guiThe GUI library is build on top of the CORE library and adds reusable GUI widgets基于CORE库的,增加了可复用的界面组件
analysisThe ANALYSIS library is built on top of CORE library and provides high level tools for carrying out spatial analysis on vector and raster data集成了一些算法,如缓冲区的生成
3DThe 3D library is build on top of the CORE library and Qt 3D framework3D库
plugin classesContains classes related to implementation of QGIS plugins组件库 如data provider, 一些算法都是采用插件机制实现的
QgsQuickThe QgsQuick library is built on top of the CORE library and Qt Quick/QML framework基于CORE库,可用于QML
serverThe SERVER library is built on top of the CORE library and adds map server components to QGIS服务端组件

其中3D,QgsQuick和server库需要在编译之前进行配置,配置项分别为WITH_3D WITH_QUICKWITH_SERVER,具体编译配置方法见开发环境搭建章节

编译生成的库

实际编译生成的库如下图
在这里插入图片描述

说明
appQGis Desktop程序库,属于应用层,并没有这个库的官方文档
native不同平台之间特有的功能
python用于使用python特性
test单元测试库
core核心库
gui小组件库
analysis算法库

其中core为基础库,其他库都依赖core,以下详细说明core、gui和analysis三个库

core

core库是qgis系统中的基础类,包含所有基本的GIS功能,而该库的很大一部分功能是用于处理矢量(vector)和栅格(raster)地理空间数据,并在地图中显示这些类型的数据。在讲解vector和raster之前先介绍一下地图图层概念

地图和图层

地图由多个图层组成,一个层绘制在另一个层的上层,qgis支持多种类型的图层:
在这里插入图片描述

  • Annotaion layer: 表示包含一组地理参考注释的地图层,例如标记、直线、多边形或文本项。在qgis desktop中可以添加对应类型的annotaion
    在这里插入图片描述

  • Group layer: 由一组子层组成的地图层
    在这里插入图片描述

  • Mesh Layer: 表示支持在结构化或非结构化网格上显示数据的网格层。多用于存储气候气象数据、水文数据、洋流数据等
    在这里插入图片描述

  • Plugin Layer: Base class for plugin layers. 插件实现自定义图层

  • PointCloud Layer: 点云图层

  • Vector Tile Layer: 矢量瓦片图层

  • Raster Layer: 栅格图层
    在这里插入图片描述

  • Vector Layer: 矢量图层
    在这里插入图片描述
    其中矢量图层和栅格图层是最常用的,我们将重点研究这两个图层,下图是矢量图层和栅格图层叠加显示效果图
    在这里插入图片描述

矢量图层(Vector layers)

矢量数据通常用点、线、多边形等基本几何对象描述。矢量格式的地理空间数据通常从**矢量数据源(data provider)**读取,常见的矢量数据源有.shp文件、数据库、内存、webservice等等,如下图QGis添加矢量图层示例
在这里插入图片描述

矢量层本身由QgsVectorLayer类表示。矢量层包括很多模块,如下图所示,
在这里插入图片描述
下面重点讲解以下模块

  • symbology: 图层要素符号
  • proj: 坐标映射
  • providers: 数据源

图层要素符号

图层要素

矢量格式具有许多要素(features),矢量图层属性表每一行都代表一个要素

jilin_city.shp为例,在QGis中添加图层后,打开属性表(Attribute Table)如下图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到矢量属性表有9行,代表9个要素,这9个要素以符号的形式显示在地图上,使用QGis的地图工具:Identify Feature工具查看属性如下图
在这里插入图片描述
可以看到要素(feature)的属性包含了id,Geometry以及附件属性,QgsFeature类用于表示要素。每个要素都有以下属性:

  • id: feature id
  • Geometry: 要素的地理信息,表示要素是地图上点、线、多边形等。
  • Attributes: 要素的附加属性,例如一个城市要素可能具有total_area、population、elevation等属性。属性值可以是字符串、整数或浮点数。
要素渲染(feature renderer)

上边已经看到了jilin_city.shp中的要素(feature)渲染为一个点,在QGis中提供了多种渲染方式,如下图
在这里插入图片描述

QgsFeatureRenderer类是这些渲染方式的父类,见如下类图
在这里插入图片描述

以后的章节我们一一讲解各个渲染类

符号(symbol)

设置渲染器之后需要设置符号,以单一符号渲染器为例,可设置的符号类别如下图
在这里插入图片描述
QgsSymbol是符号的父类,见下图的类图
在这里插入图片描述
QgsFillSymbol,QgsLineSymbolQgsMarkerSymbol分别对应三种几何图形面、线和点的符号

坐标映射

在GIS软件中,空间坐标依据坐标系的不同分为地理坐标和投影坐标。地理坐标是将地球比作一个类椭球体,描述一个点在球面上的位置。但是在地图制图过程中,往往需要在一个平面(无论是纸质地图还是电子地图)上展示地物,这时需要解决地球球面与地图平面之间的矛盾,因此需要对地球进行投影,经过投影后的坐标称为投影坐标,因此投影坐标是建立在地理坐标之上的。

为了解决地球椭球面和地图平面之间的矛盾,需要将地球椭球面进行投影,经过投影以后的坐标系称为投影坐标系。投影后的平面坐标系一定会出现变形,我们只能在等距、等积和等角之间进行取舍。因此,在不同应用场景下,大量的投影坐标系应运而生。

各个国家或地区建立了能够基本符合自己国家或地区的地球椭球面,或者根据精度需要及特定应用场景构建了不同的地球椭球面。根据构建的地球椭球面的参数不同,地理坐标系也层出不穷。我国的地理坐标系经历了从北京1954坐标系(BJZ54)到西安1980坐标系(XI’AN-80),再到2000国家大地坐标系(CGCS2000)的发展过程。

由于地理坐标系和投影坐标系众多,如果仅通过参数对这些坐标系进行整理与应用则过于麻烦,因此需要通过标准化组织将这些坐标系归档整理。对于石油的探查和开采来讲,坐标系的不同会显著影响开采精度,因此欧洲石油调查组织(European Petroleum Survey Group,EPSG)整合了绝大多数常用的坐标系,并为每个坐标系设置了一个编码,例如,“EPSG:4326”和“EPSG:3785”分别表示WGS 1984坐标系和WGS 1984 Web墨卡托投影坐标系。

QGis矢量图层会显示坐标系,如下图
在这里插入图片描述

数据源(data provider)

QgsVectorDataProvider代表Vector Layer的数据源,类图如下
在这里插入图片描述
数据源包含的数据在QGis中以表格形式展示,如下图
在这里插入图片描述

Raster layers

光栅格式的地理空间数据本质上是位图图像,其中图像中的每个像素都对应于地球表面的特定部分。
栅格数据采用某种数据类型的数值阵列存储数据,阵列中的每个数值称为一个像元(Pixel)。由于数据阵列本身不存在空间信息,因此需要元数据进行界定。
栅格数据的元数据包括空间坐标系、数据类型等。
在这里插入图片描述
在这里插入图片描述

光栅图层本身由QgsRasterLayer类表示。每个光栅图层包括:

  • symbology: 图层要素符号
  • proj: 坐标映射
  • Data provider: 数据源

图层符号

Raster Layer有多种渲染方式,QgsRasterRenderer是Raster图层渲染的父类,如下图
在这里插入图片描述
在QGis中设置不同渲染器
在这里插入图片描述

  • Multiband color
    如果光栅数据具有多个波段,则通常会将带组合以生成所需的颜色。例如,一个波段可能表示颜色的红色分量,另一个波段可以表示绿色分量,还有一个波段则可能表示蓝色分量。
  • Paletted/Unique values
    如果光栅数据只有一个波段,则像素值可以用作调色板的索引。调色板将每个像素值映射到特定的颜色。
  • Singleband gray
    如果光栅数据只有一个波段,但没有提供调色板。像素值可以直接用作灰度值;也就是说,越大的数字越亮,越小的数字越暗。或者,像素值可以通过伪彩色算法来计算要显示的颜色。
  • Singleband pseudocolor
    多波段数据可以使用调色板绘制多波段光栅数据源,或者将其绘制为灰度或伪彩色图像。
  • Hillshade
    多用于显示高程数据
  • Contours
    显示轮廓

数据源

QgsRasterDataProvider代表Raster Layer的数据源,类图如下
在这里插入图片描述

成员函数identify用于查看raster图层数据

QgsRasterIdentifyResult QgsRasterDataProvider::identify	(	const QgsPointXY &	point,
QgsRaster::IdentifyFormat format,const QgsRectangle & boundingBox = QgsRectangle(),
int width = 0,int height = 0,int dpi = 96 )

后边章节会逐一介绍相关类和函数

坐标映射

坐标参考系(Coordinate Reference System,CRS)界定了栅格数据所处的投影坐标系或地理坐标系。

core库其他有用类

说明
QgsProject代表当前项目,包含一系列属性如地图图层及其样式、布局、注释、画布等
QgisQgis类提供全局常量,供整个应用程序使用
QgsGeometry代表几何特征,是feature的空间表示,QgsGeometry对象本质上是笛卡尔/平面几何。
QgsCurve曲线类型的抽象基类
QgsPoint点类型
QgsSurface曲面类型
QgsRectangle矩形
QgsEllipse椭圆形
QgsDistanceArea距离、面积测算类

gui

GUI库构建在CORE库之上,并添加了可重用的GUI小部件

QgsMapCanvas

地图视图(也称为地图画布)用于显示地图控件,QGIS主窗体的地图区域就是一个地图视图。QGIS支持多地图视图,即可以在保留地图区域的基础上,以面板的形式增加地图视图(或3D地图视图)。QGIS多个地图视图采用同一个图层控制面板控制,因此一般用于显示同一个地图主题的不同四至范围数据(或以3D形式展示数据)。

QgsMapcanvas类是一个用于在画布上显示所有GIS数据类型的类。是QGraphicsView的子类
包括以下功能:

  • 当前显示的地图图层的列表。这可以使用layers()方法访问。
  • 获取地图使用的地图单位(米、英尺、度等)。可以通过调用mapUnits())方法来获取。
  • 显示范围,即当前显示在画布中的地图区域。地图的范围将随着用户放大和缩小以及在地图上平移而改变。当前映射范围可以通过调用extent()方法来获得。
  • 当前地图工具,可以使用setMapTool()设置,使用mapTool()获取当前工具
  • 设置地图背景色,使用canvasColor()获取
  • 坐标转换,将地图坐标转换为窗口坐标

QgsMapTool

  • 地图视图控制可以使用地图浏览工具栏
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

QgsMapTool是地图工具类基类,用于和用户交互、操作地图、处理鼠标事件。类图如下
在这里插入图片描述

QgsLayerTreeView/QgsLayerTreeModel

QgsLayerTreeView类扩展了QTreeView,提供图层管理功能,并提供了一些附加功能。如下图
在这里插入图片描述

QgsMapCanvasItem

QgsMapCanvasItem是可以直接画在map canvas的item的基类,Map Canvas Item显示优先级高于图层。类图如下
在这里插入图片描述

  • QgsVertexMarker: 这将绘制一个图标(“X”、“+”或小方框),以地图上的给定点为中心。
  • QgsRubberBand: 这将在地图上绘制任意几何类型。它在用户绘制时提供视觉反馈。
  • QgsAnnotationItem: 在地图上添加标注的基类,其子类如下图
    在这里插入图片描述

其他有用的gui类

说明
QgsMapTip鼠标悬停时显示的提示信息
QgsColorDialog颜色选择框
QgsBlendModeComboBox
QgsBrushStyleComboBox
QgsColorRampComboBox
QgsPenCapStyleComboBox
QgsPenJoinStyleComboBox以上QComboBox用户界面小部件提示用户输入各种绘图选项
QgsScaleComboBox选择缩放等级

analysis

analysis库建立在CORE库之上,为对矢量和光栅数据进行空间分析提供了高级工具,QGis中算法多集中在Processing Toolbox中,如下图
在这里插入图片描述

QgsProcessingProvider

QgsProcessingProvider类通常提供一组相关算法,类图如下
在这里插入图片描述

QgsProcessingAlgorithm

QgsProcessingAlgorithm类代表一种算法,通常由QgsProcessingRegistry进行创建,之后可以运行算法,获取结果

QgsProcessingRegistry

QgsProcessingRegistry类用于注册算法处理的各个组件包括:providers, algorithms,input,output and various parameters.
以clip算法为例,使用QgsProcessingRegistry创建算法类

const QString id = "native:clip";
QVariantMap conf;
conf.insert(QStringLiteral("INPUT"),layer->id());
conf.insert(QStringLiteral("OVERLAY"),"jilin_dist.shp");
QgsProcessingOutputLayerDefinition value( "TEMPORARY_OUTPUT" );
conf.insert(QStringLiteral("OUTPUT"),value);
auto algorithm = QgsApplication::processingRegistry()->createAlgorithmById(id,conf);

QgsProcessingContext

QgsProcessingContext用于算法运行时

QgsProcessingFeedback

QgsProcessingFeedback用于接收算法运行时的反馈

QgsProcessingAlgRunnerTask

QgsProcessingAlgRunnerTask是在线程中运行算法的类,类图如下
在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是设置VSCode中QGIS C++环境的步骤: 1. 安装VSCode:首先,你需要下载并安装Visual Studio Code编辑器。你可以从官方网站https://code.visualstudio.com/下载适用于你的操作系统的安装程序,并按照提示进行安装。 2. 安装C++扩展:在VSCode中,你需要安装C++扩展以支持C++开发。在VSCode的侧边栏中,点击扩展图标(四个方块组成的正方形),搜索并安装"C++"扩展。 3. 配置编译器:在VSCode中,你需要配置C++编译器。打开VSCode的设置(快捷键:Ctrl + ,),在搜索框中输入"C++",找到"C++: Edit Configurations (UI)"选项并点击。在弹出的窗口中,点击"mingw",然后选择你的C++编译器路径。如果你还没有安装C++编译器,你可以下载并安装MinGW(https://mingw-w64.org/doku.php)。 4. 创建C++项目:在VSCode中,你可以创建一个新的C++项目。点击菜单栏的"文件",选择"新建文件",然后保存为.cpp文件。在文件中编写你的C++代码。 5. 编译和运行:在VSCode中,你可以使用终端来编译和运行你的C++代码。点击菜单栏的"终端",选择"新建终端"。在终端中,使用g++命令来编译你的代码,并使用./a.out命令来运行生成的可执行文件。 6. 配置QGIS环境:如果你想在C++项目中使用QGIS,你需要配置QGIS环境。首先,你需要下载并安装QGIS开发版(https://qgis.org/en/site/forusers/download.html)。然后,你需要在VSCode的设置中配置QGIS的路径。打开VSCode的设置,搜索"C++",找到"C++: Edit Configurations (UI)"选项并点击。在弹出的窗口中,点击"mingw",然后在"includePath"和"browse"字段中添加QGIS的路径。 7. 编写和调试QGIS C++代码:现在你可以在VSCode中编写和调试QGIS C++代码了。你可以使用QGIS提供的API开发自己的插件或扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷动软件工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值