邱儒瓊,何保國
(1.湖北省基礎(chǔ)地理信息中心,湖北武漢430071;2.湖北省測繪局,湖北武漢430071)
3S技術(shù)是目前IT領(lǐng)域的熱門話題,GIS也隨著Google Earth的流行而被越來越多的人所熟知。在GIS流行的背后,它關(guān)聯(lián)著人們?nèi)粘I畹姆椒矫婷?,也有越來越多的開源GIS在默默貢獻(xiàn)自己的力量。在眾多的開源桌面GIS軟件中,QGIS以其用戶界面友好、廣泛支持操作系統(tǒng)等特點,擁有廣大的用戶群[1]。由于QGIS是基于Qt跨平臺類庫開發(fā),因此支持目前最為廣泛的操作系統(tǒng)如Linux、Unix、Mac OSX和Windows等,這一點是其他很多桌面GIS軟件所不可企及的。而最為重要的是,其重構(gòu)了QGIS的API庫,方便用戶進(jìn)行二次開發(fā)。通常GIS需要回答“我們在哪兒”或“我們到哪兒”等這類與地理位置相關(guān)的問題,但目前QGIS還只支持針對空間數(shù)據(jù)的屬性搜索功能,而不具備針對用戶自定義的關(guān)系型數(shù)據(jù)表格的屬性搜索功能。由于QGIS具有支持插件模式的優(yōu)點,因此可以通過地名搜索插件來擴展QGIS在地名搜索方面的功能。本文將利用常見地名數(shù)據(jù)庫,闡述在PyQt環(huán)境下利用Python語言來開發(fā)QGIS地名搜索插件的方法。
近年來,信息技術(shù)發(fā)展迅猛,信息網(wǎng)絡(luò)廣泛普及,傳統(tǒng)的地名服務(wù)管理模式已不能滿足社會需求。建立和完善地名數(shù)據(jù)庫,開展地名信息化服務(wù),已成為地名工作的必然選擇和發(fā)展方向。一般而言,地名地址數(shù)據(jù)庫包括水系、陸地地形、行政區(qū)域及其他區(qū)域、居民點,以及具有地名意義的交通運輸設(shè)施,具有地名意義的水利、電力、電信設(shè)施,具有地名意義的紀(jì)念地、旅游勝地,具有地名意義的建筑物、構(gòu)筑物,具有地名意義的單位9大類數(shù)據(jù)。其數(shù)據(jù)庫表結(jié)構(gòu)含有地名地址名稱、地理坐標(biāo)X值、地理坐標(biāo)Y值、地名地址類型、所屬行政區(qū)劃等基本字段和其他擴充信息。
隨著社會各部門信息化水平的提高,各種業(yè)務(wù)數(shù)據(jù)、統(tǒng)計數(shù)據(jù)及其他數(shù)據(jù)急劇增加,大多數(shù)的業(yè)務(wù)數(shù)據(jù)與地理位置都有著緊密的聯(lián)系,而通過GIS實現(xiàn)對業(yè)務(wù)數(shù)據(jù)的管理也逐漸成為一種被大家認(rèn)同的趨勢。地名查詢定位是GIS應(yīng)用中的一個常用功能,它借助于基礎(chǔ)地名地址庫中的位置信息,采用模糊匹配的地名查詢方法,實現(xiàn)地名數(shù)據(jù)空間位置與業(yè)務(wù)數(shù)據(jù)的關(guān)聯(lián)。因此,本文的地名搜索插件主要包括兩大功能:
1)根據(jù)給定的地名查詢條件,從地名地址數(shù)據(jù)庫中篩選出符合條件的地名并顯示輸出。
2)根據(jù)所查詢地名所對應(yīng)的地理坐標(biāo)實現(xiàn)在地圖上的定位。
QGIS是開源桌面 GIS,除了核心功能以外,QGIS還支持插件擴展。核心插件(core plugins)由QGIS開發(fā)組維護(hù),包含在所有的QGIS發(fā)行版中;外部插件(external plugins)由愛好者們開發(fā),由核心插件plugin installer加載。QGIS支持C++和Python兩種語言進(jìn)行插件開發(fā)。由于Python是一種簡單易學(xué)、功能強大的編程語言,有高效率的高層數(shù)據(jù)結(jié)構(gòu),能簡單而有效地實現(xiàn)面向?qū)ο缶幊蹋襊ython簡潔的語法和對動態(tài)輸入的支持,再加上解釋性語言的本質(zhì),使得它在大多數(shù)平臺上的很多領(lǐng)域都是一個理想的腳本語言,特別適用于快速的應(yīng)用程序開發(fā)[2],所以本文選擇采用 Python和 PyQt進(jìn)行地名搜索插件的開發(fā)。
QGIS的插件開發(fā)通常需要經(jīng)過環(huán)境配置、Qt GUI資源準(zhǔn)備、代碼編寫和插件測試4個環(huán)節(jié),本文將詳細(xì)介紹各環(huán)節(jié)的具體內(nèi)容。
首先,為創(chuàng)建GUI做好準(zhǔn)備工作,即先進(jìn)行開發(fā)環(huán)境的配置工作,包括在Windows操作系統(tǒng)下安裝Python2.5.1、Pywin32-216.win32-Py2.5、PyQt-Py2.5-gpl-4.7.3-1、QGIS-OSGeo4W-1.7.0-b55a00e73-Setup等QGIS、Python、Qt、PyQt開發(fā)工具;然后準(zhǔn)備測試地名地址數(shù)據(jù)庫(數(shù)據(jù)庫名為allpoint.mdb,地名地址表含地名、Coor_X、Coor_Y)和相應(yīng)的測試數(shù)據(jù)。
1)編譯工具圖標(biāo)。根據(jù)工具圖標(biāo),使用PyQt的資源編譯器pyrrc4命令行pyrcc4-o resources.py resource.qrc,生成描述資源的 Python文件(resources.py)。
2)設(shè)計對話框。使用Qt Designer創(chuàng)建對話框和主窗口中的輸入框、文字標(biāo)簽、表格及命令按鈕等部件,并定義它們的大小、位置等屬性,最后使用PyQt的pyuic4命令行將對話框轉(zhuǎn)換到Python文件(ui_searchbypoi.py)。
3)創(chuàng)建初始化文件(__init__.py)和實現(xiàn)類文件(searchbypoidialog.py,searchbypoi_gui.py,searchbypoi.py)。所有文件結(jié)構(gòu)如圖1所示。
圖1 開發(fā)文件列表
4)設(shè)置插件存放路徑。在Window的C:Program FilesQuantum GISWroclawappsqgispythonplugins或 C:Documents and Settings(user).qgispythonplugins路徑下創(chuàng)建一個子目錄(searchbypoi),將上述所有創(chuàng)建的文件拷貝至所創(chuàng)建的子目錄下。QGIS將Python插件和C++插件一同列在插件管理器中,方便QGIS啟動后由核心插件Plugin Installer自動加載。
在各實現(xiàn)類文件中編寫代碼,其中主要功能由searchbypoi_gui.py的兩個內(nèi)部函數(shù)(SearchFromDB和LocateMap)實現(xiàn)。示例代碼如下
完成代碼編寫后,可以關(guān)閉并重新啟動QGIS,導(dǎo)入筆者開發(fā)的插件,并輸入查詢字符串進(jìn)行測試,查詢定位效果截屏如圖2所示。同時,也可以將開發(fā)好的插件發(fā)布到QGIS插件庫中,使其成為QGIS資源庫的一部分,為開源GIS貢獻(xiàn)自己的一部分力量。
圖2 地名搜索與定位
不同于商業(yè)GIS軟件,開源GIS軟件無需背負(fù)數(shù)據(jù)兼容、易用性、軟件成本等問題的包袱,開發(fā)者能夠?qū)⒕杏诠δ艿拈_發(fā)。因此,開源GIS軟件功能普遍很強,技術(shù)也非常先進(jìn),其背后是來自技術(shù)狂熱者和學(xué)院研究者的大力支持。QGIS以其擁有的幾十個核心插件和大量的外部插件,為各個領(lǐng)域的地理信息應(yīng)用提供了強大的支持。本文在PyQt環(huán)境下,利用Python作為開發(fā)語言,通過訪問地名地址數(shù)據(jù)庫,開發(fā)了一個簡單實用的地名搜索插件,是對我國開源GIS開發(fā)應(yīng)用層次與國際接軌的一次探索,同時也對開發(fā)人員采用此技術(shù)路線,改進(jìn)地名搜索算法或利用地名搜索服務(wù)來實現(xiàn)類似功能提供了參考解決方案。
[1]SHERMAN G E.Desktop GIS:Mapping the Planet with Open Source Tools[M].USA:Pragmatic Bookshelf,2008.
[2]SUMMERFIELD M.Rapid GUI Programming with Python and Qt[M].USA:Prentice Hall,2007.
[3]陳杰.GIS的開源夜宴[J].軟件世界,2006(20):38.