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

由于Python的種種優(yōu)勢,QGIS官方寫了一個PyQGIS cookbook的文檔,里面對PyQGIS進行了詳細的介紹。文檔內(nèi)容包括但不限于:
-載入圖層
-使用柵格圖層
-使用矢量圖層
-處理幾何形體
-投影變換
-地圖渲染、打印
研究PyQGIS文檔,就會發(fā)現(xiàn),里面各個類的名稱,與QGIS的C++ API中的名稱一樣。因此,我們可以通過QGIS的Python文檔,來學習QGIS C++的開發(fā)。
3、舉例——載入圖層
上一篇中提到的,我們的第一個QGIS程序中的一個功能,就是打開Shapefile文件,并顯示出來。如果我們通過PyQGIS的文檔,該怎樣學習開發(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");
可以看出來,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!"
其對應(yīng)的C++代碼就可以寫成:
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é)
通過PyQGIS文檔,我們可以了解QGIS的基本開發(fā)方法,也能很容易地將Python代碼轉(zhuǎn)化為C++代碼。