莊亞飛,李素敏
?
基于Python的ArcGIS數(shù)據(jù)屬性值順序碼處理研究
莊亞飛1,李素敏2
(1. 昆明理工大學(xué) 國土資源工程學(xué)院,云南 昆明 650093;2. 昆明理工大學(xué) 國土資源工程學(xué)院,云南 昆明 650093)
在進(jìn)行空間數(shù)據(jù)的處理時,會遇到許多重復(fù)性的操作,為了簡化工作流程,提高工作效率,此時,作為 ArcGIS 的腳本工具的 Python 語言就發(fā)揮了重要的作用。在ArcGIS中,通過程序擴(kuò)展設(shè)計來進(jìn)行數(shù)據(jù)自動化處理是非常有用的,大量數(shù)據(jù)的處理可以通過Python腳本語言來進(jìn)行具體實現(xiàn),腳本編程的主要目的是使枯燥的數(shù)據(jù)處理工作自動化。本文以云南省地質(zhì)環(huán)境信息化建設(shè)項目為依托,在分析Python腳本語言特點(diǎn)的基礎(chǔ)上,介紹在ArcGIS下,利用Python腳本語言來進(jìn)行數(shù)據(jù)屬性值順序碼快速、高效的檢查、更新及處理的方法,實現(xiàn)要素數(shù)據(jù)屬性值順序碼重復(fù)值的批量處理。
Python;ArcGIS;ArcPy;數(shù)據(jù)處理;順序碼
ArcGIS 9.0 社區(qū)中引入了Python,使用Python和ArcPy站點(diǎn)包,可以開發(fā)出大量用于處理地理數(shù)據(jù)的實用程序,能夠?qū)崿F(xiàn)空間數(shù)據(jù)的批量自動化 處理[1,2]。
在進(jìn)行地理數(shù)據(jù)處理時,為了減少工作強(qiáng)度,簡化工作程序,尋求批量處理方法極為重要[3]。ArcGIS提供了許多高效的批處理工具,這在實際工作中具有重大的意義,然而,實際工作十分復(fù)雜,只靠ArcGIS 提供的批處理工具無法滿足生產(chǎn)需要,此時,作為ArcGIS的腳本工具的Python腳本語言就發(fā)揮了重要的作用[4]。通過導(dǎo)入ArcPy站點(diǎn)包便可以使用Python訪問ArcToolBox中幾乎所有的地理處理工具,針對實際的問題,利用Python開發(fā)腳本程序,方便實用、效率高,可以最大程度 地提高工作效率,在實際的工作中具有重要的應(yīng)用價值[5-7]。
本文首先對ArcPy及Python做一些簡單的介紹,依據(jù)云南省地質(zhì)環(huán)境信息化建設(shè)項目,在ArcGIS二次開發(fā)的基礎(chǔ)上,根據(jù)實際工作需求,利用Python語言編寫具體的腳本,對要素數(shù)據(jù)進(jìn)行快速而準(zhǔn)確的檢查、更新及處理,得到要素數(shù)據(jù)的屬性值順序碼。
Python是一種不受局限、跨平臺的開源編程語言,它功能強(qiáng)大且簡單易學(xué),因而得到了廣泛應(yīng)用和支持[8-10]。
辛兵廠、王來強(qiáng)等[11]將Python與ArcPy運(yùn)用于第一次全國地理國情普查,實現(xiàn)了CC碼批量賦值、數(shù)據(jù)的裁剪、高程帶與坡度帶分級數(shù)據(jù)的提取,最后采用PyCharm平臺環(huán)境,實現(xiàn)了工具的可視化。
孫咸磊、許捍衛(wèi)、李文博[12]在進(jìn)行南京長江河道水下空間數(shù)據(jù)處理時,利用ArcPy實現(xiàn)了數(shù)據(jù)屬性字段的批量處理、批量定義空間投影坐標(biāo)系、批量進(jìn)行等深線的拼接,利用ArcPy封裝好的處理函數(shù)以及Python自身具備的語法簡潔的特點(diǎn),簡單、快捷地進(jìn)行了南京長江河道水下地形數(shù)據(jù)的批量處理。
方圣輝、張玉賢等[13]以原始DEM影像插值生成特定空間分辨率的DEM影像為例,利用Python腳本語言,導(dǎo)入模塊并檢索特定擴(kuò)展模塊許可,利用For循環(huán)遍歷rts柵格數(shù)據(jù)列表,依次對每個柵格數(shù)據(jù)提取等高線,從而生成TIN數(shù)據(jù)集,最后利用生成的TIN數(shù)據(jù)集,通過具體的Python腳本程序,生成特定空間分辨率的柵格影像。
在日常的空間地理數(shù)據(jù)處理中,一般將Python語言具有的普通及常用功能與ArcPy開發(fā)包特有的數(shù)據(jù)處理功能結(jié)合起來使用,可以有效、快速地處理地理空間數(shù)據(jù)[14-15]。
在實際的工作中,需要根據(jù)不同的情況,不同的方法來處理ArcGIS數(shù)據(jù),下面以云南省地質(zhì)環(huán)境信息化建設(shè)項目中的數(shù)據(jù)為依據(jù),以數(shù)據(jù)處理中遇見的實際問題為例,給出要素數(shù)據(jù)屬性值順序碼重復(fù)值的處理流程以及具體的實現(xiàn)過程。
在進(jìn)行水系、道路、圖斑要素數(shù)據(jù)的屬性值順序碼處理時,要素數(shù)據(jù)的屬性值順序碼中存在很多重復(fù)的值,由于要素數(shù)據(jù)數(shù)量巨大,人工改正顯得不切實際。本文利用Python腳本語言,針對此問題編寫一套程序,對要素數(shù)據(jù)屬性值中順序碼的重復(fù)值進(jìn)行批檢查和處理[16-17],具體的要素數(shù)據(jù)屬性值順序碼重復(fù)值的處理流程如圖1所示。
圖1 順序碼處理流程
(1)設(shè)置工作路徑以及列出所設(shè)置的工作空間中的所有工作空間:
arcpy.env.workspace=r'F:ggg'
ii=arcpy.ListWorkspaces()
(2)列出需要處理的要素數(shù)據(jù)集并對要素數(shù)據(jù)集進(jìn)行循環(huán):
ff=["HydDataset","LcrDataset","TraDataset"]
for f in ff:
(3)如果要素名稱不是"UN_LLKL",對要素數(shù)據(jù)進(jìn)行更新,并按行對數(shù)據(jù)進(jìn)行循環(huán):
if l!="UV_LLKL":
dd=arcpy.UpdateCursor(str(s)+"\"+f+"\"+l)
for d in dd:
(4)圖層中不是以53開頭的數(shù)據(jù)的選擇:
hh=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""FEATID" not like '53%'")
(5)對要素類進(jìn)行搜索,并按行進(jìn)行循環(huán):
ss=arcpy.SearchCursor(l)
for i in ss:
(6)設(shè)置空數(shù)組,對數(shù)組進(jìn)行循環(huán),計算每個值在數(shù)組中出現(xiàn)的次數(shù):如果出現(xiàn)的次數(shù)大于1,則追加到數(shù)組pac1中:
pac1=[]
for j in pa:
cc=pa.count(j)
if cc>1:
pac1.append(j)
(7)選擇數(shù)組pac1中出現(xiàn)的值,并進(jìn)行更新:
hh=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""FEATID"='"+j+"'")
ff=arcpy.UpdateCursor(hh)
(8)設(shè)置要素數(shù)據(jù)屬性值順序碼,值為最大值加1
mx=(int(mx))+1
f.setValue("FEATID",int(mx))
本編碼主要實現(xiàn)兩個方面的功能,一是對要素數(shù)據(jù)中不是以53開頭數(shù)據(jù)的處理,另一方面是對要素數(shù)據(jù)屬性值順序碼重復(fù)值的處理。
(1)導(dǎo)入模塊,設(shè)置路徑,列文件夾并對文件夾進(jìn)行循環(huán),代碼如下:
import arcpy
arcpy.env.workspace=r'F:ggg'
ii=arcpy.ListWorkspaces()
for i in ii:
(2)要素數(shù)據(jù)中不是以53開頭數(shù)據(jù)的處理:
arcpy.env.workspace=i #當(dāng)前路徑
s=arcpy.env.workspace #當(dāng)前路徑
ff=["HydDataset","LcrDataset","TraDataset"] #要素數(shù)據(jù)集
for f in ff: #對要素數(shù)據(jù)集進(jìn)行循環(huán)
arcpy.env.workspace=str(s)+"\"+f #設(shè)置當(dāng)前路徑
ll=arcpy.ListFeatureClasses() #列出當(dāng)前路徑下所有要素類
for l in ll: #循環(huán)列出的要素類
pac=[] #設(shè)置空的數(shù)組
if l!="UV_LLKL": #如果要素名稱不是UN_LLKL
dd=arcpy.UpdateCursor(str(s)+"\"+f+"\"+l) #對數(shù)據(jù)進(jìn)行更新
for d in dd: #對數(shù)據(jù)按行進(jìn)行循環(huán)
mm=d.getValue ("FEATID") #得到要素數(shù)據(jù)屬性值順序碼
if not mm in pac: #如果這個值不在數(shù)組中
pac.append(mm) #則追加到數(shù)組pac中
mx=max(pac) #取出pac數(shù)組中的最大值
layer=arcpy.MakeFeatureLayer_management(str(s)+"\"+f+"\"+l) #創(chuàng)建圖層
hh=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""FEATID" not like '53%'") #選擇圖層中不是以53開頭的數(shù)據(jù)
jj=arcpy.UpdateCursor(hh) #對選擇出來的數(shù)據(jù)進(jìn)行更新
for j in jj: #對數(shù)據(jù)按行進(jìn)行循環(huán)
mx=(int(mx))+1
j.setValue("FEATID",int(mx)) #設(shè)置要素數(shù)據(jù)屬性值順序碼,值為最大值加1
jj.updateRow(j) #更新數(shù)據(jù)
(3)要素數(shù)據(jù)屬性值順序碼重復(fù)值的處理:
pa=[] #設(shè)置空的數(shù)組pa
ss=arcpy.SearchCursor(l) #對要素類進(jìn)行搜索
for i in ss: #按行對要素類進(jìn)行循環(huán)
m=i.getValue("FEATID") #要素數(shù)據(jù)屬性值順序碼
pa.append(m) #將唯一標(biāo)識值追加到數(shù)組pa中
mx=max(pa) #取數(shù)組pa中要素數(shù)據(jù)屬性值順序碼的最大值
pac1=[] #設(shè)置空的數(shù)組pca1
for j in pa: #對數(shù)組pa進(jìn)行循環(huán)
cc=pa.count(j) #計算每個值在數(shù)組pa中出現(xiàn)的次數(shù)
if cc>1: #如果出現(xiàn)的次數(shù)大于1
pac1.append(j) #則追加到數(shù)組pac1中
layer=arcpy.MakeFeatureLayer_management(str(s)+"\"+f+"\"+l) #創(chuàng)建圖層
for j in pac1: #循環(huán)數(shù)組pac1
hh=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""FEATID"='"+j+"'") #選擇數(shù)組pac1中出現(xiàn)的值
ff=arcpy.UpdateCursor(hh) #對數(shù)組pca1中出現(xiàn)的值進(jìn)行更新
gg=[] #定義空的數(shù)組
for f in ff: #循環(huán)需要更新的數(shù)據(jù)
s=f.getValue("FEATID") #得到要素數(shù)據(jù)屬性值順序碼
if not s in gg: #如果得到的要素數(shù)據(jù)屬性值順序碼不在數(shù)組gg中
gg.append(s) #則將得到的要素數(shù)據(jù)屬性值順序碼追加到數(shù)組gg中
else: #如果得到的要素數(shù)據(jù)屬性值順序碼在數(shù)組gg中
mx=(int(mx))+1
f.setValue("FEATID",int(mx)) #設(shè)置要素數(shù)據(jù)屬性值順序碼,值為最大值加1
ff.updateRow(f) #對數(shù)據(jù)進(jìn)行更新
print I #打印,目的是顯示需要處理的一個圖層已經(jīng)處理完成
以云南省昆明市五華區(qū)部分道路數(shù)據(jù)為例,代碼運(yùn)行前后數(shù)據(jù)對比如圖(a)、(b)所示。
圖(a)代碼運(yùn)行前數(shù)據(jù)
Fig (a) Code before running data
圖(b)代碼運(yùn)行后數(shù)據(jù)
Fig (b) Code after running data
代碼運(yùn)行結(jié)束后,通過數(shù)據(jù)處理前后對比分析,此程序能夠?qū)σ財?shù)據(jù)屬性值順序碼重復(fù)值進(jìn)行很好的處理。在要素數(shù)據(jù)屬性值順序碼重復(fù)值處理時,首先對要素數(shù)據(jù)進(jìn)行更新和循環(huán),其次計算每個值在數(shù)組中出現(xiàn)的次數(shù)。通過圖(a)、(b)可知,值出現(xiàn)次數(shù)大于一的要素數(shù)據(jù)順序碼,處理過程按行進(jìn)行處理,其中重復(fù)值為當(dāng)前的最大值加一,最終依次完成要素數(shù)據(jù)順序碼重復(fù)值的處理,與設(shè)計的程序本身相符合。
ArcGIS數(shù)據(jù)屬性值的處理任務(wù)繁瑣而復(fù)雜,重復(fù)性的操作也給工作人員帶來了一定的壓力和挑戰(zhàn),通過采用Python語言編寫程序,可以定向的實現(xiàn)一些批處理功能,簡化操作步驟,在數(shù)據(jù)處理工作方面有很重要的現(xiàn)實意義。
本文通過具體的Python腳本程序,介紹了Python在ArcGIS數(shù)據(jù)屬性值順序碼重復(fù)值處理方面的應(yīng)用,實現(xiàn)了一系列地理數(shù)據(jù)的批處理功能,其中包括對要素數(shù)據(jù)集的循環(huán)、更新以及對要素數(shù)據(jù)屬性值順序碼重復(fù)值的批處理。實驗結(jié)果表明,本文所設(shè)計的Python腳本程序能夠?qū)σ財?shù)據(jù)屬性值中順序碼重復(fù)值進(jìn)行很好的處理,提高了數(shù)據(jù)處理的速度與效率。
[1] 曹斌. 基于ArcPy的矢量數(shù)據(jù)批處理方法研究[J]. 科技創(chuàng)新與應(yīng)用, 2017(21): 90-90.
[2] 巨擘. ArcGIS中應(yīng)用Python腳本提高數(shù)據(jù)生產(chǎn)力的研究[J]. 測繪技術(shù)裝備, 2017, 19(3): 12-14.
[3] 彭海波, 向洪普. 基于Python的空間數(shù)據(jù)批量處理方法[J]. 測繪與空間地理信息, 2011, 34(4): 81-82.
[4] 李強(qiáng), 白建榮, 李振林,等. 基于Python的數(shù)據(jù)批處理技術(shù)探討及實現(xiàn)[J]. 地理空間信息, 2015(2): 54-56.
[5] PaulA. Zandbergen, 贊德伯根, 李明巨, 等. 面向ArcGIS的Python腳本編程[M]. 人民郵電出版社, 2014.
[6] Wesley Chun. Python核心編程: 第3版[M]. 人民郵電出版社, 2016.
[7] 朱道強(qiáng), 關(guān)海濤. Python在ArcGIS中的應(yīng)用[J]. 測繪與空間地理信息, 2013, f36(7): 152-154.
[8] 石晶, 郭子珍, 李小勇. ARCGIS中應(yīng)用Python腳本進(jìn)行空間數(shù)據(jù)批量處理的研究與實現(xiàn)[J]. 河南科技, 2012(21): 60-61.
[9] Eric Pimpler. Programming ArcGIS 10.1 with Python Cookbook[M]. Birmingham: Packt, 2013.
[10] 邵保華, 田學(xué)志. 談Pytho在Arcgis地理處理中的應(yīng)用[J]. 林業(yè)勘查設(shè)計, 2012(2): 99-100.
[11] 辛兵廠, 王來強(qiáng), 張朝坤. 淺談Python在地理國情普查數(shù)據(jù)處理中的應(yīng)用[J]. 測繪與空間地理信息, 2014, 37(06): 108-110.
[12] 孫咸磊, 許捍衛(wèi), 李文博. ArcPy在長江河道水下空間數(shù)據(jù)批量處理中的應(yīng)用[J]. 測繪與空間地理信息, 2015(2): 97-99.
[13] 方圣輝, 張玉賢, 佃袁勇,等. 基于Python的ArcGIS地理數(shù)據(jù)批處理[J]. 測繪與空間地理信息, 2015(1): 1-2.
[14] 焦華. 基礎(chǔ)編程的思考方法[J]. 軟件, 2018, 39(3): 57-62.
[15] 胡蝶, 趙璞, 陳明爽, 等. 多源空間矢量數(shù)據(jù)一致性處理技術(shù)探討[J]. 軟件, 2016, 37(4): 13-17.
[16] 謝華成, 馬學(xué)文. MongoDB 數(shù)據(jù)庫下文件型數(shù)據(jù)存儲研究[J]. 軟件, 2015, 36(11): 12-14.
[17] 嚴(yán)元, 王海嬰. 雷電信息綜合處理平臺中高速數(shù)據(jù)處理的設(shè)計與實現(xiàn)[J]. 軟件, 2012, 33(12): 91-92.
Python-Based ArcGIS Data Attribute Value Sequential Code Processing
ZHUANG Ya-fei1, LI Su-min2
(1. Faculty of Land Resources Engineering, Kunming University of Science and Technology, Kunming, Yunnan Province 650093; 2. Faculty of Land Resources Engineering, Kunming University of Science and Technology, Kunming, Yunnan Province 650093)
In the process of spatial data processing, many repetitive operations are encountered. In order to simplify the workflow and improve work efficiency, the Python language, as a scripting tool for ArcGIS, plays an important role. In ArcGIS, it is very useful to automate data processing by program extension design. A large number of data processing can be implemented through the Python scripting language. The main purpose of the script programming is to automate the boring data processing work. Based on the information construction project of geological environment in Yunnan Province, based on the analysis of the characteristics of the Python script language, this paper introduces the method of checking, updating and processing the data attribute value sequence code fast and efficiently with the Python scripting language under the ArcGIS.
Python; ArcGIS; ArcPy; Data processing; Sequence code
P208
A
10.3969/j.issn.1003-6970.2018.07.014
莊亞飛(1990-),男,研究生,主要研究方向:3S集成與應(yīng)用;李素敏(1977-),女,副教授,主要研究方向:遙感原理及應(yīng)用、變形監(jiān)測數(shù)據(jù)處理、數(shù)字礦山、土地生態(tài)。
本文著錄格式:莊亞飛,李素敏. 基于Python 的ArcGIS 數(shù)據(jù)屬性值順序碼處理研究[J]. 軟件,2018,39(7): 68-?71