使用Python進行QGIS二次開發(fā)1

Date: 2014-11-30 21:09
Summary: 本文記錄了使用Python進行QGIS二次開發(fā)的過程按摘,以及過程中遇到的問題。由于內(nèi)容較多,將文章分成2個部分。這是第一部分弥锄。

使用Python進行QGIS二次開發(fā)1

最近在做QGIS二次開發(fā),支持C++和Python蟆沫。綜合各種原因籽暇,考慮選擇使用Python語言。在開發(fā)過程中遇到不少坑饭庞,費了不少勁戒悠,也總結(jié)了很多經(jīng)驗教訓。在此以一些代碼為例舟山,簡單分享一下QGIS二次開發(fā)過程中的種種問題绸狐。注意:本人開發(fā)的是獨立程序,而不是QGIS插件捏顺。

主要內(nèi)容

1. 環(huán)境配置

QGIS最新版本到了2.6六孵,但是其官方文檔還停留在2.2纬黎。抱著好奇的心態(tài)先裝了一下2.6熟悉了一番幅骄,準備進行開發(fā)時候遇到了第一個坑,2.6中帶的Python啟動報錯本今,缺少模塊拆座!沒辦法,看到文檔是2.2版本冠息,就想著按著文檔來吧挪凑,于是又裝了2.2。但是事實證明這次出bug的地方是另一處(后面會詳細介紹)逛艰。還好中間有個2.4的版本躏碳,再有bug的話真是考慮換平臺了。幸虧這個2.4版本能用散怖。

網(wǎng)上講環(huán)境配置大多數(shù)是用C++開發(fā)菇绵,python開發(fā)的比較少肄渗。Python開發(fā)環(huán)境的搭建主要是一些包所在的路徑要寫到環(huán)境變量中才能找到。這里遇到的困難就是環(huán)境變量中的路徑該怎么寫咬最?QGIS在2.x之后加入了不少內(nèi)容翎嫡,路徑和以前的已經(jīng)完全不一樣了,最可惡的是官方文檔中竟然都有錯誤的永乌。就像下圖中惑申,左側(cè)是官方文檔給出的路徑,右側(cè)是實際的路徑翅雏,完全匹配不上叭ν铡!M浮碗脊!

QGIS文件夾比較

只好自己摸索著前進了。最終配置好的環(huán)境如下:

  • 操作系統(tǒng):Win7 64位sp1 virtual box虛擬機

  • 環(huán)境變量設(shè)置:

    QGISDIR=D:/Program Files (x86)/QGIS Chugiak
    QGIS_PREFIX=%QGISDIR%/apps/qgis
    PATH=%QGISDIR%/bin;%QGISDIR%/apps/qgis/bin;(后面是原內(nèi)容)
    PYTHONPATH=%QGISDIR%/apps/Python27/Lib/site-packages;%QGISDIR%/apps/qgis
    GDAL_DATA=%QGISDIR%/share/gdal (QGIS在加載數(shù)據(jù)集的時候橄妆,需要找GDAL中的配置文件衙伶,所以需要這個)

  • 開發(fā)環(huán)境:Pycharm 3.4

  • 代碼管理:github

環(huán)境配好以后打開命令行,輸入python啟動python解釋器害碾,然后輸入:

>>> import PyQt4.QtCore
>>> import PyQt4.QtGui
>>> import qgis.core
>>> import qgis.gui
>>> 

如果沒有錯誤的話矢劲,就說明環(huán)境配置OK。

2. 使用Qt界面

這部分主要就是PyQt的使用了慌随。關(guān)于PyQt國內(nèi)外也有很多教程可以參考.PyQt的使用和Qt的使用類似芬沉,只是某些地方不一樣。有一本書Rapid GUI Programming with Python and Qt就是專門講這個的阁猜,感興趣的可以在網(wǎng)上搜一下丸逸。這篇帖子是一個很好的介紹Python開發(fā)QGIS的資料,不過實用的版本都比較老了剃袍,我也是從這里開始的黄刚。下面對其中的一些關(guān)鍵點進行解釋。

2.1 使用Qt Designer來設(shè)計界面

Qt Designer是開發(fā)Qt程序的圖形界面民效°疚可以通過拖拽直接在上面放置Widget進行界面設(shè)計,很方便畏邢。最后會得到ui文件和qrc文件业扒。

Qt Designer

2.2 編譯ui和rc文件

設(shè)計完成之后要在PyQt里面用起來的話,還需要一個編譯的過程舒萎。使用下面的命令進行編譯:

pyuic4 -o filename_gui.py filename.ui  
purcc4 -o filename_rc.py filename.qrc

需要注意的是程储,-o參數(shù)指定的是輸出文件,filename所使用的文件名一定要是一樣的,并且后綴_gui和_rc一定要加章鲤,因為_gui文件的最后會import加后綴_rc的文件致板。否則就會找不到。

2.3 QGIS應(yīng)用開發(fā)

這里以ShapeViewer為例咏窿,主窗口代碼如下:

class ShapeViewer(QMainWindow, Ui_MainWindow):
  def __init__(self):
    QMainWindow.__init__(self)

    # Required by Qt4 to initialize the UI
    self.setupUi(self)

    # Set the title for the app
    self.setWindowTitle("ShapeViewer")

    # Create the map canvas
    self.canvas = QgsMapCanvas()        
    self.canvas.show()
    self.canvas.setCanvasColor(QColor(255,255,255))
    self.canvas.enableAntiAliasing(True)

    # Lay our widgets out in the main window using a 
    # vertical box layout
    self.layout = QVBoxLayout(self.frame)
    self.layout.addWidget(self.canvas)

    # layout is set - open a layer
    # Add an OGR layer to the map
    file = QFileDialog.getOpenFileName(self, 
                   "Open Shapefile", ".", "Shapefiles (*.shp)")
    fileInfo = QFileInfo(file)

    # Add the layer
    layer = QgsVectorLayer(file, fileInfo.fileName(), "ogr")

    if not layer.isValid():
      return

    # Add layer to the registry
    QgsMapLayerRegistry.instance().addMapLayer(layer);

    # Set extent to the extent of our layer
    self.canvas.setExtent(layer.extent())

    # Set up the map canvas layer set
    cl = QgsMapCanvasLayer(layer)
    layers = [cl]
    self.canvas.setLayerSet(layers)

