成都住房和城鄉(xiāng)建設(shè)部網(wǎng)站天津疫情最新消息
1、自主學(xué)習(xí)QGIS開(kāi)發(fā)
雖然QGIS本身功能強(qiáng)大,但還是架不住我們要編寫(xiě)新的功能、新的業(yè)務(wù)流程、新的算法。前文中我們提到,擴(kuò)展QGIS有2種方法,一是用Python、C++來(lái)寫(xiě)QGIS的插件;另一種就是基于QGIS的C++ API開(kāi)發(fā)獨(dú)立應(yīng)用程序。然而后者資料甚少,官方C++ API文檔也非常簡(jiǎn)略,我也不可能把所有功能都列舉出來(lái),放到博客里。因此我們想要開(kāi)發(fā)更多功能,就得借助一大利器——PyQGIS的文檔了。
2、PyQGIS
Python是一種面向?qū)ο?、直譯式的電腦程式語(yǔ)言,具有近二十年的發(fā)展歷史。它包含了一組功能完備的標(biāo)準(zhǔn)庫(kù),能夠輕松完成很多常見(jiàn)的任務(wù)。它的語(yǔ)法簡(jiǎn)單,與其它大多數(shù)程式設(shè)計(jì)語(yǔ)言使用大括號(hào)不一樣,它使用縮進(jìn)來(lái)定義語(yǔ)句塊。
Python由于有著較高的開(kāi)發(fā)效率,并且具有膠水語(yǔ)言的特性,被廣泛應(yīng)用于各種系統(tǒng)當(dāng)中。ArcGIS與QGIS也不例外。QGIS項(xiàng)目中,使用了sip庫(kù)來(lái)實(shí)現(xiàn)Python與C++代碼的綁定。QGIS官方稱之為PyQGIS。
QGIS軟件里面,專門有一個(gè)Python的控制臺(tái),用于使用Python腳本,實(shí)現(xiàn)一些特殊功能。開(kāi)啟方法為:Plugins → Python Console。效果圖如下:

由于Python的種種優(yōu)勢(shì),QGIS官方寫(xiě)了一個(gè)PyQGIS cookbook的文檔,里面對(duì)PyQGIS進(jìn)行了詳細(xì)的介紹。文檔內(nèi)容包括但不限于:
-載入圖層
-使用柵格圖層
-使用矢量圖層
-處理幾何形體
-投影變換
-地圖渲染、打印
研究PyQGIS文檔,就會(huì)發(fā)現(xiàn),里面各個(gè)類的名稱,與QGIS的C++ API中的名稱一樣。因此,我們可以通過(guò)QGIS的Python文檔,來(lái)學(xué)習(xí)QGIS C++的開(kāi)發(fā)。
3、舉例——載入圖層
上一篇中提到的,我們的第一個(gè)QGIS程序中的一個(gè)功能,就是打開(kāi)Shapefile文件,并顯示出來(lái)。如果我們通過(guò)PyQGIS的文檔,該怎樣學(xué)習(xí)開(kāi)發(fā)呢?
我們應(yīng)該先在PyQGIS中,找到相應(yīng)功能的文檔介紹。比如載入圖層,就是:http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/loadlayer.html
里面介紹載入OGR圖層(Shapefile屬于OGR圖層),代碼如下:
vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
我們”翻譯“成C++的代碼,就是:
QgsVectorLayer *vlayer = new QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr");
可以看出來(lái),Python代碼轉(zhuǎn)化為C++代碼非常方便。
文檔中還介紹了載入柵格圖層的Python代碼:
fileName = "/path/to/raster/file.tif"
fileInfo = QFileInfo(fileName)
baseName = fileInfo.baseName()
rlayer = QgsRasterLayer(fileName, baseName)
if not rlayer.isValid():print "Layer failed to load!"
其對(duì)應(yīng)的C++代碼就可以寫(xiě)成:
QString fileName = "/path/to/raster/file.tif";
QString fileInfo = QFileInfo(fileName);
QString baseName = fileInfo.baseName();
QgsRasterLayer *rlayer = new QgsRasterLayer(fileName, baseName);
if (!rlayer.isValid())qDebug()<<"Layer failed to load!";
4、小結(jié)
通過(guò)PyQGIS文檔,我們可以了解QGIS的基本開(kāi)發(fā)方法,也能很容易地將Python代碼轉(zhuǎn)化為C++代碼。