張小璞,左小清
?
在A(yíng)rcGIS下基于Python的路網(wǎng)數(shù)據(jù)批處理方法
張小璞,左小清
(昆明理工大學(xué)國(guó)土資源工程學(xué)院,云南 昆明 650093)
以云南省地質(zhì)環(huán)境信息化建設(shè)項(xiàng)目為背景,針對(duì)地名地址數(shù)據(jù)生產(chǎn)中路網(wǎng)數(shù)據(jù)區(qū)劃代碼字段在人工賦值過(guò)程中存在準(zhǔn)確率與處理效率低的問(wèn)題。在對(duì)比分析ArcGis二次開(kāi)發(fā)方法的基礎(chǔ)上,改進(jìn)了一種新的面向ArcGis10.5的Python編程腳本。對(duì)該P(yáng)ython腳本地理空間分析原理、實(shí)驗(yàn)數(shù)據(jù)準(zhǔn)備階段的處理以及該P(yáng)ython腳本功能等作了詳細(xì)敘述。最終通過(guò)對(duì)實(shí)驗(yàn)數(shù)據(jù)的驗(yàn)證來(lái)證明新腳本的可行性。
ArcGIS;Python;地理空間數(shù)據(jù)處理;路網(wǎng)數(shù)據(jù);合并
ArcGIS9引入了腳本處理技術(shù),并支持多種腳本語(yǔ)言,包括Python、VBScritp、JavaScritp、JScritp和Perl[1-2]。由于A(yíng)rcGIS是基于組件對(duì)象模型(COM)構(gòu)建起來(lái)的,又因?yàn)槟_本語(yǔ)言是面向?qū)ο蟮腫3-5],所以腳本語(yǔ)言可以訪(fǎng)問(wèn)ArcGIS中所有獲得許可的函數(shù)[6],也包括所有的擴(kuò)展模塊。因此,腳本語(yǔ)言才可以高效地實(shí)現(xiàn)任務(wù)自動(dòng)化。
Python作為一門(mén)程序語(yǔ)言,也常被稱(chēng)為腳本語(yǔ)言。以Esri為例,他們主要使用C++語(yǔ)言開(kāi)發(fā)ArcGIS軟件[7]。在A(yíng)rcGIS軟件中,所有的組件或?qū)ο蟊环Q(chēng)為ArcObjects[8]。利用C++既可以新建一個(gè)對(duì)象,也可以開(kāi)發(fā)一個(gè)含有ArcObjects對(duì)象的應(yīng)用程序。利用Python則既可以訪(fǎng)問(wèn)ArcGIS現(xiàn)有的功能,也可以通過(guò)組合相關(guān)函數(shù)來(lái)擴(kuò)展ArcGIS的功能[9]。Python并不用于底層開(kāi)發(fā),而是用來(lái)完成一些相對(duì)簡(jiǎn)單的腳本編程或一些高級(jí)程序設(shè)計(jì)項(xiàng)目[10]。
ArcGIS10已經(jīng)將Python進(jìn)一步整合到ArcGIS的用戶(hù)界面里,而且Esri已正式將Python作為ArcGIS首選的腳本工具,并對(duì)ArcGIS10.1進(jìn)行了升級(jí)以包括Python2.7版本。Python雖然不是唯一一種可以在A(yíng)rcGIS中使用的腳本語(yǔ)言,但是它一定是被最廣泛使用的一種。
ArcPy是一個(gè)以成功的arcgisscripting模塊為基礎(chǔ)并繼承了arcgisscripting功能進(jìn)而構(gòu)建而成的站點(diǎn)包。目的是為以實(shí)用高效的方式通過(guò)Python執(zhí)行地理數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理和地圖自動(dòng)化創(chuàng)建基礎(chǔ)。該包提供了豐富純正的Python體驗(yàn),具有代碼自動(dòng)完成功能(輸入關(guān)鍵字和點(diǎn)即可獲得該關(guān)鍵字所支持的屬性和方法的彈出列表;從中選擇一個(gè)屬性或方法即可將其插入),并針對(duì)每個(gè)函數(shù)、模塊和類(lèi)提供了參考文檔。在Python中使用ArcPy的另一個(gè)主要原因是,Python是一種通用的編程語(yǔ)言。Python是一種支持動(dòng)態(tài)輸入的解釋型語(yǔ)言,適用于交互式操作以及為稱(chēng)為腳本的一次性程序快速制作原型,同時(shí)其具有編寫(xiě)大型應(yīng)用程序的強(qiáng)大功能[11]。用ArcPy編寫(xiě)的ArcGIS應(yīng)用程序的優(yōu)勢(shì)在于,可以使用由來(lái)自多個(gè)不同領(lǐng)域的GIS專(zhuān)業(yè)人員和程序員組成的眾多Python小群體開(kāi)發(fā)的附加模塊。
為提升云南省地質(zhì)環(huán)境管理工作的效率和信息化水平,實(shí)現(xiàn)全省地質(zhì)環(huán)境信息化三級(jí)體系的互通互聯(lián),云南省啟動(dòng)了地質(zhì)環(huán)境信息化建設(shè)項(xiàng)目。結(jié)合云南省第一次全國(guó)地理國(guó)情普查成果數(shù)據(jù)、最新電子地圖導(dǎo)航數(shù)據(jù),生產(chǎn)地質(zhì)環(huán)境信息化的地名地址數(shù)據(jù)是云南省地質(zhì)環(huán)境信息化的重要內(nèi)容之一。
其中,在處理整個(gè)省級(jí)的路網(wǎng)數(shù)據(jù)時(shí),需要判斷整條道路數(shù)據(jù)跨越行政區(qū)的情況,最終確定所屬行政區(qū)。行政區(qū)劃面數(shù)據(jù)采集依據(jù)國(guó)情普查數(shù)據(jù)中的行政區(qū)劃數(shù)據(jù)。參考國(guó)情普查數(shù)據(jù),行政區(qū)劃面狀數(shù)據(jù)可以從省級(jí)采集到鄉(xiāng)鎮(zhèn)級(jí)。省級(jí)行政區(qū)填寫(xiě)2位代碼,市級(jí)行政區(qū)使用4位代碼,縣級(jí)行政區(qū)使用6位代碼,鄉(xiāng)級(jí)行政區(qū)使用9位代碼,具體要求如下:
① 同一道路數(shù)據(jù),完全位于同一個(gè)鄉(xiāng)級(jí)行政區(qū),只需填寫(xiě)該鄉(xiāng)級(jí)行政區(qū)代碼;
② 同一道路數(shù)據(jù),跨越多個(gè)鄉(xiāng)級(jí)行政區(qū),如果多個(gè)鄉(xiāng)級(jí)行政區(qū)同屬于一個(gè)縣行政區(qū),則填寫(xiě)該縣級(jí)行政區(qū)代碼即可;如果多個(gè)鄉(xiāng)級(jí)行政區(qū)不屬于同一個(gè)縣級(jí)行政區(qū),但同屬同一個(gè)市行政區(qū),則填寫(xiě)該市級(jí)行政區(qū)劃代碼;
③ 同一道路數(shù)據(jù),跨越市級(jí)行政區(qū),填寫(xiě)省級(jí)區(qū)劃代碼。
由于整個(gè)省級(jí)路網(wǎng)數(shù)據(jù)量大,全部人工賦值工作難度大、工作量巨大;因?yàn)槁肪W(wǎng)數(shù)據(jù)的行政區(qū)劃代碼填寫(xiě)具有規(guī)律性,可以使用ArcGIS與Python結(jié)合進(jìn)行處理。本文主要介紹判斷路網(wǎng)是否跨行政區(qū)域并填寫(xiě)相應(yīng)的行政區(qū)劃代碼。
道路數(shù)據(jù)行政區(qū)劃代碼填寫(xiě)主要涉及兩個(gè)問(wèn)題,一是判斷同一條道路跨越幾個(gè)行政區(qū),二是同一條道路在跨越多個(gè)不同行政區(qū)時(shí)行政區(qū)劃代碼的填寫(xiě)。解決這兩個(gè)問(wèn)題,首先要確保數(shù)據(jù)無(wú)拓?fù)溴e(cuò)誤,包括道路數(shù)線(xiàn)據(jù)無(wú)偽節(jié)點(diǎn)、重疊、自相交,行政區(qū)劃面數(shù)據(jù)無(wú)縫隙、重疊錯(cuò)誤;其次是數(shù)據(jù)屬性信息是否正確,包括道路數(shù)據(jù)名稱(chēng)是否正確,行政區(qū)劃面數(shù)據(jù)行政區(qū)劃代碼是否正確。
(1)道路數(shù)據(jù)融合
路網(wǎng)數(shù)據(jù)在道路連通處要處于打斷狀態(tài),首先需要對(duì)同一條道路進(jìn)行融合操作,確保同一條數(shù)據(jù)融合成一整條。在進(jìn)行融合操作時(shí),可能出現(xiàn)不同區(qū)域存在相同名稱(chēng)屬性的道路數(shù)據(jù),所以在融合處理步驟中,創(chuàng)建多部件要素選項(xiàng)不能勾選。操作完成后,初步的道路數(shù)據(jù)融合完成。
(2)數(shù)據(jù)預(yù)處理
在道路數(shù)據(jù)中,存在同一條道路數(shù)據(jù)被連接線(xiàn)打斷的情況,但在賦值行政區(qū)劃代碼時(shí)需要對(duì)整條道路數(shù)據(jù)操作,對(duì)于這種情況,需要單獨(dú)處理。具體處理方法如下:
① 融合后的道路數(shù)據(jù),要素結(jié)點(diǎn)轉(zhuǎn)點(diǎn),類(lèi)型選擇both-end;
② 使用查找相同工具,字段選擇“Shape”及“Name”,選擇合適距離,XY容差選擇合適距離;
③ 通過(guò)連接,合并名字相同的道路數(shù)據(jù)。
(3)唯一編碼
道路數(shù)據(jù)處理完成后,添加字段,對(duì)每一條道路數(shù)據(jù)設(shè)置全局唯一值,為后續(xù)數(shù)據(jù)判斷做準(zhǔn)備。
(4)標(biāo)識(shí)
數(shù)據(jù)唯一值設(shè)置完成后,用行政區(qū)劃面數(shù)據(jù)標(biāo)識(shí)道路線(xiàn)數(shù)據(jù),同一道路數(shù)據(jù)被分成若干條小段。
(5)行政區(qū)劃代碼填寫(xiě)
采用Python處理道路數(shù)據(jù)的行政區(qū)劃代碼值,最終完成道路數(shù)據(jù)行政區(qū)劃代碼值的確認(rèn)。
圖1 數(shù)據(jù)預(yù)處理流程圖
(1)提取道路唯一值
在判讀道路數(shù)據(jù)行政區(qū)劃代碼時(shí),需要提取之前設(shè)置的全局唯一值,并存儲(chǔ)在數(shù)組中,代碼具體實(shí)現(xiàn)見(jiàn)下。
>>>layer=arcpy.MakeFeatureLayer_management('L_Merge_Identity')
...ss=arcpy.(layer,"unique")
...pca=[]
...foriinss:
...if i[0] not in pca:
...pca.append(i[0])
(2)行政區(qū)劃代碼判斷
根據(jù)全局唯一值選擇同一條道路的所有數(shù)據(jù),根據(jù)每條記錄中的行政區(qū)劃代碼值確定最終道路數(shù)據(jù)所屬行政區(qū)劃代碼,實(shí)現(xiàn)代碼如下:
...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)數(shù)據(jù)更新
代碼判斷完成后,對(duì)應(yīng)的值填寫(xiě)在“CODE”字段中,代碼實(shí)現(xiàn)見(jiàn)下:
...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)結(jié)果
代碼運(yùn)行結(jié)束后,區(qū)劃代碼值填寫(xiě)完成,運(yùn)行前后,數(shù)據(jù)對(duì)比如下。
圖2 代碼運(yùn)行前數(shù)據(jù)展示圖
圖3 代碼運(yùn)行后數(shù)據(jù)展示圖
數(shù)據(jù)生產(chǎn)任務(wù)復(fù)雜而又繁瑣。水?dāng)?shù)據(jù)、道路數(shù)據(jù)、樓址點(diǎn)數(shù)據(jù)、興趣點(diǎn)數(shù)據(jù);點(diǎn)數(shù)據(jù)、線(xiàn)數(shù)據(jù)、面數(shù)據(jù)等等都會(huì)因?yàn)閿?shù)據(jù)量的龐大與特殊性給作業(yè)人員在地理處理中帶來(lái)巨大的挑戰(zhàn)。同時(shí),重復(fù)性的操作如融合、拓?fù)?、相交等地理操作也給工作帶來(lái)不小的壓力。顯然,地理數(shù)據(jù)的批處理越來(lái)越成為地理處理操作中不可缺少的重要功能。
本文通過(guò)介紹Python腳本語(yǔ)言在地理處理中的應(yīng)用,實(shí)現(xiàn)了一系列地理處理過(guò)程的批處理工具,包括,提取唯一值、行政區(qū)劃代碼判斷、“CODE”字段更新等。在進(jìn)行了大量對(duì)比測(cè)試后,實(shí)驗(yàn)表明本文所提到的路網(wǎng)數(shù)據(jù)批處理工具對(duì)提高數(shù)據(jù)處理和整合的速度與效率有很大作用。
在實(shí)際工作中,利用Python開(kāi)發(fā)地理數(shù)據(jù)批處理腳本程序,配置簡(jiǎn)單、效率高效、方便實(shí)用,能夠大大減少作業(yè)員在地理數(shù)據(jù)處理工作中的重復(fù)性勞動(dòng),減少手工操作工作量\7。Python與Arcgis的完美融合與集成對(duì)公共地理信息服務(wù)數(shù)據(jù)的生產(chǎn)和加工、地理國(guó)情監(jiān)測(cè)與地理國(guó)情普查中涉及的地理統(tǒng)計(jì)分析工作都具有重要的應(yīng)用價(jià)值\8。
[1] PaulA.Zandbergen, 贊德伯根, 李明巨, 等. 面向ArcGIS的Python腳本編程[M]. 人民郵電出版社, 2014.
[2] Joel.Lawhead, 萊哈德, 鄧世超, 等. Python地理空間分析指南第2版[M]. 人民郵電出版社, 2017.
[3] 潘雪婷. 基于Python的控件分析模型的實(shí)現(xiàn)[D]. 中國(guó)地質(zhì)大學(xué)(北京), 2010.
[4] 彭海波, 向洪普. 基于Python的空間數(shù)據(jù)批量處理方法[J].測(cè)繪與空間地理信息, 2011, 34(4): 81-82+85+87.
[5] 朱道強(qiáng), 關(guān)海濤. Python在A(yíng)rcGIS中的應(yīng)用[J]. 測(cè)繪與空間地理信息, 2013, 36(7): 152-154.
[6] 巨擘. ArcGIS中應(yīng)用Python腳本提高數(shù)據(jù)生產(chǎn)力的研究[J]. 測(cè)繪技術(shù)裝備, 2017, 19(3): 12-14.
[7] 易嘉. 城市交通分區(qū)合理劃分研究[D]. 同濟(jì)大學(xué), 2006.
[8] 趙永國(guó), 譚建軍. ArcObjects中各種版面要素的處理[C]// arcgis暨erdas中國(guó)用戶(hù)大會(huì). 2004.
[9] 包瑞清. ArcGIS下的Python編程[M]. 江蘇鳳凰科學(xué)技術(shù)出版社, 2015.
[10] 田學(xué)志. 基于Python的Arcgis地理處理應(yīng)用研究[J]. 計(jì)算機(jī)光盤(pán)軟件與應(yīng)用, 2013(7): 46-46.
[11] 謝生鋒. 基于Python的動(dòng)態(tài)語(yǔ)言特點(diǎn)探討[J]. 電腦知識(shí)與技術(shù), 2017, 13(33): 131-132.
[12] 陳軒. 基于A(yíng)rcGIS利用python腳本對(duì)地理數(shù)據(jù)庫(kù)中指定同名圖層的批量合并[A]. 云南省測(cè)繪地理信息局、云南省測(cè)繪地理信息學(xué)會(huì). 云南省測(cè)繪地理信息學(xué)會(huì)2016年學(xué)術(shù)年會(huì)論文集[C]. 云南省測(cè)繪地理信息局、云南省測(cè)繪地理信息學(xué)會(huì): 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-),男,昆明理工大學(xué)碩士研究生,研究方向:地圖學(xué)與地理信息系統(tǒng)空間數(shù)據(jù)挖掘與處理;左小清,男,教授,博士生導(dǎo)師,云南省中青年學(xué)術(shù)和技術(shù)帶頭人,研究方向:時(shí)空數(shù)據(jù)挖掘、雷達(dá)干涉測(cè)量(InSAR)。
本文著錄格式:張小璞,左小清. 在A(yíng)rcGIS下基于Python的路網(wǎng)數(shù)據(jù)批處理方法[J]. 軟件,2018,39(7):130-133