張小璞,左小清
?
在ArcGIS下基于Python的路網數據批處理方法
張小璞,左小清
(昆明理工大學國土資源工程學院,云南 昆明 650093)
以云南省地質環境信息化建設項目為背景,針對地名地址數據生產中路網數據區劃代碼字段在人工賦值過程中存在準確率與處理效率低的問題。在對比分析ArcGis二次開發方法的基礎上,改進了一種新的面向ArcGis10.5的Python編程腳本。對該Python腳本地理空間分析原理、實驗數據準備階段的處理以及該Python腳本功能等作了詳細敘述。最終通過對實驗數據的驗證來證明新腳本的可行性。
ArcGIS;Python;地理空間數據處理;路網數據;合并
ArcGIS9引入了腳本處理技術,并支持多種腳本語言,包括Python、VBScritp、JavaScritp、JScritp和Perl[1-2]。由于ArcGIS是基于組件對象模型(COM)構建起來的,又因為腳本語言是面向對象的[3-5],所以腳本語言可以訪問ArcGIS中所有獲得許可的函數[6],也包括所有的擴展模塊。因此,腳本語言才可以高效地實現任務自動化。
Python作為一門程序語言,也常被稱為腳本語言。以Esri為例,他們主要使用C++語言開發ArcGIS軟件[7]。在ArcGIS軟件中,所有的組件或對象被稱為ArcObjects[8]。利用C++既可以新建一個對象,也可以開發一個含有ArcObjects對象的應用程序。利用Python則既可以訪問ArcGIS現有的功能,也可以通過組合相關函數來擴展ArcGIS的功能[9]。Python并不用于底層開發,而是用來完成一些相對簡單的腳本編程或一些高級程序設計項目[10]。
ArcGIS10已經將Python進一步整合到ArcGIS的用戶界面里,而且Esri已正式將Python作為ArcGIS首選的腳本工具,并對ArcGIS10.1進行了升級以包括Python2.7版本。Python雖然不是唯一一種可以在ArcGIS中使用的腳本語言,但是它一定是被最廣泛使用的一種。
ArcPy是一個以成功的arcgisscripting模塊為基礎并繼承了arcgisscripting功能進而構建而成的站點包。目的是為以實用高效的方式通過Python執行地理數據分析、數據轉換、數據管理和地圖自動化創建基礎。該包提供了豐富純正的Python體驗,具有代碼自動完成功能(輸入關鍵字和點即可獲得該關鍵字所支持的屬性和方法的彈出列表;從中選擇一個屬性或方法即可將其插入),并針對每個函數、模塊和類提供了參考文檔。在Python中使用ArcPy的另一個主要原因是,Python是一種通用的編程語言。Python是一種支持動態輸入的解釋型語言,適用于交互式操作以及為稱為腳本的一次性程序快速制作原型,同時其具有編寫大型應用程序的強大功能[11]。用ArcPy編寫的ArcGIS應用程序的優勢在于,可以使用由來自多個不同領域的GIS專業人員和程序員組成的眾多Python小群體開發的附加模塊。
為提升云南省地質環境管理工作的效率和信息化水平,實現全省地質環境信息化三級體系的互通互聯,云南省啟動了地質環境信息化建設項目。結合云南省第一次全國地理國情普查成果數據、最新電子地圖導航數據,生產地質環境信息化的地名地址數據是云南省地質環境信息化的重要內容之一。
其中,在處理整個省級的路網數據時,需要判斷整條道路數據跨越行政區的情況,最終確定所屬行政區。行政區劃面數據采集依據國情普查數據中的行政區劃數據。參考國情普查數據,行政區劃面狀數據可以從省級采集到鄉鎮級。省級行政區填寫2位代碼,市級行政區使用4位代碼,縣級行政區使用6位代碼,鄉級行政區使用9位代碼,具體要求如下:
① 同一道路數據,完全位于同一個鄉級行政區,只需填寫該鄉級行政區代碼;
② 同一道路數據,跨越多個鄉級行政區,如果多個鄉級行政區同屬于一個縣行政區,則填寫該縣級行政區代碼即可;如果多個鄉級行政區不屬于同一個縣級行政區,但同屬同一個市行政區,則填寫該市級行政區劃代碼;
③ 同一道路數據,跨越市級行政區,填寫省級區劃代碼。
由于整個省級路網數據量大,全部人工賦值工作難度大、工作量巨大;因為路網數據的行政區劃代碼填寫具有規律性,可以使用ArcGIS與Python結合進行處理。本文主要介紹判斷路網是否跨行政區域并填寫相應的行政區劃代碼。
道路數據行政區劃代碼填寫主要涉及兩個問題,一是判斷同一條道路跨越幾個行政區,二是同一條道路在跨越多個不同行政區時行政區劃代碼的填寫。解決這兩個問題,首先要確保數據無拓撲錯誤,包括道路數線據無偽節點、重疊、自相交,行政區劃面數據無縫隙、重疊錯誤;其次是數據屬性信息是否正確,包括道路數據名稱是否正確,行政區劃面數據行政區劃代碼是否正確。
(1)道路數據融合
路網數據在道路連通處要處于打斷狀態,首先需要對同一條道路進行融合操作,確保同一條數據融合成一整條。在進行融合操作時,可能出現不同區域存在相同名稱屬性的道路數據,所以在融合處理步驟中,創建多部件要素選項不能勾選。操作完成后,初步的道路數據融合完成。
(2)數據預處理
在道路數據中,存在同一條道路數據被連接線打斷的情況,但在賦值行政區劃代碼時需要對整條道路數據操作,對于這種情況,需要單獨處理。具體處理方法如下:
① 融合后的道路數據,要素結點轉點,類型選擇both-end;
② 使用查找相同工具,字段選擇“Shape”及“Name”,選擇合適距離,XY容差選擇合適距離;
③ 通過連接,合并名字相同的道路數據。
(3)唯一編碼
道路數據處理完成后,添加字段,對每一條道路數據設置全局唯一值,為后續數據判斷做準備。
(4)標識
數據唯一值設置完成后,用行政區劃面數據標識道路線數據,同一道路數據被分成若干條小段。
(5)行政區劃代碼填寫
采用Python處理道路數據的行政區劃代碼值,最終完成道路數據行政區劃代碼值的確認。

