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

转载 2. qgis c++ api 整体框架详解-CSDN博客

整体架构

QGis库官方文档

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

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

编译生成的库

实际编译生成的库如下图

其中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库其他有用类

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类

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是在线程中运行算法的类,类图如下

qgis_cpp_api_apps: QGis C++ API二次开发示例大全,看项目的wiki说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541337.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

祝天下老师教师节快乐-HTML+java script

效果图 &#x1f680;HTML结构揭秘&#x1f680;: &#x1f4dd;<head>中包含了元信息和样式表。 &#x1f5bc;️<body>拥有一个<canvas>元素与一个.text类的<div>&#xff0c;为星空与教师节信息搭建舞台。 &#x1f3a8;CSS魔法调色盘&#x1f3a…

计算机网络:物理层 --- 基本概念、编码与调制

目录 一. 物理层的基本概念 二. 数据通信系统的模型 三. 编码 3.1 基本概念 3.2 不归零制编码 3.3 归零制编码 3.4 曼切斯特编码 3.5 差分曼切斯特编码 ​编辑 四. 调制 4.1 调幅 4.2 调频 4.3 调相 4.4 混合调制 今天我们讲的是物理…

利士策分享,中日核污染水排海问题共识背后的深思

利士策分享&#xff0c;中日核污染水排海问题共识背后的深思 近日&#xff0c;中日两国在应对福岛第一核电站核污染水排放问题上达成了重要共识&#xff0c;这一进展无疑值得肯定。 然而&#xff0c;这背后所引发的关于金钱、责任与利益的讨论&#xff0c;却值得我们深入探究。…

【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标

chrome 谷歌浏览器&#xff0c;鼠标点击任何区域都是 Input 输入框的状态&#xff0c;能看到输入的光标 今天打开电脑的时候&#xff0c;网页中任何文本的地方&#xff0c;只要鼠标点击&#xff0c;就会出现一个输入的光标&#xff0c;无论在哪个站点哪个页面都是如此。 我知道…

【练习15】拼三角

链接&#xff1a;A-拼三角_牛客小白月赛32 (nowcoder.com) 分析&#xff1a; 三角形的三个边a、b、c必须满足条件&#xff1a;ab>c,ac>b,bc>a 可以先将输入的六个数按从小到大排序&#xff0c;然后再枚举。 因为已经排好序了&#xff0c;如果第一行ab<c&#xff0c…

YOLOv8改进,YOLOv8替换主干网络为VanillaNet( CVPR 2023 华为提出的全新轻量化架构),大幅度涨点

改进前训练结果: 改进后训练结果: 摘要 基础模型的核心理念是“更多即不同”,这一理念在计算机视觉和自然语言处理领域取得了惊人的成功。然而,变压器模型的优化挑战和固有复杂性呼唤一种向简化转变的范式。在本研究中,引入了VanillaNet,一种拥抱设计优雅的神经网络架构…

2024年中国研究生数学建模竞赛A题“风电场有功功率优化分配”全析全解

问题一&#xff1a; 针对问题一&#xff0c;可以采用以下低复杂度模型&#xff0c;来计算风机主轴及塔架的疲劳损伤累积程度。 建模思路&#xff1a; 累积疲劳损伤计算&#xff1a; 根据Palmgren-Miner线性累积损伤理论&#xff0c;元件的疲劳损伤可以累积。因此&#xff0c;…

基于SpringBoot+Vue的商城积分系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目源码、Python精…

回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现INFO-HKELM向量加权算法优化混合核极…

JAVA连接世界驾驭未来国际版二手车交易市场系统小程序源码

&#x1f697;【连接世界&#xff0c;驾驭未来 —— 探索国际版二手车交易市场系统】&#x1f697; &#x1f30d; 开篇&#xff1a;梦想无界&#xff0c;车行天下 &#x1f30d; 在这个日新月异的时代&#xff0c;我们对未来的憧憬不再局限于脚下的土地。你是否曾梦想过&…

【d46】【Java】【力扣】876.链表的中间结点

