2. qgis c++ api 整體框架詳解

整體架構(gòu)

QGis庫官方文檔

下表是官方文檔中的模塊說明:

文檔 說明
core The CORE library contains all basic GIS functionality 核心庫
gui The GUI library is build on top of the CORE library and adds reusable GUI widgets 基于CORE庫的,增加了可復用的界面組件
analysis The ANALYSIS library is built on top of CORE library and provides high level tools for carrying out spatial analysis on vector and raster data 集成了一些算法芜飘,如緩沖區(qū)的生成
3D The 3D library is build on top of the CORE library and Qt 3D framework 3D庫
plugin classes Contains classes related to implementation of QGIS plugins 組件庫 如data provider, 一些算法都是采用插件機制實現(xiàn)的
QgsQuick The QgsQuick library is built on top of the CORE library and Qt Quick/QML framework 基于CORE庫嗦锐,可用于QML
server The SERVER library is built on top of the CORE library and adds map server components to QGIS 服務(wù)端組件

其中3D,QgsQuick和server庫需要在編譯之前進行配置岔擂,配置項分別為WITH_3D WITH_QUICKWITH_SERVER玲昧,具體編譯配置方法見開發(fā)環(huán)境搭建章節(jié)

編譯生成的庫

實際編譯生成的庫如下圖


image.png
說明
app QGis Desktop程序庫,屬于應(yīng)用層摩瞎,并沒有這個庫的官方文檔
native 不同平臺之間特有的功能
python 用于使用python特性
test 單元測試庫
core 核心庫
gui 小組件庫
analysis 算法庫

其中core為基礎(chǔ)庫,其他庫都依賴core孝常,以下詳細說明core旗们、gui和analysis三個庫

core

core庫是qgis系統(tǒng)中的基礎(chǔ)類,包含所有基本的GIS功能构灸,而該庫的很大一部分功能是用于處理矢量(vector)和柵格(raster)地理空間數(shù)據(jù)上渴,并在地圖中顯示這些類型的數(shù)據(jù)。在講解vector和raster之前先介紹一下地圖圖層概念

地圖和圖層

地圖由多個圖層組成喜颁,一個層繪制在另一個層的上層稠氮,qgis支持多種類型的圖層:


image.png
  • Annotaion layer: 表示包含一組地理參考注釋的地圖層,例如標記半开、直線隔披、多邊形或文本項。在qgis desktop中可以添加對應(yīng)類型的annotaion


    image.png
  • Group layer: 由一組子層組成的地圖層


    image.png
  • Mesh Layer: 表示支持在結(jié)構(gòu)化或非結(jié)構(gòu)化網(wǎng)格上顯示數(shù)據(jù)的網(wǎng)格層寂拆。多用于存儲氣候氣象數(shù)據(jù)奢米、水文數(shù)據(jù)、洋流數(shù)據(jù)等


    image.png
  • Plugin Layer: Base class for plugin layers. 插件實現(xiàn)自定義圖層

  • PointCloud Layer: 點云圖層

  • Vector Tile Layer: 矢量瓦片圖層

  • Raster Layer: 柵格圖層


    image.png
  • Vector Layer: 矢量圖層


    image.png

其中矢量圖層和柵格圖層是最常用的漓库,我們將重點研究這兩個圖層恃慧,下圖是矢量圖層和柵格圖層疊加顯示效果圖


image.png

矢量圖層(Vector layers)

矢量數(shù)據(jù)通常用點、線渺蒿、多邊形等基本幾何對象描述。矢量格式的地理空間數(shù)據(jù)通常從矢量數(shù)據(jù)源(data provider)讀取彪薛,常見的矢量數(shù)據(jù)源有.shp文件茂装、數(shù)據(jù)庫、內(nèi)存善延、webservice等等少态,如下圖QGis添加矢量圖層示例

image.png

矢量層本身由QgsVectorLayer類表示。矢量層包括很多模塊易遣,如下圖所示彼妻,

image.png

下面重點講解以下模塊

  • symbology: 圖層要素符號
  • proj: 坐標映射
  • providers: 數(shù)據(jù)源

圖層要素符號

圖層要素

矢量格式具有許多要素(features),矢量圖層屬性表每一行都代表一個要素

jilin_city.shp為例豆茫,在QGis中添加圖層后侨歉,打開屬性表(Attribute Table)如下圖所示

