qgis c++ api 整体框架详解

news2025/2/26 23:21:06

文章目录

  • 整体架构
    • 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.coloradmin.cn/o/1087535.html

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

相关文章

VIT(Vision Transformer)学习(三)-纯VIT之swin transformer模型理解

语义分割网络纯 TRF 结构:VIT主干作为编码器,设计一个基于 TRF 架构的解码器。 今天学习swin transformer 源码地址: https://github.com/microsoft/Swin-Transform 哔哩哔哩讲解:12.1 Swin-Transformer网络结构详解_哔哩哔哩_bilibili 博…

支付宝开放平台第三方代小程序开发,消息服务推送通知总结

大家好,我是小悟 关于支付宝开放平台第三方代小程序开发的消息服务推送通知,是开放平台代小程序实现业务的重要功能。 消息服务推送通知,支持商家两种通讯协议来接收消息,分别为websocket 长连接和http。 关于websocket方式&am…

CentOS 7 编译安装Boost

1、前提条件 linux平台/CentOS 7 下要编译安装Boost除gcc和gcc-c之外,还需要两个开发库:bzip2-devel 和python-devel ,因此在安装前应该先保证这两个库已经安装。 安装指令: yum install bzip2 bzip2-devel bzip2-libs python-devel Cent…

学习开发一个RISC-V上的操作系统(汪辰老师) — 01-helloRVOS程序讲解

前言 (1)此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 (2)该课程相关代码gitee链接; (3)PLCT实验室实习生长期招聘:招聘信息链接 (4) start.S &a…

SpringBoot项目入门: IDEA 创建SpringBoot项目

方式1:在线创建项目 https://start.spring.io/ 环境准备 (1)JDK 环境必须是 1.8 及以上,传送门:jdk1.8.191 下载(2)后面要使用到 Maven 管理工具 3.2.5 及以上版本(3)开发工具建议…

leetcode-279. 完全平方数

1. 题目链接 链接: 题目链接 2. 解答 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>bool issquare(int n) {if (n 1 || n 4) return true;if (n 2 || n 3) return false;for (int i 3; i < n/2; i ) {if (n i*i) return true;}…

【HCIE】12.VXLAN

VXLAN&#xff0c;是一种IP VPN&#xff0c;每台设备几乎都支持IP&#xff0c;而MPLS会有很多设备不会支持&#xff0c;所以VXLAN是使用的较多。 采用MAC in UDP封装方式&#xff0c;MAC指的是原始数据的以太头部被封装到新的UDP头部里面。是基于三层的一个虚拟网络。 技术背…

13.SpringBoot项目之Service层

SpringBoot项目之Service层 JavaEE三层架构 为了项目维护方便&#xff0c;为了项目开发便利。三层架构功能控制器层&#xff1a;controller方便和前端数据进行交互业务层&#xff1a;service处理各种业务持久化层&#xff1a;mapper和数据库进行数据交互 抽取出service层 按…

华为汪涛:5.5G时代UBB目标网,跃升数字生产力

[阿联酋&#xff0c;迪拜&#xff0c;2023年10月12日] 在2023全球超宽带高峰论坛上&#xff0c;华为常务董事、ICT基础设施业务管理委员会主任汪涛发表了“5.5G时代UBB目标网&#xff0c;跃升数字生产力”的主题发言&#xff0c;分享了超宽带产业的最新思考与实践&#xff0c;探…

Ubuntu 23.10 Beta 镜像开放下载

导读Canonical放出了 Ubuntu 23.10 Beta 镜像&#xff0c;此外 Edubuntu、Kubuntu、Lubuntu、Ubuntu Budgie、Ubuntu Cinnamon、Ubuntu Kylin、Ubuntu MATE、Ubuntu Studio、Ubuntu Unity 和 Xubuntu 等风味版本也同步放出镜像。 近日消息&#xff0c;Canonical 放出了 Ubuntu …

【1++的Linux】之文件(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;文件描述符二&#xff0c;重定向三&#xff0c;理解Linux下一切皆文件 一&#xff0c;文件描述符 我们先来看一段代码&#xff1a; #include<unistd.h&g…

什么是CDN内容分发网络?如何做到加速的?

这里写目录标题 CDN如何做到加速的&#xff1f; CDN content delivery network内容分发网络是建立并覆盖在承载网上&#xff0c;由遍布全球的边缘节点服务器群组成的分布式网络。 CDN将源站资源缓存在遍布全球的边缘加速节点服务器上&#xff0c;当客户需要访问和获取资源的时…

如何使用Net2FTP搭建免费web文件管理器打造个人网盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

助力乡村教育 泰格智能AI英语开展捐赠实施线上培训

2023年10月11日晚8点至9点&#xff0c;泰格智能AI英语创始人李勤骞老师举行了一场为期一小时的线上培训&#xff0c;旨在详细解答泰格智能AI英语联合中国善网捐赠千词切APP训练账号的意义&#xff0c;探讨乡村教育、学习英语的现状和方法&#xff0c;以及项目的实施和落地要求。…

阿里健康携手15家药企发起“慢病减压计划”,为职场人的健康“减负”

近年来&#xff0c;慢性疾病患者的发病年龄正在逐年递减。一组来自阿里健康研究院内部分析数据印证了这一趋势。数据显示&#xff0c;当代80后职场人群中&#xff0c;三成用户购买过慢病药品。 30-39岁已经成为肝胆、心脑等相关疾病药品的购药主力人群 。35-39岁是高血压疾病药…

204、RabbitMQ 之 使用 topic 类型的 Exchange 实现通配符路由

目录 ★ 使用topic实现通配符路由代码演示topic通配符类型的Exchange代码演示:ConstantUtilConnectionUtilProducerConsumer01执行结果生产者消费者01消费者02 完整代码&#xff1a;ConstantUtilConnectionUtilProducerConsumer01Consumer02pom.xml ★ 使用topic实现通配符路由…

Linux系统移植框架简介

一、系统移植简介 系统移植就是给开发板安装一个linux系统。需要从官方下载u-boot源码&#xff0c;linux内核源码&#xff0c;根文件系统的源码&#xff0c;对源码进行配置和编译&#xff0c;生成对应的源码的镜像文件&#xff0c;将镜像文件部署到开发板中&#xff0c;使开发…

上海亚商投顾:沪指高开高走 锂电等新能源赛道大反攻

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日高开后强势震荡&#xff0c;创业板指盘中一度翻绿&#xff0c;随后探底回升再度走高。碳酸锂期货合约…

制药行业中的设备管理系统和CSV最佳实践

在制药行业&#xff0c;合规性和质量是关键要素&#xff0c;而设备管理和计算机化系统验证&#xff08;CSV&#xff09;是确保这些要素的关键。之前我们介绍过设备健康管理系统如何帮助制药企业实现CSV合规性>>PreMaint设备健康管理系统&#xff1a;实现制药企业的CSV合规…