曹霸,陳興亞,黃冰清,王洪波,盧鵬*
(1.貴州林業(yè)勘察設(shè)計(jì)有限公司,貴州 貴陽 550003;2.貴州省林業(yè)調(diào)查規(guī)劃院)
基于Python的營造林?jǐn)?shù)據(jù)驗(yàn)收方法
曹霸1,陳興亞2,黃冰清2,王洪波1,盧鵬2*
(1.貴州林業(yè)勘察設(shè)計(jì)有限公司,貴州貴陽550003;2.貴州省林業(yè)調(diào)查規(guī)劃院)
本文簡要介紹了Python語言,并對貴州省營造林?jǐn)?shù)據(jù)驗(yàn)收流程中使用到的ArcGIS圖形檢查工具利用Python語言進(jìn)行集成,生成自定義工具,利用這個工具對營造林?jǐn)?shù)據(jù)進(jìn)行檢查驗(yàn)收,在一定程度上提高了數(shù)據(jù)檢查驗(yàn)收的工作效率。
Python;ArcGIS;腳本工具;營造林?jǐn)?shù)據(jù);驗(yàn)收方法
Python是一種面向?qū)ο?、語法清晰、開源的腳本語言,從簡單的到復(fù)雜的腳本任務(wù),從獨(dú)立的到復(fù)雜的應(yīng)用程序都可以實(shí)現(xiàn)。地理信息系統(tǒng)經(jīng)過30多年的發(fā)展,其應(yīng)用領(lǐng)域已經(jīng)深入到各行各業(yè)。地理信息系統(tǒng)的快速發(fā)展推動了相關(guān)軟件的進(jìn)步,作為地理信息系統(tǒng)軟件中比較有代表性的軟件ArcGIS被廣泛應(yīng)用[1]。貴州省2015年?duì)I造林?jǐn)?shù)據(jù)驗(yàn)收檢查內(nèi)容多,需要利用ArcGIS多個工具對數(shù)據(jù)進(jìn)行處理,檢查工作非常繁瑣。為此,本文利用Python進(jìn)行開發(fā),對營造林?jǐn)?shù)據(jù)驗(yàn)收所用的ArcGIS工具進(jìn)行集成,生成腳本工具,在營造林?jǐn)?shù)據(jù)檢查驗(yàn)收時(shí)利用該工具,在一定程度上提高了工作效率。
Python于1991年第一次公開發(fā)行,從而是一門優(yōu)秀的腳本語言[2]。圖1展示了Python的優(yōu)點(diǎn)。
營造林?jǐn)?shù)據(jù)驗(yàn)收主要包括兩個部分:屬性檢查和圖形檢查。其中屬性檢查主要在Access里檢查,本文不詳細(xì)敘述。圖形檢查是在ArcGIS中進(jìn)行檢查,檢查的內(nèi)容包括數(shù)據(jù)庫字段結(jié)構(gòu)比較、拓?fù)錂z查、多部件檢查、重號檢查和縫隙檢查,見圖2。
圖1 Python優(yōu)點(diǎn)
其中,字段比較是對每個縣的檢查數(shù)據(jù)和模板數(shù)據(jù)的數(shù)據(jù)庫結(jié)構(gòu)進(jìn)行比較,以保證后期對全省數(shù)據(jù)進(jìn)行合庫時(shí)每個縣的庫結(jié)構(gòu)相同;拓?fù)錂z查是對營造林?jǐn)?shù)據(jù)進(jìn)行拓?fù)浞治?,防止小班圖層存在自身重疊和相互重疊;多部件檢查是為了防止小班圖層存在多部件;重號檢查是為了保證小班圖層無重號;縫隙檢查是為了保證小班與小班之間不存在縫隙,縫隙最小為100m2。
根據(jù)圖形檢查的內(nèi)容,利用ArcGIS自帶的Python腳本編輯器,實(shí)現(xiàn)字段比較、拓?fù)錂z查、多部件檢查、重號檢查和縫隙檢查。
3.1字段比較
字段比較工具包括9個參數(shù):模板表、數(shù)據(jù)表、排序字段、比較類型、忽略類型、屬性容差、忽略字段、是否連續(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)行語句如下:
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查包括兩個內(nèi)容:小班圖層自身重疊和小班圖層之間的相互重疊。主要為創(chuàng)建拓?fù)?、添加要素到拓?fù)洹⑻砑訉傩缘酵負(fù)浜万?yàn)證拓?fù)?。具體語句如下:
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)建一個新的字段,然后把OBJECT字段的值賦給這個字段;其次,對小班圖層使用MultipartToSinglepart工具炸開多部件;最后,對炸開后的圖層屬性表統(tǒng)計(jì)第一步新建的字段,如果有數(shù)量大于等于2的記錄,則說明圖層中存在多部件。具體語句如下:
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重號檢查
本次營造林?jǐn)?shù)據(jù)驗(yàn)收中重號檢查用的字段為上報(bào)年度、項(xiàng)目名稱、村代碼和內(nèi)業(yè)小班號。在重號檢查時(shí)先對這四個字段進(jìn)行運(yùn)算生成唯一編號,然后再對唯一編號進(jìn)行統(tǒng)計(jì)。如果唯一編號數(shù)量大于等于2則說明小班圖層中有重號,就需要對重號小班重新編號,直到屬性表中每個記錄都是唯一。具體語句如下所示:
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_重號_frequency","aa")
3.5縫隙檢查
縫隙檢查首先利用縣面圖層對小班圖層進(jìn)行擦除,然后利用工具M(jìn)ultipart to Singlepart炸開擦除后的圖層,最后計(jì)算炸開圖層中每個小班的面積。如果小班的面積小于100m2,則這個小班就是縫隙,就要排查產(chǎn)生縫隙的原因并進(jìn)行修改。具體語句如下所示:
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ù)洳樵?、多部件檢查、重號查詢和縫隙查詢功能后,進(jìn)一步把這些功能集成為一個工具。
在ArcGIS的腳本編輯器完成代碼編寫后,在ArcGIS中進(jìn)一步把代碼集成為一個工具,方便檢查人員的使用。具體流程如下:
(1)在Catalog中,選擇Toolboxes,新建一個Toolbox。
(2)選擇Toolbox,單擊右鍵,選擇add→script,設(shè)置合適的工具名字和標(biāo)準(zhǔn),點(diǎn)擊下一步,選擇script file,即上面編寫的Python腳本,點(diǎn)擊下一步,輸入display name和data type,這里選擇數(shù)據(jù)驗(yàn)收數(shù)據(jù)庫和模板數(shù)據(jù)庫,data type為 workspace or Feature,點(diǎn)擊Finish即可生成新的工具。
(3)雙擊生成的工具,如圖3所示,選擇驗(yàn)收數(shù)據(jù)庫和模板數(shù)據(jù)庫,點(diǎn)擊OK。
運(yùn)行過程如圖4所示,運(yùn)行時(shí)間為70 s左右。如果直接利用ArcGIS,涉及到多個工具,輸入?yún)?shù)多,根據(jù)實(shí)際情況,檢查一個縣的營造林?jǐn)?shù)據(jù)需要40min左右;通過應(yīng)用腳本工具,僅需要15min左右,這樣就在一定程度上提高了工作效率。
生成的結(jié)果如圖5所示,具體結(jié)果包括字段比較結(jié)果、拓?fù)錂z查結(jié)果、多部件檢查結(jié)果、重號檢查結(jié)果、縫隙檢查結(jié)果以及每項(xiàng)檢查的中間結(jié)果,通過分析即可得到數(shù)據(jù)檢查驗(yàn)收的結(jié)果,判斷數(shù)據(jù)是否合格。
本文根據(jù)貴州省營造林?jǐn)?shù)據(jù)驗(yàn)收遇到的問題,結(jié)合Python和ArcGIS進(jìn)行腳本語言的編寫,自定義了圖形數(shù)據(jù)檢查工具,在一定程度上降低了工作量,提高了檢查效率。但是也存在不足之處,后續(xù)可以在本文的基礎(chǔ)上繼續(xù)改進(jìn),使它對于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)也可以進(jìn)行檢查驗(yàn)收。
圖3 數(shù)據(jù)驗(yàn)收工具
圖4 腳本工具運(yùn)行過程圖
圖5 Python運(yùn)行生成的結(jié)果
[1]潘雪婷.基于Python的控件分析模型的實(shí)現(xiàn)[D].北京:中國地質(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)號)、云南省教育廳項(xiàng)目(2014J100)、貴州省林業(yè)科研課題(黔林科合J字[2013](4)號)。
曹霸(1989-),男,碩士,主要從事林業(yè)3S技術(shù)與應(yīng)用研究工作。E-mail:cl98904@163.com
盧鵬(1983-),男,高級工程師,主要從事林業(yè)信息技術(shù)應(yīng)用方向工作。E-mail:158263077@qq.com