image.png

image.png
image.png

可以看到矢量屬性表有9行,代表9個要素揩魂,這9個要素以符號的形式顯示在地圖上幽邓,使用QGis的地圖工具:Identify Feature工具查看屬性如下圖

image.png

可以看到要素(feature)的屬性包含了id,Geometry以及附件屬性火脉,QgsFeature類用于表示要素牵舵。每個要素都有以下屬性:

  • id: feature id
  • Geometry: 要素的地理信息柒啤,表示要素是地圖上點、線畸颅、多邊形等担巩。
  • Attributes: 要素的附加屬性,例如一個城市要素可能具有total_area没炒、population兵睛、elevation等屬性。屬性值可以是字符串窥浪、整數(shù)或浮點數(shù)祖很。

要素渲染(feature renderer)

上邊已經(jīng)看到了jilin_city.shp中的要素(feature)渲染為一個點,在QGis中提供了多種渲染方式漾脂,如下圖

image.png

QgsFeatureRenderer類是這些渲染方式的父類假颇,見如下類圖

image.png

以后的章節(jié)我們一一講解各個渲染類

符號(symbol)

設(shè)置渲染器之后需要設(shè)置符號,以單一符號渲染器為例骨稿,可設(shè)置的符號類別如下圖


image.png

QgsSymbol是符號的父類笨鸡,見下圖的類圖

image.png

QgsFillSymbol,QgsLineSymbolQgsMarkerSymbol分別對應(yīng)三種幾何圖形面、線和點的符號

坐標映射

在GIS軟件中坦冠,空間坐標依據(jù)坐標系的不同分為地理坐標和投影坐標形耗。地理坐標是將地球比作一個類橢球體,描述一個點在球面上的位置辙浑。但是在地圖制圖過程中激涤,往往需要在一個平面(無論是紙質(zhì)地圖還是電子地圖)上展示地物,這時需要解決地球球面與地圖平面之間的矛盾判呕,因此需要對地球進行投影倦踢,經(jīng)過投影后的坐標稱為投影坐標,因此投影坐標是建立在地理坐標之上的侠草。

為了解決地球橢球面和地圖平面之間的矛盾辱挥,需要將地球橢球面進行投影,經(jīng)過投影以后的坐標系稱為投影坐標系边涕。投影后的平面坐標系一定會出現(xiàn)變形晤碘,我們只能在等距、等積和等角之間進行取舍功蜓。因此园爷,在不同應(yīng)用場景下,大量的投影坐標系應(yīng)運而生霞赫。

