張世富
(菏澤學(xué)院, 山東 菏澤, 274000)
GIS(地理信息系統(tǒng))不僅要完成管理大量復(fù)雜的地理數(shù)據(jù)的任務(wù),更為重要的是完成地理分析評價預(yù)測和輔助決策的任務(wù)[1],空間分析是GIS最具特色的內(nèi)容,建立空間分析模型的過程(空間分析建模)是綜合分析處理和應(yīng)用空間數(shù)據(jù)的有效手段,也是開發(fā)分析決策型GIS不可或缺的步驟[2]。
ArcGIS的Model Builder視窗提供了構(gòu)建地理處理工作流和腳本的圖形化建模環(huán)境[3],但是進(jìn)行空間分析建模有其不足之處:首先,在進(jìn)行數(shù)據(jù)批量化處理時操作復(fù)雜、處理速度緩慢而且運(yùn)行不穩(wěn)定。其次,在Model Builder中建模無法對空間分析結(jié)果進(jìn)行統(tǒng)計以及進(jìn)行必要的計算。
本文使用Python編程語言以及ArcGIS10.0中新添加的ArcPy工具包中的各種函數(shù)以函數(shù)式編程的方法[4]進(jìn)行空間分析建模。以多邊形矢量圖層的矢量-柵格疊置分析并計算其吻合度為例闡述基于Python與ArcPy的GIS空間分析建模原理及其實現(xiàn)方法。
Python[5]是一種底層基于C語言實現(xiàn)的腳本語言,但其已從Linux平臺上的一個腳本語言發(fā)展成為跨操作系統(tǒng)多種底層實現(xiàn)的通用語言,并且可以實現(xiàn)對既有的C/C++庫調(diào)用,大大豐富了Python的功能[6]。Python 具有以下特點(diǎn):1)簡單易學(xué)、免費(fèi)開源;2)跨平臺的解釋性高級語言,具有很強(qiáng)的健壯性[7];3)可擴(kuò)展的面向?qū)ο缶幊陶Z言;4)ArcGIS主要支持。
Arcpy是Arcgis10中新的Python庫,包含有函數(shù)(Function)、類(Class)和模塊(Module),可以實現(xiàn)的功能有:能訪問所有GP工具;可以進(jìn)行數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理;數(shù)據(jù)分析;并實現(xiàn)自動化制圖。
基于Python與ArcPy的GIS空間分析建模是通過Python調(diào)用ArcPy中的各種函數(shù)、類和模塊來實現(xiàn)各種空間分析功能,以函數(shù)式編程的方法[4]實現(xiàn)對數(shù)據(jù)的空間分析。本文使用該方法實現(xiàn)空間數(shù)據(jù)的矢量柵格疊置分析,以基于對象的影像最優(yōu)分割結(jié)果選取為例來闡述基于Python與ArcPy的GIS空間分析建模的實現(xiàn)方法。
近年來,基于對象影像分析(OBIA)已經(jīng)發(fā)展成為遙感影像處理領(lǐng)域中的一個新范式?;趯ο笥跋穹治鎏幚淼膯卧辉偈菃蝹€的像元,而是通過影像分割產(chǎn)生的影像對象。因此,影像分割的質(zhì)量對影像分類以及分類結(jié)果的精度有決定性的影響。差異性分析法是目前主要的影像分割質(zhì)量評價方法,是將分割結(jié)果與已有樣區(qū)數(shù)據(jù)進(jìn)行對比,比較差異,主要度量方法有基于區(qū)域范圍度量、基于邊界位置度量和混合度量[8]。
本文將使用基于區(qū)域范圍的度量方法以函數(shù)式編程的方法進(jìn)行GIS空間分析建模,選擇最優(yōu)的分割結(jié)果。
根據(jù)以上需求,將空間分析模型設(shè)計為以下幾個部分:
矢量疊置分析。由于模型需要計算分割多邊形(分割結(jié)果)與參考多邊形(已有樣區(qū)數(shù)據(jù))的面積差異,所以首先要選取匹配多邊形(與參考多邊相對應(yīng)的分割多邊形)。
矢量轉(zhuǎn)柵格。由于分割多邊形邊界是由像元邊界的合并而來,多為鋸齒狀;而參考多邊形由數(shù)字化得到,邊界較為平滑,為避免由于邊界誤差引起的面積差異而導(dǎo)致所計算出的評價指標(biāo)產(chǎn)生偏差,我們將參考數(shù)據(jù)轉(zhuǎn)換為與分割影像像元分辨率相同的柵格文件,再進(jìn)行柵格疊置分析可以得到準(zhǔn)確的面積參數(shù)。
柵格疊置分析。最終我們需要從空間分析結(jié)果中得到三個參數(shù)來計算評價指標(biāo),即重疊面積、過分割面積、欠分割面積[9],為便于數(shù)據(jù)分析,我們在矢量轉(zhuǎn)柵格時將多邊形所在區(qū)域柵格屬性賦值為1,其余賦值為0,這樣經(jīng)過柵格疊置分析就可將三部分面積區(qū)別開來。
分析結(jié)果導(dǎo)入數(shù)據(jù)庫。空間分析結(jié)束后我們將分析結(jié)果導(dǎo)入Geodatabase中以方便存儲與管理。
空間數(shù)據(jù)屬性讀取與統(tǒng)計分析??臻g分析結(jié)束后,我們需要讀取分析結(jié)果屬性表中的面積參數(shù)計算評價指標(biāo)并寫入Excel表格中,最終選取最優(yōu)的分割結(jié)果作為函數(shù)返回值反饋給用戶。具體流程如上圖所示:
1.設(shè)定模型運(yùn)行環(huán)境
以函數(shù)式編程的方法進(jìn)行空間建模,最重要的就是模型中各函數(shù)的可運(yùn)行性,在運(yùn)行模型之前首先要設(shè)定其運(yùn)行環(huán)境,包括:導(dǎo)入函數(shù)運(yùn)行所需要的各種模塊;檢測ArcPy工具包中空間分析模塊的可用性。
2.定義循環(huán)與臨時文件存儲路徑
程序中需對空間數(shù)據(jù)進(jìn)行批量處理,所以我們需要使用遍歷函數(shù)對空間數(shù)據(jù)進(jìn)行遍歷并將結(jié)果返回到一個列表中,然后我只對列表進(jìn)行操作即可。首先指定遍歷函數(shù)的工作空間,然后使用ListFiles函數(shù)對空間數(shù)據(jù)進(jìn)行遍歷。
由于空間分析過程中產(chǎn)生大量的臨時文件,使用tempfile模塊在指定路徑自動建立一個臨時文件夾,存儲空間分析過程中產(chǎn)生的臨時文件存并在程序運(yùn)行結(jié)束后刪除。
3.空間分析建模
空間分析主要包括四個部分:矢量疊置分析、矢量轉(zhuǎn)柵格、柵格疊置分析和將分析結(jié)果導(dǎo)入數(shù)據(jù)庫。
(1)矢量疊置分析
在選擇匹配多邊形時使用面積比值方法,為減少不必要的計算首先選擇與參考多邊形具有相交關(guān)系的分割多邊形,再使用面積比值進(jìn)行二次選擇。
使用SelectLayerByLocation函數(shù)對分割多邊形進(jìn)行初次選擇,然后分別計算分割多邊形與參考多邊形的面積,最后采用面積比值使用Select_analysis函數(shù)選擇匹配多邊形,即相交部分面積大于自身面積50%或大于參考多邊形面積50%的分割多邊形為匹配多邊形。
(2)矢量轉(zhuǎn)柵格
在矢量轉(zhuǎn)柵格前我們先定義一個“value”字段并賦值為1,以研究區(qū)范圍作為柵格文件的邊界,這樣在邊界范圍內(nèi)由多邊形轉(zhuǎn)換產(chǎn)生的柵格屬性為1,其余柵格屬性為0,以便于柵格疊置分析。
(3)柵格疊置分析
在矢量轉(zhuǎn)柵格過程中已經(jīng)將多邊形區(qū)域賦值為1,匹配多邊形與參考多邊形進(jìn)行相加運(yùn)算后產(chǎn)生的柵格文件的重疊面積、過分割面積與欠分割面積屬性值分別被賦值為2、1和1。然后將第一次運(yùn)算結(jié)果與分割多邊形轉(zhuǎn)換為的柵格文件相加產(chǎn)生最終柵格結(jié)果,柵格文件重疊面積、過分割面積與欠分割面積屬性值分別被賦值為3、1和2,從而可以將其區(qū)別開來。
(4)將分析結(jié)果導(dǎo)入數(shù)據(jù)庫
空間分析結(jié)束后我們使用FeatureClassToGeo database_conversion函數(shù)將分析結(jié)果導(dǎo)入Geodata base中以方便存儲與管理。
4.空間數(shù)據(jù)屬性讀取與統(tǒng)計分析
空間分析結(jié)束后,我們使用SearchCursor函數(shù)讀取分析結(jié)果屬性表中的面積參數(shù)計算評價指標(biāo)。然后使用第三方模塊pyExcelerator模塊將計算的得到的評價指標(biāo)寫入Excel表格中。
5.設(shè)置返回值并刪除臨時文件
在循環(huán)結(jié)束后我們?yōu)榍斑吽x的函數(shù)設(shè)置一個返回值,返回通過比較產(chǎn)生的最優(yōu)分割參數(shù)指標(biāo),另外所有分割結(jié)果通過分析所產(chǎn)生的評價指標(biāo)都保存在Excel表中。
在進(jìn)行批量處理過程中,由于產(chǎn)生大量臨時文件,所以在每次循環(huán)結(jié)束后要將產(chǎn)生的臨時文件刪除,我們使用shutil模塊中的rmtree函數(shù)將每次循環(huán)開始產(chǎn)生的臨時文件夾刪除。
Python作為ArcGIS主要支持的腳本語言,在GIS中已經(jīng)得到廣泛使用,特別是ArcGIS 10的Python腳本中引入新的ArcPy,使Python與ArcGIS結(jié)合得更緊密。Python可以直接調(diào)用ArcGIS中的各種分析工具與函數(shù),大大提高系統(tǒng)的運(yùn)行效率,另外,Python腳本語言簡單易學(xué)、可移植性、擴(kuò)展性強(qiáng)、而且具有極高的編程效率。相信Python會在空間分析建模中得到越來越廣泛的應(yīng)用。
[1]湯國安,趙牡丹.地理信息系統(tǒng)[M].北京:科學(xué)出版社,2000.
[2]程 滿,梁 虹,等.基于空間問題建模概念過程的空間分析建模與實現(xiàn)[J].計算機(jī)工程與設(shè)計,2007,(16).
[3]方 芳,徐世武,萬波.GIS空間分析建模技術(shù)進(jìn)展研究[J].測繪科學(xué),2010,(6).
[4]Wikipedia:Functional Programming.[EB/OL].2008-04-16.http://en.wikipedia.org/wiki/Functional_programming
[5]Python Official Documentations[EB/OL].2008-04-16.http://www.prthon.org/about/.
[6]孫 宇,蒲英霞.使用Python函數(shù)式編程進(jìn)行空間回歸分析[J].地理信息世界,2009,(6).
[7]Wesley J.Chun,宋廣吉(譯).核心編程(第二版)[M].北京:人民郵電出版社,2008.
[8]Y.J.ZHANG.A SURVEY ON EVALUATION METHODS FOR IMAGE SEGMENTATION.Pattern Rrcognition 1996,(8).
[9]張世富.寧夏中衛(wèi)黃灌區(qū)耕地時空變化及其環(huán)境經(jīng)濟(jì)效應(yīng)研究[D].蘭州:蘭州大學(xué),2012.