圖1 數據預處理流程圖
(1)提取道路唯一值
在判讀道路數據行政區劃代碼時,需要提取之前設置的全局唯一值,并存儲在數組中,代碼具體實現見下。
>>>layer=arcpy.MakeFeatureLayer_management('L_Merge_Identity')
...ss=arcpy.(layer,"unique")
...pca=[]
...foriinss:
...if i[0] not in pca:
...pca.append(i[0])
(2)行政區劃代碼判斷
根據全局唯一值選擇同一條道路的所有數據,根據每條記錄中的行政區劃代碼值確定最終道路數據所屬行政區劃代碼,實現代碼如下:
...for j in pca:
ff=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""unique"='"+str(j)+"'")
... mm=arcpy.da.UpdateCursor(ff,"code")
... pac9=[]
... pac6=[]
... pac4=[]
...for m in mm:
...if m[0][0:9] not in pac9:
... pac9.append(m[0][0:9])
...if m[0][0:6] not in pac6:
... pac6.append(m[0][0:6])
...if m[0][0:4] not in pac4:
... pac4.append(m[0][0:4])
(3)數據更新
代碼判斷完成后,對應的值填寫在“CODE”字段中,代碼實現見下:
...mm=arcpy.da.UpdateCursor(ff,"ROADCODE")
...for m in mm:
... if len(pac9)==1:
... m[0]=pac9[0]
... mm.updateRow(m)
... elif len(pac9)!=1 and len(pac6)==1:
... m[0]=pac6[0]
... mm.updateRow(m)
... elif len(pac9)!=1 and len(pac6)!=1 and len(pac4)==1:
... m[0]=pac4[0]
... mm.updateRow(m)
... elif len(pac9)!=1 and len(pac6)!=1 and len(pac4)!=1:
... m[0]="53"
... mm.updateRow(m)
(4)結果
代碼運行結束后,區劃代碼值填寫完成,運行前后,數據對比如下。

圖2 代碼運行前數據展示圖