各個國家或地區(qū)建立了能夠基本符合自己國家或地區(qū)的地球橢球面腮介,或者根據(jù)精度需要及特定應(yīng)用場景構(gòu)建了不同的地球橢球面。根據(jù)構(gòu)建的地球橢球面的參數(shù)不同端衰,地理坐標系也層出不窮叠洗。我國的地理坐標系經(jīng)歷了從北京1954坐標系(BJZ54)到西安1980坐標系(XI'AN-80)甘改,再到2000國家大地坐標系(CGCS2000)的發(fā)展過程。

由于地理坐標系和投影坐標系眾多灭抑,如果僅通過參數(shù)對這些坐標系進行整理與應(yīng)用則過于麻煩十艾,因此需要通過標準化組織將這些坐標系歸檔整理。對于石油的探查和開采來講腾节,坐標系的不同會顯著影響開采精度忘嫉,因此歐洲石油調(diào)查組織(European Petroleum Survey Group,EPSG)整合了絕大多數(shù)常用的坐標系案腺,并為每個坐標系設(shè)置了一個編碼庆冕,例如,“EPSG:4326”和“EPSG:3785”分別表示W(wǎng)GS 1984坐標系和WGS 1984 Web墨卡托投影坐標系劈榨。

QGis矢量圖層會顯示坐標系访递,如下圖


image.png

數(shù)據(jù)源(data provider)

QgsVectorDataProvider代表Vector Layer的數(shù)據(jù)源,類圖如下

image.png

數(shù)據(jù)源包含的數(shù)據(jù)在QGis中以表格形式展示同辣,如下圖


image.png

Raster layers

光柵格式的地理空間數(shù)據(jù)本質(zhì)上是位圖圖像拷姿,其中圖像中的每個像素都對應(yīng)于地球表面的特定部分。
柵格數(shù)據(jù)采用某種數(shù)據(jù)類型的數(shù)值陣列存儲數(shù)據(jù)旱函,陣列中的每個數(shù)值稱為一個像元(Pixel)响巢。由于數(shù)據(jù)陣列本身不存在空間信息,因此需要元數(shù)據(jù)進行界定棒妨。
柵格數(shù)據(jù)的元數(shù)據(jù)包括空間坐標系踪古、數(shù)據(jù)類型等。


image.png
image.png

光柵圖層本身由QgsRasterLayer類表示靶衍。每個光柵圖層包括:

  • symbology: 圖層要素符號
  • proj: 坐標映射
  • Data provider: 數(shù)據(jù)源

圖層符號

Raster Layer有多種渲染方式灾炭,QgsRasterRenderer是Raster圖層渲染的父類,如下圖

image.png

在QGis中設(shè)置不同渲染器


image.png
  • Multiband color
    如果光柵數(shù)據(jù)具有多個波段颅眶,則通常會將帶組合以生成所需的顏色。例如田弥,一個波段可能表示顏色的紅色分量涛酗,另一個波段可以表示綠色分量,還有一個波段則可能表示藍色分量偷厦。
  • Paletted/Unique values
    如果光柵數(shù)據(jù)只有一個波段商叹,則像素值可以用作調(diào)色板的索引。調(diào)色板將每個像素值映射到特定的顏色只泼。
  • Singleband gray
    如果光柵數(shù)據(jù)只有一個波段剖笙,但沒有提供調(diào)色板。像素值可以直接用作灰度值请唱;也就是說弥咪,越大的數(shù)字越亮过蹂,越小的數(shù)字越暗【壑粒或者酷勺,像素值可以通過偽彩色算法來計算要顯示的顏色。
  • Singleband pseudocolor
    多波段數(shù)據(jù)可以使用調(diào)色板繪制多波段光柵數(shù)據(jù)源扳躬,或者將其繪制為灰度或偽彩色圖像脆诉。
  • Hillshade
    多用于顯示高程數(shù)據(jù)
  • Contours
    顯示輪廓

數(shù)據(jù)源

QgsRasterDataProvider代表Raster Layer的數(shù)據(jù)源,類圖如下

image.png

成員函數(shù)identify用于查看raster圖層數(shù)據(jù)

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

后邊章節(jié)會逐一介紹相關(guān)類和函數(shù)

坐標映射

坐標參考系(Coordinate Reference System贷币,CRS)界定了柵格數(shù)據(jù)所處的投影坐標系或地理坐標系击胜。

core庫其他有用類

說明
QgsProject 代表當前項目,包含一系列屬性如地圖圖層及其樣式、布局役纹、注釋偶摔、畫布等
Qgis Qgis類提供全局常量,供整個應(yīng)用程序使用
QgsGeometry 代表幾何特征字管,是feature的空間表示啰挪,QgsGeometry對象本質(zhì)上是笛卡爾/平面幾何。
QgsCurve 曲線類型的抽象基類
QgsPoint 點類型
QgsSurface 曲面類型
QgsRectangle 矩形
QgsEllipse 橢圓形
QgsDistanceArea 距離嘲叔、面積測算類

gui

GUI庫構(gòu)建在CORE庫之上亡呵,并添加了可重用的GUI小部件

QgsMapCanvas

地圖視圖(也稱為地圖畫布)用于顯示地圖控件,QGIS主窗體的地圖區(qū)域就是一個地圖視圖硫戈。QGIS支持多地圖視圖锰什,即可以在保留地圖區(qū)域的基礎(chǔ)上,以面板的形式增加地圖視圖(或3D地圖視圖)丁逝。QGIS多個地圖視圖采用同一個圖層控制面板控制汁胆,因此一般用于顯示同一個地圖主題的不同四至范圍數(shù)據(jù)(或以3D形式展示數(shù)據(jù))。

QgsMapcanvas類是一個用于在畫布上顯示所有GIS數(shù)據(jù)類型的類霜幼。是QGraphicsView的子類
包括以下功能:

  • 當前顯示的地圖圖層的列表嫩码。這可以使用layers()方法訪問。
  • 獲取地圖使用的地圖單位(米罪既、英尺铸题、度等)∽粮校可以通過調(diào)用mapUnits())方法來獲取丢间。
  • 顯示范圍,即當前顯示在畫布中的地圖區(qū)域驹针。地圖的范圍將隨著用戶放大和縮小以及在地圖上平移而改變烘挫。當前映射范圍可以通過調(diào)用extent()方法來獲得。
  • 當前地圖工具柬甥,可以使用setMapTool()設(shè)置饮六,使用mapTool()獲取當前工具
  • 設(shè)置地圖背景色其垄,使用canvasColor()獲取
  • 坐標轉(zhuǎn)換,將地圖坐標轉(zhuǎn)換為窗口坐標

