莊亞飛,李素敏
?
基于Python的ArcGIS數據屬性值順序碼處理研究
莊亞飛1,李素敏2
(1. 昆明理工大學 國土資源工程學院,云南 昆明 650093;2. 昆明理工大學 國土資源工程學院,云南 昆明 650093)
在進行空間數據的處理時,會遇到許多重復性的操作,為了簡化工作流程,提高工作效率,此時,作為 ArcGIS 的腳本工具的 Python 語言就發揮了重要的作用。在ArcGIS中,通過程序擴展設計來進行數據自動化處理是非常有用的,大量數據的處理可以通過Python腳本語言來進行具體實現,腳本編程的主要目的是使枯燥的數據處理工作自動化。本文以云南省地質環境信息化建設項目為依托,在分析Python腳本語言特點的基礎上,介紹在ArcGIS下,利用Python腳本語言來進行數據屬性值順序碼快速、高效的檢查、更新及處理的方法,實現要素數據屬性值順序碼重復值的批量處理。
Python;ArcGIS;ArcPy;數據處理;順序碼
ArcGIS 9.0 社區中引入了Python,使用Python和ArcPy站點包,可以開發出大量用于處理地理數據的實用程序,能夠實現空間數據的批量自動化 處理[1,2]。
在進行地理數據處理時,為了減少工作強度,簡化工作程序,尋求批量處理方法極為重要[3]。ArcGIS提供了許多高效的批處理工具,這在實際工作中具有重大的意義,然而,實際工作十分復雜,只靠ArcGIS 提供的批處理工具無法滿足生產需要,此時,作為ArcGIS的腳本工具的Python腳本語言就發揮了重要的作用[4]。通過導入ArcPy站點包便可以使用Python訪問ArcToolBox中幾乎所有的地理處理工具,針對實際的問題,利用Python開發腳本程序,方便實用、效率高,可以最大程度 地提高工作效率,在實際的工作中具有重要的應用價值[5-7]。
本文首先對ArcPy及Python做一些簡單的介紹,依據云南省地質環境信息化建設項目,在ArcGIS二次開發的基礎上,根據實際工作需求,利用Python語言編寫具體的腳本,對要素數據進行快速而準確的檢查、更新及處理,得到要素數據的屬性值順序碼。
Python是一種不受局限、跨平臺的開源編程語言,它功能強大且簡單易學,因而得到了廣泛應用和支持[8-10]。
辛兵廠、王來強等[11]將Python與ArcPy運用于第一次全國地理國情普查,實現了CC碼批量賦值、數據的裁剪、高程帶與坡度帶分級數據的提取,最后采用PyCharm平臺環境,實現了工具的可視化。
孫咸磊、許捍衛、李文博[12]在進行南京長江河道水下空間數據處理時,利用ArcPy實現了數據屬性字段的批量處理、批量定義空間投影坐標系、批量進行等深線的拼接,利用ArcPy封裝好的處理函數以及Python自身具備的語法簡潔的特點,簡單、快捷地進行了南京長江河道水下地形數據的批量處理。
方圣輝、張玉賢等[13]以原始DEM影像插值生成特定空間分辨率的DEM影像為例,利用Python腳本語言,導入模塊并檢索特定擴展模塊許可,利用For循環遍歷rts柵格數據列表,依次對每個柵格數據提取等高線,從而生成TIN數據集,最后利用生成的TIN數據集,通過具體的Python腳本程序,生成特定空間分辨率的柵格影像。
在日常的空間地理數據處理中,一般將Python語言具有的普通及常用功能與ArcPy開發包特有的數據處理功能結合起來使用,可以有效、快速地處理地理空間數據[14-15]。
在實際的工作中,需要根據不同的情況,不同的方法來處理ArcGIS數據,下面以云南省地質環境信息化建設項目中的數據為依據,以數據處理中遇見的實際問題為例,給出要素數據屬性值順序碼重復值的處理流程以及具體的實現過程。
在進行水系、道路、圖斑要素數據的屬性值順序碼處理時,要素數據的屬性值順序碼中存在很多重復的值,由于要素數據數量巨大,人工改正顯得不切實際。本文利用Python腳本語言,針對此問題編寫一套程序,對要素數據屬性值中順序碼的重復值進行批檢查和處理[16-17],具體的要素數據屬性值順序碼重復值的處理流程如圖1所示。