思路 先获得总体长度&#xff0c; 再得到中间节点 的索引&#xff0c;&#xff0c;这里的索引是从1开始的索引&#xff0c;而不是从0开始的索引(这种理解方式更简单) 排错&#xff1a;另一个思路&#xff1a;将链表都放进list&#xff0c;获得中间的数字&#xff0c;然后遍历…

【滑动窗口】算法总结

文章目录 滑动窗口算法总结1.暴力求解vs滑动窗口2.需要注意的细节问题 2.滑动窗口的基本模板1.非固定窗口大小的滑动窗口2.固定窗口大小的滑动窗口细节 滑动窗口算法总结 1.暴力求解vs滑动窗口 遇到那些可以转化成一个子数组的长度的问题时&#xff0c;往往需要用到双指针。 …

(undone) 声音信号处理基础知识(2)

来源&#xff1a;https://www.youtube.com/watch?vbnHHVo3j124 复习物理知识&#xff1a; 声音由物体的振动产生 物体振动会导致空气分支振荡 某一处的空气气压变化会创造一个波 声音是机械波 空气的振荡在空间中传递 能量从空间中的一个点到另一个点 机械波需要媒介&#x…

中国电子学会202406青少年软件编程(Python)等级考试试卷(四级)真题

青少年软件编程(Python)等级考试试卷(四级)2024-6 一、单选题(共25题, 共50分) 1.执行以下程序后所输出的结果是?( ) A 20 B 41 C 21 D 91 2.以下说法错误的是?( ) A python中可以在不同的自定义函数中声明相同名字的变量,使用时不会造成数据混…

前端框架Vue、React、Angular、Svelte对比

在对比 React、Vue.js、Angular 和 Svelte 时&#xff0c;除了在高层次的特性上有显著差异&#xff0c;它们在核心设计理念和底层实现机制上也有明显的不同。为了清晰地理解这些框架&#xff0c;我们可以从以下几个方面来分析它们的核心不同点和底层不同点。 1. 框架类型和设计…

【学习笔记】STM32F407探索者HAL库开发(四)F103时钟系统配置

【学习笔记】STM32F407探索者HAL库开发&#xff08;四&#xff09;F103时钟系统配置 1 STM32F1时钟树1.1 STM32F103时钟系统图1.2 STM32F103时钟树简图1.2.1 高速部分1.2.2 低速部分 1.3 函数配置1.4 时钟输出1.5 STM32CubeMX时钟树配置F11.6 时钟系统对与嵌入式开发的重要性 1…

Qt-QLabel 添加图片并设置 GIF 图动态效果

Qt-QLabel 添加图片并设置 GIF 图动态效果 一、添加图片资源并设置图片 选择标签&#xff0c;拖拉到界面上&#xff0c;然后选择器属性 picmap   选择设置&#xff0c;在这里添加图片资源   点击左边的加号符号按钮添加前缀&#xff0c;并设置前缀名&#xff0c;如果已经…

Nginx静态资源优化、压缩、缓存处理

一、静态资源优化配置语法 Nginx对静态资源如何进行优化配置。这里从三个属性配置进行优化&#xff1a; sendfile on; tcp_nopush on; tcp_nodeplay on; &#xff08;1&#xff09;sendfile&#xff0c;用来开启高效的文件传输模式。 语法sendfile on |off;默认值sendfile …

奥比中光深度相机相关使用内容

奥比中光深度相机相关使用内容 Windows平台测试官方软件关于python环境的配置1、安装CMake2、安装Visual Studio3、项目地址下载4、配置Visual Studio5、完成基于Python的SDK配置官网教学视频地址 3D视觉开发者社区 官方文档地址 效果: Windows平台测试官方软件 Window…

一文让你了解微服务契约测试

谈到微服务&#xff0c;大家都想到契约测试&#xff0c;到底什么是契约测试呢&#xff0c;为什么要使用契约测试呢&#xff0c;关于这样的文章很多&#xff0c;本文将结合Spring Boot让你了解微服务契约测试。 首先我们来看一下微服务&#xff0c;微服务是一种分布式结构&…