QgsMapTool

  • 地圖視圖控制可以使用地圖瀏覽工具欄


    image.png
image.png
image.png

QgsMapTool是地圖工具類基類喜滨,用于和用戶交互捉捅、操作地圖、處理鼠標事件虽风。類圖如下

image.png

QgsLayerTreeView/QgsLayerTreeModel

QgsLayerTreeView類擴展了QTreeView棒口,提供圖層管理功能,并提供了一些附加功能辜膝。如下圖

image.png

QgsMapCanvasItem

QgsMapCanvasItem是可以直接畫在map canvas的item的基類无牵,Map Canvas Item顯示優(yōu)先級高于圖層。類圖如下

image.png

  • QgsVertexMarker: 這將繪制一個圖標(“X”厂抖、“+”或小方框)茎毁,以地圖上的給定點為中心。
  • QgsRubberBand: 這將在地圖上繪制任意幾何類型忱辅。它在用戶繪制時提供視覺反饋七蜘。
  • QgsAnnotationItem: 在地圖上添加標注的基類,其子類如下圖


    image.png

其他有用的gui類

說明
QgsMapTip 鼠標懸停時顯示的提示信息
QgsColorDialog 顏色選擇框
QgsBlendModeComboBox
QgsBrushStyleComboBox
QgsColorRampComboBox
QgsPenCapStyleComboBox
QgsPenJoinStyleComboBox 以上QComboBox用戶界面小部件提示用戶輸入各種繪圖選項
QgsScaleComboBox 選擇縮放等級

analysis

analysis庫建立在CORE庫之上墙懂,為對矢量和光柵數(shù)據(jù)進行空間分析提供了高級工具橡卤,QGis中算法多集中在Processing Toolbox中,如下圖


image.png

QgsProcessingProvider

QgsProcessingProvider類通常提供一組相關(guān)算法损搬,類圖如下

image.png

QgsProcessingAlgorithm

QgsProcessingAlgorithm類代表一種算法碧库,通常由QgsProcessingRegistry進行創(chuàng)建,之后可以運行算法巧勤,獲取結(jié)果

QgsProcessingRegistry

QgsProcessingRegistry類用于注冊算法處理的各個組件包括:providers, algorithms,input,output and various parameters.
以clip算法為例嵌灰,使用QgsProcessingRegistry創(chuàng)建算法類

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是在線程中運行算法的類喂窟,類圖如下

image.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恋拍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子豆同,更是在濱河造成了極大的恐慌剩瓶,老刑警劉巖秕脓,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異儒搭,居然都是意外死亡,警方通過查閱死者的電腦和手機芙贫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門搂鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人磺平,你說我怎么就攤上這事魂仍」樟桑” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵擦酌,是天一觀的道長俱诸。 經(jīng)常有香客問我,道長赊舶,這世上最難降的妖魔是什么睁搭? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮笼平,結(jié)果婚禮上园骆,老公的妹妹穿的比我還像新娘。我一直安慰自己寓调,他們只是感情好锌唾,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夺英,像睡著了一般晌涕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痛悯,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天余黎,我揣著相機與錄音,去河邊找鬼灸蟆。 笑死驯耻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的炒考。 我是一名探鬼主播可缚,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斋枢!你這毒婦竟也來了帘靡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓤帚,失蹤者是張志新(化名)和其女友劉穎描姚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戈次,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡轩勘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怯邪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊寻。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澄步,到底是詐尸還是另有隱情冰蘑,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布村缸,位于F島的核電站祠肥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梯皿。R本人自食惡果不足惜仇箱,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望索烹。 院中可真熱鬧工碾,春花似錦、人聲如沸百姓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垒拢。三九已至旬迹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間求类,已是汗流浹背奔垦。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尸疆,地道東北人椿猎。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像寿弱,于是被迫代替她去往敵國和親犯眠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容