曹霸,陳興亞,黃冰清,王洪波,盧鵬*
(1.貴州林業(yè)勘察設(shè)計(jì)有限公司,貴州 貴陽(yáng) 550003;2.貴州省林業(yè)調(diào)查規(guī)劃院)
基于Python的營(yíng)造林?jǐn)?shù)據(jù)驗(yàn)收方法
曹霸1,陳興亞2,黃冰清2,王洪波1,盧鵬2*
(1.貴州林業(yè)勘察設(shè)計(jì)有限公司,貴州貴陽(yáng)550003;2.貴州省林業(yè)調(diào)查規(guī)劃院)
本文簡(jiǎn)要介紹了Python語(yǔ)言,并對(duì)貴州省營(yíng)造林?jǐn)?shù)據(jù)驗(yàn)收流程中使用到的ArcGIS圖形檢查工具利用Python語(yǔ)言進(jìn)行集成,生成自定義工具,利用這個(gè)工具對(duì)營(yíng)造林?jǐn)?shù)據(jù)進(jìn)行檢查驗(yàn)收,在一定程度上提高了數(shù)據(jù)檢查驗(yàn)收的工作效率。
Python;ArcGIS;腳本工具;營(yíng)造林?jǐn)?shù)據(jù);驗(yàn)收方法
Python是一種面向?qū)ο?、語(yǔ)法清晰、開(kāi)源的腳本語(yǔ)言,從簡(jiǎn)單的到復(fù)雜的腳本任務(wù),從獨(dú)立的到復(fù)雜的應(yīng)用程序都可以實(shí)現(xiàn)。地理信息系統(tǒng)經(jīng)過(guò)30多年的發(fā)展,其應(yīng)用領(lǐng)域已經(jīng)深入到各行各業(yè)。地理信息系統(tǒng)的快速發(fā)展推動(dòng)了相關(guān)軟件的進(jìn)步,作為地理信息系統(tǒng)軟件中比較有代表性的軟件ArcGIS被廣泛應(yīng)用[1]。貴州省2015年?duì)I造林?jǐn)?shù)據(jù)驗(yàn)收檢查內(nèi)容多,需要利用ArcGIS多個(gè)工具對(duì)數(shù)據(jù)進(jìn)行處理,檢查工作非常繁瑣。為此,本文利用Python進(jìn)行開(kāi)發(fā),對(duì)營(yíng)造林?jǐn)?shù)據(jù)驗(yàn)收所用的ArcGIS工具進(jìn)行集成,生成腳本工具,在營(yíng)造林?jǐn)?shù)據(jù)檢查驗(yàn)收時(shí)利用該工具,在一定程度上提高了工作效率。
Python于1991年第一次公開(kāi)發(fā)行,從而是一門(mén)優(yōu)秀的腳本語(yǔ)言[2]。圖1展示了Python的優(yōu)點(diǎn)。
營(yíng)造林?jǐn)?shù)據(jù)驗(yàn)收主要包括兩個(gè)部分:屬性檢查和圖形檢查。其中屬性檢查主要在Access里檢查,本文不詳細(xì)敘述。圖形檢查是在ArcGIS中進(jìn)行檢查,檢查的內(nèi)容包括數(shù)據(jù)庫(kù)字段結(jié)構(gòu)比較、拓?fù)錂z查、多部件檢查、重號(hào)檢查和縫隙檢查,見(jiàn)圖2。
圖1 Python優(yōu)點(diǎn)
其中,字段比較是對(duì)每個(gè)縣的檢查數(shù)據(jù)和模板數(shù)據(jù)的數(shù)據(jù)庫(kù)結(jié)構(gòu)進(jìn)行比較,以保證后期對(duì)全省數(shù)據(jù)進(jìn)行合庫(kù)時(shí)每個(gè)縣的庫(kù)結(jié)構(gòu)相同;拓?fù)錂z查是對(duì)營(yíng)造林?jǐn)?shù)據(jù)進(jìn)行拓?fù)浞治觯乐剐“鄨D層存在自身重疊和相互重疊;多部件檢查是為了防止小班圖層存在多部件;重號(hào)檢查是為了保證小班圖層無(wú)重號(hào);縫隙檢查是為了保證小班與小班之間不存在縫隙,縫隙最小為100m2。
根據(jù)圖形檢查的內(nèi)容,利用ArcGIS自帶的Python腳本編輯器,實(shí)現(xiàn)字段比較、拓?fù)錂z查、多部件檢查、重號(hào)檢查和縫隙檢查。
3.1字段比較
字段比較工具包括9個(gè)參數(shù):模板表、數(shù)據(jù)表、排序字段、比較類(lèi)型、忽略類(lèi)型、屬性容差、忽略字段、是否連續(xù)比較、比較結(jié)果輸出文件。具體參數(shù)設(shè)置如下所示:
base_table=path_base+"/"+"YZL_PY_ZLYSXB"
圖2 圖形檢查內(nèi)容圖
test_table=path_test+"/"+"YZL_PY_ZLYSXB"
sort_field="OBJECTID"
compare_type="SCHEMA_ONLY"
ignore_option="IGNORE_EXTENSION_PROPERTIES;IGNORE_SUBTYPES;IGNORE_RELATIONSHIPCLASSES"
attribute_tolerance=""
omit_field="OBJECTID;SHAPE;SHAPE_Length;SHAPE_Area;aa;aaa"
continue_compare="NO_CONTINUE_COMPARE"
compare_file=path+"/"+"zl.txt"
其中path_base,path_test分別為模板數(shù)據(jù)路徑和檢查數(shù)據(jù)路徑。
工具運(yùn)行語(yǔ)句如下:
compare_result=arcpy.TableCompare_management(base_table,test_table,sort_field,compare_type,ignore_option,attribute_tolerance,omit_field,continue_compare,compare_file)
3.2拓?fù)錂z查
拓?fù)錂z查包括兩個(gè)內(nèi)容:小班圖層自身重疊和小班圖層之間的相互重疊。主要為創(chuàng)建拓?fù)?、添加要素到拓?fù)?、添加屬性到拓?fù)浜万?yàn)證拓?fù)?。具體語(yǔ)句如下:
arcpy.CreateTopology_management(path_test," topology")
arcpy.AddFeatureClassToTopology_management(" topology","YZL_PY_ZLYSXB",1,1)arcpy.AddFeatureClassToTopology_management("topology","YZL _PY_FYYSXB",1,1)
arcpy.AddRuleToTopology_management("topology","Must Not Overlap(Area)","YZL_PY_ ZLYSXB","","","")
arcpy.AddRuleToTopology_management("topology","Must Not Overlap(Area)","YZL_PY_ FYYSXB","","","")
arcpy.AddRuleToTopology_management("topology","Must NotOverlap With(Area-Area)","YZL_PY _FYYSXB","","YZL_PY_ZLYSXB","")
arcpy.ValidateTopology_management("topology")
3.3多部件檢查
多部件檢查步驟包括三步:首先,創(chuàng)建一個(gè)新的字段,然后把OBJECT字段的值賦給這個(gè)字段;其次,對(duì)小班圖層使用MultipartToSinglepart工具炸開(kāi)多部件;最后,對(duì)炸開(kāi)后的圖層屬性表統(tǒng)計(jì)第一步新建的字段,如果有數(shù)量大于等于2的記錄,則說(shuō)明圖層中存在多部件。具體語(yǔ)句如下:
arcpy.AddField_management("YZL_PY_ ZLYSXB","aa","TEXT","","",100)arcpy.Calculate-
Field_management("YZL_PY_ZLYSXB","aa","!OBJECTID!","PYTHON")
arcpy.MultipartToSinglepart_management("YZL _PY_ZLYSXB","YZL_PY_ZLYSXB_multi")
arcpy.Frequency_analysis("YZL_PY_ZLYSXB _multi",path+"/"+"zl_multi_frequency","aa")
3.4重號(hào)檢查
本次營(yíng)造林?jǐn)?shù)據(jù)驗(yàn)收中重號(hào)檢查用的字段為上報(bào)年度、項(xiàng)目名稱(chēng)、村代碼和內(nèi)業(yè)小班號(hào)。在重號(hào)檢查時(shí)先對(duì)這四個(gè)字段進(jìn)行運(yùn)算生成唯一編號(hào),然后再對(duì)唯一編號(hào)進(jìn)行統(tǒng)計(jì)。如果唯一編號(hào)數(shù)量大于等于2則說(shuō)明小班圖層中有重號(hào),就需要對(duì)重號(hào)小班重新編號(hào),直到屬性表中每個(gè)記錄都是唯一。具體語(yǔ)句如下所示:
arcpy.AddField_management("YZL_PY_ ZLYSXB","aa","TEXT","","",100)arcpy.Calculate-Field_management("YZL_PY_ZLYSXB","WYBH","!CUN!"+"!NYJCXBH!","PYTHON")arcpy.CalculateField_management("YZL_PY_ZLYSXB","aa","!ZCSBND!"+"!XMMC!"+"!WYBH!","PYTHON")
arcpy.Frequency_analysis("YZL_PY_ZLYSXB",path+"/"+"zl_重號(hào)_frequency","aa")
3.5縫隙檢查
縫隙檢查首先利用縣面圖層對(duì)小班圖層進(jìn)行擦除,然后利用工具M(jìn)ultipart to Singlepart炸開(kāi)擦除后的圖層,最后計(jì)算炸開(kāi)圖層中每個(gè)小班的面積。如果小班的面積小于100m2,則這個(gè)小班就是縫隙,就要排查產(chǎn)生縫隙的原因并進(jìn)行修改。具體語(yǔ)句如下所示:
arcpy.Erase_analysis("縣面","YZL_PY_ ZLYSXB","YZL_PY_ZLYSXB_Era","")
arcpy.MultipartToSinglepart_management("YZL_ PY_ZLYSXB_Era","YZL_PY_ZLYSXB_Era_Mul")arcpy.CalculateAreas_stats(path_dir+"/"+" YZL_PY_ZLYSXB_Era_Mul_reproject",path_dir+"/" +"YZL_PY_ZLYSXB_Era_Mul_reproject_mj")
完成了字段比較、拓?fù)洳樵?xún)、多部件檢查、重號(hào)查詢(xún)和縫隙查詢(xún)功能后,進(jìn)一步把這些功能集成為一個(gè)工具。
在ArcGIS的腳本編輯器完成代碼編寫(xiě)后,在ArcGIS中進(jìn)一步把代碼集成為一個(gè)工具,方便檢查人員的使用。具體流程如下:
(1)在Catalog中,選擇Toolboxes,新建一個(gè)Toolbox。
(2)選擇Toolbox,單擊右鍵,選擇add→script,設(shè)置合適的工具名字和標(biāo)準(zhǔn),點(diǎn)擊下一步,選擇script file,即上面編寫(xiě)的Python腳本,點(diǎn)擊下一步,輸入display name和data type,這里選擇數(shù)據(jù)驗(yàn)收數(shù)據(jù)庫(kù)和模板數(shù)據(jù)庫(kù),data type為 workspace or Feature,點(diǎn)擊Finish即可生成新的工具。
(3)雙擊生成的工具,如圖3所示,選擇驗(yàn)收數(shù)據(jù)庫(kù)和模板數(shù)據(jù)庫(kù),點(diǎn)擊OK。
運(yùn)行過(guò)程如圖4所示,運(yùn)行時(shí)間為70 s左右。如果直接利用ArcGIS,涉及到多個(gè)工具,輸入?yún)?shù)多,根據(jù)實(shí)際情況,檢查一個(gè)縣的營(yíng)造林?jǐn)?shù)據(jù)需要40min左右;通過(guò)應(yīng)用腳本工具,僅需要15min左右,這樣就在一定程度上提高了工作效率。
生成的結(jié)果如圖5所示,具體結(jié)果包括字段比較結(jié)果、拓?fù)錂z查結(jié)果、多部件檢查結(jié)果、重號(hào)檢查結(jié)果、縫隙檢查結(jié)果以及每項(xiàng)檢查的中間結(jié)果,通過(guò)分析即可得到數(shù)據(jù)檢查驗(yàn)收的結(jié)果,判斷數(shù)據(jù)是否合格。
本文根據(jù)貴州省營(yíng)造林?jǐn)?shù)據(jù)驗(yàn)收遇到的問(wèn)題,結(jié)合Python和ArcGIS進(jìn)行腳本語(yǔ)言的編寫(xiě),自定義了圖形數(shù)據(jù)檢查工具,在一定程度上降低了工作量,提高了檢查效率。但是也存在不足之處,后續(xù)可以在本文的基礎(chǔ)上繼續(xù)改進(jìn),使它對(duì)于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)也可以進(jìn)行檢查驗(yàn)收。
圖3 數(shù)據(jù)驗(yàn)收工具
圖4 腳本工具運(yùn)行過(guò)程圖
圖5 Python運(yùn)行生成的結(jié)果
[1]潘雪婷.基于Python的控件分析模型的實(shí)現(xiàn)[D].北京:中國(guó)地質(zhì)大學(xué),2010.
[2]Wesley J.Chun著,宋吉廣譯.Python核心編程 (第二版)[M].北京:人民郵電出版社,2008.
(責(zé)任編輯:楊婷婷)
S711
A
2095-0152(2016)05-0053-03
2016-07-26
2016-08-29
貴州省林業(yè)科研課題(黔林科合[2016](03)號(hào))、云南省教育廳項(xiàng)目(2014J100)、貴州省林業(yè)科研課題(黔林科合J字[2013](4)號(hào))。
曹霸(1989-),男,碩士,主要從事林業(yè)3S技術(shù)與應(yīng)用研究工作。E-mail:cl98904@163.com
盧鵬(1983-),男,高級(jí)工程師,主要從事林業(yè)信息技術(shù)應(yīng)用方向工作。E-mail:158263077@qq.com