圖1 順序碼處理流程
(1)設置工作路徑以及列出所設置的工作空間中的所有工作空間:
arcpy.env.workspace=r'F:ggg'
ii=arcpy.ListWorkspaces()
(2)列出需要處理的要素數據集并對要素數據集進行循環:
ff=["HydDataset","LcrDataset","TraDataset"]
for f in ff:
(3)如果要素名稱不是"UN_LLKL",對要素數據進行更新,并按行對數據進行循環:
if l!="UV_LLKL":
dd=arcpy.UpdateCursor(str(s)+"\"+f+"\"+l)
for d in dd:
(4)圖層中不是以53開頭的數據的選擇:
hh=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""FEATID" not like '53%'")
(5)對要素類進行搜索,并按行進行循環:
ss=arcpy.SearchCursor(l)
for i in ss:
(6)設置空數組,對數組進行循環,計算每個值在數組中出現的次數:如果出現的次數大于1,則追加到數組pac1中:
pac1=[]
for j in pa:
cc=pa.count(j)
if cc>1:
pac1.append(j)
(7)選擇數組pac1中出現的值,并進行更新:
hh=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""FEATID"='"+j+"'")
ff=arcpy.UpdateCursor(hh)
(8)設置要素數據屬性值順序碼,值為最大值加1
mx=(int(mx))+1
f.setValue("FEATID",int(mx))
本編碼主要實現兩個方面的功能,一是對要素數據中不是以53開頭數據的處理,另一方面是對要素數據屬性值順序碼重復值的處理。
(1)導入模塊,設置路徑,列文件夾并對文件夾進行循環,代碼如下:
import arcpy
arcpy.env.workspace=r'F:ggg'
ii=arcpy.ListWorkspaces()
for i in ii:
(2)要素數據中不是以53開頭數據的處理:
arcpy.env.workspace=i #當前路徑
s=arcpy.env.workspace #當前路徑
ff=["HydDataset","LcrDataset","TraDataset"] #要素數據集
for f in ff: #對要素數據集進行循環
arcpy.env.workspace=str(s)+"\"+f #設置當前路徑
ll=arcpy.ListFeatureClasses() #列出當前路徑下所有要素類
for l in ll: #循環列出的要素類
pac=[] #設置空的數組
if l!="UV_LLKL": #如果要素名稱不是UN_LLKL
dd=arcpy.UpdateCursor(str(s)+"\"+f+"\"+l) #對數據進行更新
for d in dd: #對數據按行進行循環
mm=d.getValue ("FEATID") #得到要素數據屬性值順序碼
if not mm in pac: #如果這個值不在數組中
pac.append(mm) #則追加到數組pac中
mx=max(pac) #取出pac數組中的最大值
layer=arcpy.MakeFeatureLayer_management(str(s)+"\"+f+"\"+l) #創建圖層
hh=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""FEATID" not like '53%'") #選擇圖層中不是以53開頭的數據
jj=arcpy.UpdateCursor(hh) #對選擇出來的數據進行更新
for j in jj: #對數據按行進行循環
mx=(int(mx))+1
j.setValue("FEATID",int(mx)) #設置要素數據屬性值順序碼,值為最大值加1
jj.updateRow(j) #更新數據
(3)要素數據屬性值順序碼重復值的處理:
pa=[] #設置空的數組pa
ss=arcpy.SearchCursor(l) #對要素類進行搜索
for i in ss: #按行對要素類進行循環
m=i.getValue("FEATID") #要素數據屬性值順序碼
pa.append(m) #將唯一標識值追加到數組pa中
mx=max(pa) #取數組pa中要素數據屬性值順序碼的最大值
pac1=[] #設置空的數組pca1
for j in pa: #對數組pa進行循環
cc=pa.count(j) #計算每個值在數組pa中出現的次數
if cc>1: #如果出現的次數大于1
pac1.append(j) #則追加到數組pac1中
layer=arcpy.MakeFeatureLayer_management(str(s)+"\"+f+"\"+l) #創建圖層
for j in pac1: #循環數組pac1
hh=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""FEATID"='"+j+"'") #選擇數組pac1中出現的值
ff=arcpy.UpdateCursor(hh) #對數組pca1中出現的值進行更新
gg=[] #定義空的數組
for f in ff: #循環需要更新的數據
s=f.getValue("FEATID") #得到要素數據屬性值順序碼
if not s in gg: #如果得到的要素數據屬性值順序碼不在數組gg中
gg.append(s) #則將得到的要素數據屬性值順序碼追加到數組gg中
else: #如果得到的要素數據屬性值順序碼在數組gg中
mx=(int(mx))+1
f.setValue("FEATID",int(mx)) #設置要素數據屬性值順序碼,值為最大值加1
ff.updateRow(f) #對數據進行更新
print I #打印,目的是顯示需要處理的一個圖層已經處理完成
以云南省昆明市五華區部分道路數據為例,代碼運行前后數據對比如圖(a)、(b)所示。

圖(a)代碼運行前數據
Fig (a) Code before running data

圖(b)代碼運行后數據
Fig (b) Code after running data
代碼運行結束后,通過數據處理前后對比分析,此程序能夠對要素數據屬性值順序碼重復值進行很好的處理。在要素數據屬性值順序碼重復值處理時,首先對要素數據進行更新和循環,其次計算每個值在數組中出現的次數。通過圖(a)、(b)可知,值出現次數大于一的要素數據順序碼,處理過程按行進行處理,其中重復值為當前的最大值加一,最終依次完成要素數據順序碼重復值的處理,與設計的程序本身相符合。
ArcGIS數據屬性值的處理任務繁瑣而復雜,重復性的操作也給工作人員帶來了一定的壓力和挑戰,通過采用Python語言編寫程序,可以定向的實現一些批處理功能,簡化操作步驟,在數據處理工作方面有很重要的現實意義。
本文通過具體的Python腳本程序,介紹了Python在ArcGIS數據屬性值順序碼重復值處理方面的應用,實現了一系列地理數據的批處理功能,其中包括對要素數據集的循環、更新以及對要素數據屬性值順序碼重復值的批處理。實驗結果表明,本文所設計的Python腳本程序能夠對要素數據屬性值中順序碼重復值進行很好的處理,提高了數據處理的速度與效率。
[1] 曹斌. 基于ArcPy的矢量數據批處理方法研究[J]. 科技創新與應用, 2017(21): 90-90.
[2] 巨擘. ArcGIS中應用Python腳本提高數據生產力的研究[J]. 測繪技術裝備, 2017, 19(3): 12-14.
[3] 彭海波, 向洪普. 基于Python的空間數據批量處理方法[J]. 測繪與空間地理信息, 2011, 34(4): 81-82.
[4] 李強, 白建榮, 李振林,等. 基于Python的數據批處理技術探討及實現[J]. 地理空間信息, 2015(2): 54-56.
[5] PaulA. Zandbergen, 贊德伯根, 李明巨, 等. 面向ArcGIS的Python腳本編程[M]. 人民郵電出版社, 2014.
[6] Wesley Chun. Python核心編程: 第3版[M]. 人民郵電出版社, 2016.
[7] 朱道強, 關海濤. Python在ArcGIS中的應用[J]. 測繪與空間地理信息, 2013, f36(7): 152-154.
[8] 石晶, 郭子珍, 李小勇. ARCGIS中應用Python腳本進行空間數據批量處理的研究與實現[J]. 河南科技, 2012(21): 60-61.
[9] Eric Pimpler. Programming ArcGIS 10.1 with Python Cookbook[M]. Birmingham: Packt, 2013.
[10] 邵保華, 田學志. 談Pytho在Arcgis地理處理中的應用[J]. 林業勘查設計, 2012(2): 99-100.
[11] 辛兵廠, 王來強, 張朝坤. 淺談Python在地理國情普查數據處理中的應用[J]. 測繪與空間地理信息, 2014, 37(06): 108-110.
[12] 孫咸磊, 許捍衛, 李文博. ArcPy在長江河道水下空間數據批量處理中的應用[J]. 測繪與空間地理信息, 2015(2): 97-99.
[13] 方圣輝, 張玉賢, 佃袁勇,等. 基于Python的ArcGIS地理數據批處理[J]. 測繪與空間地理信息, 2015(1): 1-2.
[14] 焦華. 基礎編程的思考方法[J]. 軟件, 2018, 39(3): 57-62.
[15] 胡蝶, 趙璞, 陳明爽, 等. 多源空間矢量數據一致性處理技術探討[J]. 軟件, 2016, 37(4): 13-17.
[16] 謝華成, 馬學文. MongoDB 數據庫下文件型數據存儲研究[J]. 軟件, 2015, 36(11): 12-14.
[17] 嚴元, 王海嬰. 雷電信息綜合處理平臺中高速數據處理的設計與實現[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集成與應用;李素敏(1977-),女,副教授,主要研究方向:遙感原理及應用、變形監測數據處理、數字礦山、土地生態。
本文著錄格式:莊亞飛,李素敏. 基于Python 的ArcGIS 數據屬性值順序碼處理研究[J]. 軟件,2018,39(7): 68-?71