下面做一些簡要的解釋:

  • 首先調(diào)用setupUi斟或,這是Qt中固定的模式
  • 新建QgsMapCanvas對象,并調(diào)用show使其顯示集嵌,設(shè)置背景顏色為白色(默認是黑色的)萝挤,并且開啟抗鋸齒效果
  • 使用QVBoxLayout來進行縱向的布局
  • 打開一個shp文件作為矢量圖層,使用的是gdal里面提供的ogr
  • QgsMapLayerRegistry相當于是一個圖層管理器根欧,所有的圖層都要加到里面去
  • 使用setExtent函數(shù)來設(shè)置MapCanvas的可視范圍
  • 使用setLayerSet來給MapCanvas設(shè)置進行渲染的圖層

入口函數(shù)和啟動Qt程序的代碼如下:

def main(argv):
  # create Qt application
  app = QApplication(argv)

  # Initialize qgis libraries
  QgsApplication.setPrefixPath(qgis_prefix, True)
  QgsApplication.initQgis()

  # create main window
  wnd = ShapeViewer()
  # Move the app window to upper left
  wnd.move(100,100)
  wnd.show()

  # run!
  retval = app.exec_()
  
  # exit
  QgsApplication.exitQgis()
  sys.exit(retval)


if __name__ == "__main__":
  main(sys.argv)

解釋幾點:

  • 要注意QGIS的使用方法怜珍。設(shè)置prefix,進行初始化凤粗,最后在程序退出之前QGIS也要退出酥泛。
  • qgis_prefix變量一定要設(shè)置正確。因為QGIS和以前版本組織文件的方法已經(jīng)不同了嫌拣,本人試了幾次柔袁,該變量的值就是前面設(shè)置的QGIS_PREFIX環(huán)境變量的值,可以直接取出來用异逐。

有幾點需要注意:

  1. QgsMapLayerRegistry的作用相當于是一個圖層管理器捶索,并且提供了添加和刪除的接口;QgsMapCanvas中的LayerSet是用來進行渲染的圖層的集合灰瞻,在動態(tài)添加和刪除圖層的時候要注意這兩者的區(qū)別和使用方法腥例。
  2. QGIS2.2地圖控件中有bug:程序啟動之后必須先失去一下焦點,然后才能顯示出地圖內(nèi)容酝润,這是已知的一個bug(http://gis.stackexchange.com/questions/87841/why-qgsmapcanvas-only-appear-after-lost-focus?rq=1)燎竖,所以避開了2.2的版本。畢竟是開源軟件要销,可以理解构回。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蕉陋,隨后出現(xiàn)的幾起案子捐凭,更是在濱河造成了極大的恐慌拨扶,老刑警劉巖凳鬓,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異患民,居然都是意外死亡缩举,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仅孩,“玉大人托猩,你說我怎么就攤上這事×赡剑” “怎么了京腥?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溅蛉。 經(jīng)常有香客問我公浪,道長,這世上最難降的妖魔是什么船侧? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任欠气,我火速辦了婚禮,結(jié)果婚禮上镜撩,老公的妹妹穿的比我還像新娘预柒。我一直安慰自己,他們只是感情好袁梗,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布宜鸯。 她就那樣靜靜地躺著,像睡著了一般遮怜。 火紅的嫁衣襯著肌膚如雪顾翼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天奈泪,我揣著相機與錄音第岖,去河邊找鬼。 笑死期升,一個胖子當著我的面吹牛峻汉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冯遂,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蕊肥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛤肌?” 一聲冷哼從身側(cè)響起壁却,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裸准,沒想到半個月后展东,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡炒俱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年盐肃,在試婚紗的時候發(fā)現(xiàn)自己被綠了爪膊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡砸王,死狀恐怖推盛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谦铃,我是刑警寧澤耘成,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站驹闰,受9級特大地震影響凿跳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疮方,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一控嗜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骡显,春花似錦疆栏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溜歪,卻和暖如春若专,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝴猪。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工调衰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人自阱。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓嚎莉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沛豌。 傳聞我的和親對象是個殘疾皇子趋箩,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • GitHub 上有一個 Awesome - XXX 系列的資源整理,資源非常豐富,涉及面非常廣加派。awesome-p...
    若與閱讀 18,615評論 4 418
  • 環(huán)境管理管理Python版本和環(huán)境的工具叫确。p–非常簡單的交互式python版本管理工具。pyenv–簡單的Pyth...
    MrHamster閱讀 3,783評論 1 61
  • 前言 Python的創(chuàng)始人為Guido van Rossum芍锦。1989年圣誕節(jié)期間竹勉,在阿姆斯特丹,Guido為了打...
    依依玖玥閱讀 3,563評論 6 37
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,443評論 6 428
  • 雖然濕透了醉旦,心卻是暖暖的饶米〗翱校或許是自己也是母親了车胡,很多感情檬输,就想要去珍惜。用著不是很流利的福州話匈棘,和爺爺奶奶說丧慈,?奶...
    love汐陽閱讀 142評論 0 0