圖3 代碼運行后數據展示圖
數據生產任務復雜而又繁瑣。水數據、道路數據、樓址點數據、興趣點數據;點數據、線數據、面數據等等都會因為數據量的龐大與特殊性給作業人員在地理處理中帶來巨大的挑戰。同時,重復性的操作如融合、拓撲、相交等地理操作也給工作帶來不小的壓力。顯然,地理數據的批處理越來越成為地理處理操作中不可缺少的重要功能。
本文通過介紹Python腳本語言在地理處理中的應用,實現了一系列地理處理過程的批處理工具,包括,提取唯一值、行政區劃代碼判斷、“CODE”字段更新等。在進行了大量對比測試后,實驗表明本文所提到的路網數據批處理工具對提高數據處理和整合的速度與效率有很大作用。
在實際工作中,利用Python開發地理數據批處理腳本程序,配置簡單、效率高效、方便實用,能夠大大減少作業員在地理數據處理工作中的重復性勞動,減少手工操作工作量\7。Python與Arcgis的完美融合與集成對公共地理信息服務數據的生產和加工、地理國情監測與地理國情普查中涉及的地理統計分析工作都具有重要的應用價值\8。
[1] PaulA.Zandbergen, 贊德伯根, 李明巨, 等. 面向ArcGIS的Python腳本編程[M]. 人民郵電出版社, 2014.
[2] Joel.Lawhead, 萊哈德, 鄧世超, 等. Python地理空間分析指南第2版[M]. 人民郵電出版社, 2017.
[3] 潘雪婷. 基于Python的控件分析模型的實現[D]. 中國地質大學(北京), 2010.
[4] 彭海波, 向洪普. 基于Python的空間數據批量處理方法[J].測繪與空間地理信息, 2011, 34(4): 81-82+85+87.
[5] 朱道強, 關海濤. Python在ArcGIS中的應用[J]. 測繪與空間地理信息, 2013, 36(7): 152-154.
[6] 巨擘. ArcGIS中應用Python腳本提高數據生產力的研究[J]. 測繪技術裝備, 2017, 19(3): 12-14.
[7] 易嘉. 城市交通分區合理劃分研究[D]. 同濟大學, 2006.
[8] 趙永國, 譚建軍. ArcObjects中各種版面要素的處理[C]// arcgis暨erdas中國用戶大會. 2004.
[9] 包瑞清. ArcGIS下的Python編程[M]. 江蘇鳳凰科學技術出版社, 2015.
[10] 田學志. 基于Python的Arcgis地理處理應用研究[J]. 計算機光盤軟件與應用, 2013(7): 46-46.
[11] 謝生鋒. 基于Python的動態語言特點探討[J]. 電腦知識與技術, 2017, 13(33): 131-132.
[12] 陳軒. 基于ArcGIS利用python腳本對地理數據庫中指定同名圖層的批量合并[A]. 云南省測繪地理信息局、云南省測繪地理信息學會. 云南省測繪地理信息學會2016年學術年會論文集[C]. 云南省測繪地理信息局、云南省測繪地理信息學會: 2016: 6.
Python-Based Road Network Data Batch Processing Method Under ArcGIS
ZHANG Xiao-pu, ZUO Xiao-qing
(Kunming University of Science and Technology, Land and Resources Engineering College, Kunming 650093,China)
Taking the geological environment informatization construction project in Yunnan as the background, there is a problem of accuracy and low processing efficiency in the manual assignment process of the road network data zoning code field for geographical name address data production. Based on a comparative analysis of ArcGis secondary development methods, a new Python programming script for ArcGis 10.5 is improved. The Python script geospatial analysis principle, the processing of the experimental data preparation phase, and the Python script function are described in detail. Finally through the verification of experimental data to prove the feasibility of the new script.
ArcGIS; Python; Geospatial data processing; Road network data; Merge
P208
A
10.3969/j.issn.1003-6970.2018.07.027
張小璞,(1992-),男,昆明理工大學碩士研究生,研究方向:地圖學與地理信息系統空間數據挖掘與處理;左小清,男,教授,博士生導師,云南省中青年學術和技術帶頭人,研究方向:時空數據挖掘、雷達干涉測量(InSAR)。
本文著錄格式:張小璞,左小清. 在ArcGIS下基于Python的路網數據批處理方法[J]. 軟件,2018,39(7):130-133