qgis c++ api 整体框架详解

文章目录

  • 整体架构
    • QGis库官方文档
    • 编译生成的库
  • core
    • 地图和图层
    • 矢量图层(Vector layers)
      • 图层要素符号
        • 图层要素
        • 要素渲染(feature renderer)
        • 符号(symbol)
      • 坐标映射
      • 数据源(data provider)
    • Raster layers
      • 图层符号
      • 数据源
      • 坐标映射
    • core库其他有用类
  • gui
    • QgsMapCanvas
    • QgsMapTool
    • QgsLayerTreeView/QgsLayerTreeModel
    • QgsMapCanvasItem
    • 其他有用的gui类
  • analysis
    • QgsProcessingProvider
    • QgsProcessingAlgorithm
    • QgsProcessingRegistry
    • QgsProcessingContext
    • QgsProcessingFeedback
    • QgsProcessingAlgRunnerTask

整体架构

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是在线程中运行算法的类,类图如下
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉和机器视觉有什么区别?

人工智能是一个概念性术语,涵盖了若干特定技术。本文中,我们将探讨机器视觉(MV)和计算机视觉(CV)。二者都涉及可视化输入的摄取和解释,因此,了解这些重叠技术的优势、约束和最佳应用…

Vue 绑定style和class

在应用界面中,某些元素的样式是动态的。class 与 style 绑定就是专门用来实现动态样式效果的技术。 如果需要动态绑定 class 或 style 样式,可以使用 v-bind 绑定。 绑定 class 样式【字符串写法】 适用于:类名不确定,需要动态指…

leetcode:1929. 数组串联(python3解法)

难度&#xff1a;简单 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xff0c;满足下述所有要求&#xff1a; ans[i] nums[i]ans[i n] nums[i] 具体而言&am…

Mongodb----部署副本集 实现读写分离

使用软件&#xff1a; xshell7 vmware16 centos8 nosql booster 1 部署副本集 推荐方案&#xff1a; 为了降低资源分配&#xff0c;这里仅使用一台服务器&#xff0c;但是分配3个端口&#xff08;27017、27018、27019&#xff09;来分别实现 主节点、副本节点…

K8S:配置资源管理 Secret和configMap

配置资源管理 Secret和configMap [TOC](配置资源管理 Secret和configMap)一、Secret1.Secret概念2.Secret的类型3.secret的三种参数4.Pod 的3种方式来使用secret5.Secret创建及案例 二.ConfigMap1.ConfigMap概念2.ConfigMap功能及应用场景3.ConfigMap创建及案例 三、总结1.secr…

基于SSM+Vue的线上学习网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

springboot 通过url下载文件并上传到OSS

DEMO流程 传入一个需要下载并上传的url地址下载文件上传文件并返回OSS的url地址 springboot pom文件依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w…

论文阅读:

来源&#xff1a;公众号看到一篇文章 原文&#xff1a;https://arxiv.org/pdf/2301.04275.pdf 代码&#xff1a;GitHub - fengluodb/LENet: LENet: Lightweight And Efficient LiDAR Semantic Segmentation Using Multi-Scale Convolution Attention 0、摘要 基于LiDAR的语义…

Linux:【Kafka四】集群介绍与单机搭建

目录 环境简介 一、搭建kafka集群 1.1、复制出两个kafka的配置文件 1.2、修改配置文件中的如下属性 二、启动kafka集群 三、可校验kafka三个节点是否均启动成功 四、查看集群中主题的分区和副本 4.1、新建一个包含了分区和副本的主题 4.2、查看该主题的详细信息 五、…

linux下安装ffmpeg的详细教程、ffmpeg is not installed

1、下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-6.0.tar.gz tar -zxvf ffmpeg-6.0.tar.gz 2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录 cd ffmpeg-6.0 ./configure --prefix/usr/local/ffmpeg make sudo make install 3、配置变量 v…

kaggle新赛:写作质量预测大赛【数据挖掘】

赛题名称&#xff1a;Linking Writing Processes to Writing Quality 赛题链接&#xff1a;https://www.kaggle.com/competitions/linking-writing-processes-to-writing-quality 赛题背景 写作过程中存在复杂的行为动作和认知活动&#xff0c;不同作者可能采用不同的计划修…

Google zxing 生成带logo的二维码图片

环境准备 开发环境 JDK 1.8SpringBoot2.2.1Maven 3.2 开发工具 IntelliJ IDEAsmartGitNavicat15 添加maven配置 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.0</version> </…

thinkphp6 入门(8)-- Session

开启Session Session功能默认是没有开启的&#xff08;API应用通常不需要使用Session&#xff09; think\middleware\SessionInit// 添加引用 use think\facade\Session; 赋值 Session::set(name, thinkphp);取值 // 如果值不存在&#xff0c;返回null Session::get(name)…

机器学习-有监督学习-神经网络

目录 线性模型分类与回归感知机模型激活函数维度诅咒过拟合和欠拟合正则数据增强数值稳定性神经网络大家族CNNRNNGNN&#xff08;图神经网络&#xff09;GAN 线性模型 向量版本 y ⟨ w , x ⟩ b y \langle w, x \rangle b y⟨w,x⟩b 分类与回归 懂得两者区别激活函数&a…

Service Weaver:以单体形式编码,以微服务形式部署

分布式应用的主流架构模式演化为微服务架构已经有些年头了。微服务、DevOps、持续交付和容器技术(k8s)是构成最初云原生概念[1]的核心要素。它们相生相拌&#xff0c;共同演进&#xff0c;并推动了云计算全面进入云原生时代。 云原生应用普遍采用微服务架构&#xff0c;遗留的单…

C# Onnx Yolov8 Detect 涉黄检测

效果 项目 检测类别 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; usi…

【Linux】从零开始学习Linux基本指令(一)

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;Linux入门 &#x1f525;该文章主要了解Linux操作系统下的基本指令。 目录&#xff1a; ⌛️指令的理解⏳目录和文件的理解⏳一些常见指令✉…

“小程序:改变电商行业的新趋势“

目录 引言1. 小程序的简介1.1 什么是小程序&#xff1f;1.2 小程序的优势 2. 小程序之电商演示1.注册微信小程序2.安装开发工具3.创建项目 3. 小程序之入门案例总结 引言 随着移动互联网的迅猛发展&#xff0c;小程序作为一种全新的应用形态&#xff0c;正在逐渐改变着传统电商…

鲲山科技:引入和鲸 ModelWhale,实现量化策略的高效迭代

量化投资是数据科学在金融行业的应用。 2023 年&#xff0c;量化行业的超额收益开始收敛&#xff0c;量化私募如何形成自身核心竞争力&#xff1f; 和鲸拜访客户鲲山科技&#xff08;深圳&#xff09;&#xff0c;揭示其“弯道超车”的独家秘诀。 群体作战 年初至今&#xff…

【软考-中级】系统集成项目管理工程师-配置管理历年案例

持续更新。。。。。。。。。。。。。。。 目录 2023 上 试题三(20分) 2023 上 试题三(20分) 某公司有自己的质量管理体系&#xff0c;其中配置管理程序已运行多年&#xff0c;由项目经理牵头组建变更控制委员会(CCB)&#xff0c;在创建配置管理环境后&#xff0c;并经过变更申请…