整體架構(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_QUICK
和WITH_SERVER
玲昧,具體編譯配置方法見開發(fā)環(huán)境搭建章節(jié)
編譯生成的庫
實際編譯生成的庫如下圖
庫 | 說明 |
---|---|
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支持多種類型的圖層:
-
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
其中矢量圖層和柵格圖層是最常用的漓库,我們將重點研究這兩個圖層恃慧,下圖是矢量圖層和柵格圖層疊加顯示效果圖
矢量圖層(Vector layers)
矢量數(shù)據(jù)通常用點、線渺蒿、多邊形等基本幾何對象描述。矢量格式的地理空間數(shù)據(jù)通常從矢量數(shù)據(jù)源(data provider)讀取彪薛,常見的矢量數(shù)據(jù)源有.shp文件茂装、數(shù)據(jù)庫、內(nèi)存善延、webservice等等少态,如下圖QGis添加矢量圖層示例
image.png
矢量層本身由QgsVectorLayer
類表示。矢量層包括很多模塊易遣,如下圖所示彼妻,
下面重點講解以下模塊
- symbology: 圖層要素符號
- proj: 坐標映射
- providers: 數(shù)據(jù)源
圖層要素符號
圖層要素
矢量格式具有許多要素(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等屬性。屬性值可以是字符串窥浪、整數(shù)或浮點數(shù)祖很。
要素渲染(feature renderer)
上邊已經(jīng)看到了jilin_city.shp
中的要素(feature)渲染為一個點,在QGis中提供了多種渲染方式漾脂,如下圖
而QgsFeatureRenderer
類是這些渲染方式的父類假颇,見如下類圖
以后的章節(jié)我們一一講解各個渲染類
符號(symbol)
設(shè)置渲染器之后需要設(shè)置符號,以單一符號渲染器為例骨稿,可設(shè)置的符號類別如下圖
QgsSymbol
是符號的父類笨鸡,見下圖的類圖
QgsFillSymbol
,QgsLineSymbol
和QgsMarkerSymbol
分別對應(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矢量圖層會顯示坐標系访递,如下圖
數(shù)據(jù)源(data provider)
類QgsVectorDataProvider
代表Vector Layer的數(shù)據(jù)源,類圖如下
數(shù)據(jù)源包含的數(shù)據(jù)在QGis中以表格形式展示同辣,如下圖
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
光柵圖層本身由QgsRasterLayer
類表示靶衍。每個光柵圖層包括:
- symbology: 圖層要素符號
- proj: 坐標映射
- Data provider: 數(shù)據(jù)源
圖層符號
Raster Layer有多種渲染方式灾炭,QgsRasterRenderer
是Raster圖層渲染的父類,如下圖
在QGis中設(shè)置不同渲染器
- 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ù)源,類圖如下
成員函數(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
QgsMapTool
是地圖工具類基類喜滨,用于和用戶交互捉捅、操作地圖、處理鼠標事件虽风。類圖如下
QgsLayerTreeView/QgsLayerTreeModel
QgsLayerTreeView
類擴展了QTreeView棒口,提供圖層管理功能,并提供了一些附加功能辜膝。如下圖
QgsMapCanvasItem
QgsMapCanvasItem
是可以直接畫在map canvas的item的基類无牵,Map Canvas Item顯示優(yōu)先級高于圖層。類圖如下
- QgsVertexMarker: 這將繪制一個圖標(“X”厂抖、“+”或小方框)茎毁,以地圖上的給定點為中心。
- QgsRubberBand: 這將在地圖上繪制任意幾何類型忱辅。它在用戶繪制時提供視覺反饋七蜘。
-
QgsAnnotationItem: 在地圖上添加標注的基類,其子類如下圖
image.png
其他有用的gui類
類 | 說明 |
---|---|
QgsMapTip | 鼠標懸停時顯示的提示信息 |
QgsColorDialog | 顏色選擇框 |
QgsBlendModeComboBox | |
QgsBrushStyleComboBox | |
QgsColorRampComboBox | |
QgsPenCapStyleComboBox | |
QgsPenJoinStyleComboBox | 以上QComboBox用戶界面小部件提示用戶輸入各種繪圖選項 |
QgsScaleComboBox | 選擇縮放等級 |
analysis
analysis庫建立在CORE庫之上墙懂,為對矢量和光柵數(shù)據(jù)進行空間分析提供了高級工具橡卤,QGis中算法多集中在Processing Toolbox中,如下圖
QgsProcessingProvider
QgsProcessingProvider
類通常提供一組相關(guān)算法损搬,類圖如下
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
是在線程中運行算法的類喂窟,類圖如下