劉翔宇,朱大明
?
Arcgis中基于Python的地理數(shù)據(jù)庫批量合并方法研究
劉翔宇,朱大明
(昆明理工大學(xué) 國土資源工程學(xué)院,云南 昆明 650093)
為了實(shí)現(xiàn)Arcgis不同地理數(shù)據(jù)庫中大量相同圖層批量合并的操作。本文基于云南省地質(zhì)環(huán)境信息化建設(shè)項(xiàng)目,在對(duì)比分析Arcgis二次開發(fā)方法的基礎(chǔ)上,提出了一種新的面向ArcGis10.5的Python編程腳本。本文對(duì)Python地理空間分析原理、Python腳本功能以及實(shí)驗(yàn)數(shù)據(jù)處理流程等作了詳細(xì)敘述。實(shí)驗(yàn)結(jié)果證明了該腳本的可行性。得出結(jié)論:本文中基于ArcPy人工開發(fā)出的腳本,相比手動(dòng)操作效率大大提高,不易出錯(cuò),實(shí)現(xiàn)了地理數(shù)據(jù)庫中指定同名圖層的批量合并。
Arcgis;地理數(shù)據(jù)庫處理;python;腳本編輯;合并
ArcGIS是由美國ESRI公司研發(fā)生產(chǎn)的一款地理信息系統(tǒng)(GIS)軟件,其可以用與地理數(shù)據(jù)的采集,編輯,處理及多種形式的空間分析,同時(shí)可以為人們的生產(chǎn)提供決策。該軟件目前已廣泛應(yīng)用于自然資源管理、自動(dòng)制圖、設(shè)施管理、城市和區(qū)域規(guī)劃、交通管理等領(lǐng)域[1]。作為目前主流的GIS軟件,是一套完整的、可無縫擴(kuò)展的平臺(tái)軟件,具有管理和分析空間數(shù)據(jù)的功能,可以通過二次開發(fā)語言對(duì)桌面功能進(jìn)行擴(kuò)展。常用的ArcGIS二次開發(fā)語言有Python,VBA,VB,.net等。其中Python作為一種簡單而且功能強(qiáng)大的開放性編程語言而備受矚目,它具有簡單易學(xué)、不受局限、可跨平臺(tái)使用等諸多優(yōu)點(diǎn)[2]。在ArcGIS10.1版本中已經(jīng)將Python進(jìn)一步整合到ArcGIS的用戶界面里,供用戶編程以開發(fā)出大量用于處理地理數(shù)據(jù)的實(shí)用程序,而這些由用戶編寫的程序可以進(jìn)行地理數(shù)據(jù)的自動(dòng)化批量處理,從而大大提高了工作效率。
GIS軟件功能中的一個(gè)重要組成部分就是地理數(shù)據(jù)的處理,地理數(shù)據(jù)處理的本質(zhì)其實(shí)就是多種空間數(shù)據(jù)進(jìn)行處理,專業(yè)名詞即為空間分析。地理數(shù)據(jù)處理最終的目標(biāo)為使用戶能夠根據(jù)自己的需求去執(zhí)行模型的建立,各種空間分析功能。在大量地理數(shù)據(jù)需要處理的時(shí)候,需要進(jìn)行多次數(shù),長周期的處理模式。因此我們就需要可以自動(dòng)進(jìn)行多次數(shù)循環(huán)處理數(shù)據(jù)流的功能,基于python腳本加Arcgis的模式可以提供一組豐富的工具和機(jī)制來實(shí)現(xiàn)數(shù)據(jù)流的自動(dòng)化批量操作,這些工具和腳本能夠?qū)⒁幌盗械墓ぞ甙凑沼脩糇约旱囊庠赶嚆暯樱靡杂行虻倪M(jìn)行地理數(shù)據(jù)的處理。
Arcgis軟件中自帶的典型數(shù)據(jù)處理工具會(huì)在ArcGIS數(shù)據(jù)集(如要素類、柵格或表)的框架中進(jìn)行操作,最終的結(jié)果即生成一個(gè)新的要素類集。又因?yàn)閿?shù)據(jù)變換的框架為地理處理的基礎(chǔ)。所以每個(gè)地理處理工具都對(duì)應(yīng)一個(gè)數(shù)據(jù)處理的微操作。典型的例如向表中添加字段、要素的幾何變換、數(shù)據(jù)投影(即將一個(gè)要素?cái)?shù)據(jù)集投影到另一個(gè)要素?cái)?shù)據(jù)集中)。所有的數(shù)據(jù)處理工具都集合在ArcGIS軟件里的ArcToolbox中,其數(shù)量高達(dá)數(shù)百個(gè)。對(duì)于用戶或者專業(yè)處理數(shù)據(jù)的人員來說,在利用ArcGIS地理處理工具時(shí),根據(jù)不同的情況就會(huì)出現(xiàn)不同的問題,例如如何將幾個(gè)簡單的小工具串聯(lián)起來,用于自動(dòng)化地完成一個(gè)簡單工作流。此時(shí)就可以利用Python腳本來使得人工操作轉(zhuǎn)換為自動(dòng)化的程序批處理過程用于進(jìn)行數(shù)據(jù)處理[3]。下面我們就倆簡單介紹下基于Arcgis的python腳本。
本文首先對(duì)ArcGIS的腳本語言Python的使用方法做一個(gè)簡單介紹,對(duì)比Python腳本與Arcgis中自帶工具的優(yōu)劣,然后利用已經(jīng)編寫好的Python腳本來說明其在地理數(shù)數(shù)據(jù)處理中的應(yīng)用。
1991年,程序員Guido van Rossum推出了一種跨平臺(tái)并且不受局限的開源式編程語言。在當(dāng)時(shí)由于Python具有處理速度快、功能強(qiáng)大等特點(diǎn)獲得了大眾的廣泛認(rèn)可。目前Python已延伸到ArcGIS中,成為了一種用于進(jìn)行數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理和地圖自動(dòng)化的語言[4]。ArcPy則是一個(gè)包含了各種python的原生程序包。ArcGIS 9.2版本中所采用的arcgisscripting 模塊的功能是它的雛形,ArcPy則是其進(jìn)一步的衍生,提供了多種有用的函數(shù)和類并且為用戶提供了使用Python語言操作時(shí)所需要的所有地理處理工具的入口,以用于處理和詢問GIS數(shù)據(jù)[5]。后續(xù)的Arcgis的每個(gè)版本都進(jìn)一步加強(qiáng)了用戶的Python體驗(yàn),直至今日的版本ESRI公司已將Python完全納入ArcGIS中,并將其視為可滿足用戶需求的語言[6]??梢允褂脕碜圆煌I(lǐng)域的GIS人員和程序員組成的眾多Python小群體開發(fā)的附加模塊是用ArcPy編寫的ArcGIS應(yīng)用程序的一大優(yōu)勢(shì)。
(1)Python 語言是一種解釋型的開源計(jì)算機(jī)語言,具有面向?qū)ο笄铱蓴U(kuò)展的特征,包含豐富的庫。簡單易學(xué),功能強(qiáng)大。
(2)相對(duì)于C、C++、Java等其他計(jì)算機(jī)語言,python的開發(fā)效率要大大提高。Python代碼的長度往往只有C++或Java代碼的四分之一左右,并且Python語言編寫的程序可以立即執(zhí)行,不需要編譯鏈接等步驟,從而提高了開發(fā)效率。
(3)可轉(zhuǎn)變?yōu)锳rcGIS工具
編輯好的Python腳本程序可以直接作為自定義工具使用并且添加到ArcToolBox中作為自定義工具,與系統(tǒng)提供的工具使用方法一致。簡化了操作過程,簡單易用。
(4)跨平臺(tái),可移植性高
絕大多數(shù)Python程序不需要人工更改即可在當(dāng)前主流的計(jì)算機(jī)系統(tǒng)平臺(tái)上使用。
(5)具有可嵌入性
Python程序可以作為插件嵌入到其他語言開發(fā)的應(yīng)用程序中(例如Arcgis),提高了程序的重用性。
(6)地理處理自動(dòng)化
Python腳本的執(zhí)行過程實(shí)際上就是一個(gè)自動(dòng)化的數(shù)據(jù)流處理過程。地理處理的過程按照程序設(shè)計(jì)的步驟依次完成相應(yīng)的地理處理過程,中途無需人工干預(yù)。并且地理處理的過程可以實(shí)現(xiàn)批處理,大大簡化工作量[7]。
(1)在命令行窗口中使用ArcPy
在用戶成功安裝ArcGIS軟件之后可以選擇安裝包括Python的安裝包,安裝以后用戶需要先運(yùn)行Python IDLE。在使用數(shù)據(jù)處理工具之前需要先導(dǎo)入Arcpy站點(diǎn)包。
(2)在Python腳本文件中使用ArcPy
其人性化的設(shè)計(jì)之一是Python窗口中具有代碼提示功能,使用ArcPy的方式有很多種其中最方便的是利用腳本文件,常用的方法是利用記事本編輯我們所需要的程序。另一種方法則是在Python IDLE中創(chuàng)建腳本文件,在Python IDLE中打開腳本文件后,點(diǎn)擊Run->Run Module將運(yùn)行腳本文件,可以顯示相應(yīng)的提示信息。
(3)利用ArcPy創(chuàng)建地理處理工具
利用ArcPy創(chuàng)建用戶需要的地理處理工具也是常用的功能,該工具可以作為ArcCatalog中的自定義工具使用,其使用方法與ArcToolbox中工具的使用方法類似用戶可以通過對(duì)話框進(jìn)行參數(shù)輸入并且根據(jù)不同的參數(shù)顯示不同的結(jié)果。
2.1.1 直接導(dǎo)入法
如圖1所示,這種方法能夠選取自己想要合并的表格屬性。首先是在arccatalog工具欄中定位到我們需要合并的圖層,然后右鍵選擇導(dǎo)入(part2合并入part1圖層中,選擇part1右鍵選擇加載),需要注意的是加載圖層必須是在一個(gè)數(shù)據(jù)庫空間下(gdb或者是mdb目錄下)。
圖1 直接導(dǎo)入法
2.1.2 利用toolbox下的合并工具
如圖2所示,此方法我們需要注意各要素間的表格屬性。如果表格中的字段名稱或者是類型不一致,就會(huì)造成數(shù)據(jù)丟失。所以當(dāng)圖層數(shù)較少時(shí),我們可以采取加載的方式進(jìn)行,如果要合并多個(gè)圖層時(shí),合并工具就會(huì)更加有效,但是前提條件是我們預(yù)先處理好各表格中字段類型及名稱。(合并工具在ArcToolBox——Data Management Tools—— General——Merge中)。
但是上述兩種方法只適用于少量圖層的合并。由于本文中所處理的數(shù)據(jù)是包含多個(gè)圖層的地質(zhì)公園數(shù)據(jù)庫數(shù)據(jù),各個(gè)地質(zhì)公園的數(shù)據(jù)分別存儲(chǔ)在數(shù)據(jù)庫中,分為水域,水系,注記等圖層,存儲(chǔ)位置太過分散,手動(dòng)合并各個(gè)數(shù)據(jù)庫相同圖層工作量龐大且容易出錯(cuò),本文基于ArcGIS使用python對(duì)大量數(shù)據(jù)庫中的指定圖層進(jìn)行批量合并,形成整個(gè)測區(qū)范圍的指定圖層數(shù)據(jù),質(zhì)檢員只需對(duì)合并后的數(shù)據(jù)進(jìn)行一次檢查,極大的提高質(zhì)檢效率,減輕質(zhì)檢工作強(qiáng)度和避免逐幅檢查時(shí)易出現(xiàn)的圖幅漏查情況。以下是數(shù)據(jù)批量處理流程及具體實(shí)現(xiàn)。
圖2 利用工具合并
在數(shù)據(jù)生產(chǎn)過程中,通常一個(gè)數(shù)據(jù)庫中包含很多圖層,點(diǎn)、線、面圖層同時(shí)存在,多個(gè)數(shù)據(jù)庫中基本包含相同圖層,例如此文中不同的地質(zhì)公園數(shù)據(jù)庫中都包含水系,注記,山峰,地質(zhì)遺跡等同名圖層。數(shù)據(jù)處理過程中由各個(gè)作業(yè)員生產(chǎn)的N個(gè)獨(dú)立的地理數(shù)據(jù)庫(gdb)最終將匯交至質(zhì)檢人員,當(dāng)質(zhì)檢員應(yīng)用GIS軟件對(duì)這些gdb格式的數(shù)據(jù)庫中某類要素(比如“水系”層)進(jìn)行檢查時(shí),由于每個(gè)水系圖層都存儲(chǔ)于一個(gè)獨(dú)立的地理數(shù)據(jù)庫(gdb)中,質(zhì)檢員只能選擇將這N個(gè)數(shù)據(jù)庫中每個(gè)的水系圖層逐一檢查,這種檢查方式非常之耗時(shí)且由于繁瑣的操作而致使檢查工作易出現(xiàn)遺漏,若不想逐個(gè)檢查就必須對(duì)分散于多個(gè)數(shù)據(jù)庫中的圖層進(jìn)行合并后再從整體上進(jìn)行檢查[8]。
每個(gè)公園數(shù)據(jù)包含4個(gè)數(shù)據(jù)庫(gdb)如圖3所示,分別為邊界圖,地質(zhì)圖,規(guī)劃總圖,科學(xué)導(dǎo)游圖,每個(gè)數(shù)據(jù)庫中都含有同名圖層水系,水域,注記,村莊等。
圖3 數(shù)據(jù)庫存儲(chǔ)方式
由于數(shù)據(jù)存儲(chǔ)在中文路徑,首先在代碼前添加中文路徑識(shí)別代碼,便于python腳本識(shí)別數(shù)據(jù)庫。
否則數(shù)據(jù)不能被識(shí)別導(dǎo)致腳本出現(xiàn)錯(cuò)誤,無法進(jìn)行。
import arcpy
import sys
reload(sys)
sys.setdefaultencoding(‘utf8‘)
這一步是利用腳本將三個(gè)公園的邊界圖數(shù)據(jù)庫,即三個(gè)不同公園的邊界圖.gdb中的所有同名圖層合并到一個(gè)新的數(shù)據(jù)庫BJ.gdb中。得到的新的數(shù)據(jù)庫中包含原來三個(gè)數(shù)據(jù)庫中的所有同名圖層,完成了批量合并操作,方便檢查錯(cuò)位及遺漏。
arcpy.env.workspace=r’F:DZ’ #路徑設(shè)置
s1=arcpy.ListWorkspaces() #列出所有的文件夾
for i in s1: #對(duì)文件夾進(jìn)行循環(huán)
arcpy.env.workspace=i #設(shè)置文件夾下的路徑
print I #把路徑打印出來
s2=arcpy.ListWorkspaces() #列出文件夾下路徑
for j in s2: #對(duì)當(dāng)前路徑下的文件夾進(jìn)行循環(huán)
arcpy.env.workspace=j #設(shè)置路徑
print j #把路徑打印出來
s3=arcpy.ListWorkspaces(“*邊界圖.gdb”)
#列出包含邊界圖.gdb的文件夾
for a in s3: #對(duì)當(dāng)前路徑下的文件循環(huán)
arcpy.env.workspace=a #設(shè)置路徑
print a #打印路徑
ff=arcpy.ListFeatureClasses()
#列出當(dāng)前路徑下的所有要素類
for f in ff: #對(duì)當(dāng)前要素類進(jìn)行循環(huán)
if not arcpy.Exists(r’F:DZ BJ. gdb’+ ”\”+f): #判斷某一要素是否存在
arcpy.CopyFeatures_management(str(a)+”\”+f,r’F: DZBJ.gdb’+”\”+f) #若不存在則直接復(fù)制
else:
print f
arcpy.Append_management (str(a)+”\”+f,r’F:DZBJ.gdb’+”\”+f ,”NO_TEST”,””,””) #如果存在,打印
print ”BJ” #程序完成,顯示“BJ”
arcpy.env.workspace=r’F:DZBJ.gdb’
ss=arcpy.ListFeatureClasses()
for s in ss:
count=arcpy.GetCount_management(s)
print s+” ”+str(count)
arcpy.env.workspace=r’F:DZ公園‘
s1=arcpy.ListWorkspaces()
for i in s1:
cnt=0
arcpy.env.workspace=i
s2= arcpy.ListWorkspaces()
for j in s2:
arcpy.env.workspace=j
s3=arcpy.ListWorkspaces(”*邊界圖.gdb”)
for a in s3:
arcpy.env.workspace=a
ff=arcpy.ListFeatureClasses(s)
for f in ff:
d=str(arcpy.GetCount_managment(f))
cnt=cnt+int(d)
print s+” ”+str(cnt)
此代碼主要是對(duì)合并前各個(gè)邊界圖數(shù)據(jù)庫中所有相同圖層的數(shù)量相加之和與合并后數(shù)據(jù)庫BJ.gdb中總圖層數(shù)量的比較,如數(shù)量一致,說明合并前后數(shù)量一致,所有相同圖層都被合并到新的數(shù)據(jù)庫中,沒有遺漏。處理結(jié)果如表1所示,根據(jù)圖中顯示的結(jié)果,前后數(shù)量一致,代碼完美運(yùn)行。
表1 最終對(duì)比處理結(jié)果
Tab.1 Final contrast
在整個(gè)數(shù)據(jù)處理過程中主要存在合并數(shù)據(jù)類型不一致所引起的錯(cuò)誤。主要原因是字符串類型不能存放在數(shù)值型字段中,如圖4所示。解決方法:查看原始數(shù)據(jù),把數(shù)據(jù)類型改成一致。
圖4 處理過程中出現(xiàn)的錯(cuò)誤
本文以云南省地質(zhì)環(huán)境信息化建設(shè)項(xiàng)目中的地質(zhì)公園數(shù)據(jù)庫數(shù)據(jù)為例,探討了ArcPy在地理數(shù)據(jù)庫合并處理中的方法與應(yīng)用,實(shí)現(xiàn)了對(duì)地理數(shù)據(jù)庫中的指定圖層的自動(dòng)、批量合并,杜絕了大量地理數(shù)據(jù)庫圖層人工合并時(shí)人為遺漏的情況,極大的提高了工作效率。當(dāng)采用ArcGIS Engine或是其他數(shù)據(jù)處理開發(fā)包實(shí)現(xiàn)此功能時(shí),有著較高的編程門檻,主要面向的人群是專業(yè)的開發(fā)人員。此文中的方法則降低了編程的門檻,非專業(yè)人員也可以輕松上手并且在空間數(shù)據(jù)批量自動(dòng)化處理和地理小工具的開發(fā)方面具有顯著的優(yōu)勢(shì)[9],利用腳本可以簡化手工操作的步驟,減少誤操作概率,對(duì)用戶的日常數(shù)據(jù)處理工作有很大的幫助[10],Arcgis中提供的種類豐富的數(shù)據(jù)處理工具并不適用與所有的情況,在具體的工作任務(wù)中,合適且方便的地理數(shù)據(jù)工具往往更加實(shí)用,此時(shí)就需要個(gè)性化的工具去針對(duì)不同的工作內(nèi)容,恰恰Arcpy可以實(shí)現(xiàn)這一點(diǎn)。由此可見Python在Arcgis地理處理框架中占據(jù)非常重要的位置[11]。在GIS行業(yè)今后的發(fā)展中,越來越多的開發(fā)人員,用戶,數(shù)據(jù)處理人員將更好的完善python腳本在數(shù)據(jù)處理方面的應(yīng)用,工作效率也會(huì)也來越高。
[1] 何麗嫻, 甘淑, 陳應(yīng)躍. 基于Python語言的空間數(shù)據(jù)處理[J]. 價(jià)值工程, 2014(36): 207-209.
[2] 卜麗靜, 鄭新杰, 張正鵬, 等. 基于Python的礦山遙感監(jiān)測系統(tǒng)開發(fā)研究[J]. 測繪工程, 2015(6): 43-47.
[3] 柳琳. 基于工作流的地理處理建模技術(shù)[J]. 地理空間信息, 2011, 9(1): 39-42.
[4] 林璐, 王爽, 李海泉, 等. 在ArcGIS下基于Python的矢量數(shù)據(jù)處理方法[J]. 測繪技術(shù)裝備, 2016, 18(4): 63-65.
[5] 曹斌. 基于ArcPy的矢量數(shù)據(jù)批處理方法研究[J]. 科技創(chuàng)新與應(yīng)用, 2017(21): 90-90.
[6] 邵保華, 田學(xué)志. 談Python在Arcgis地理處理中的應(yīng)用[J]. 林業(yè)勘查設(shè)計(jì), 2012(2): 99-100.
[7] 巨擘. ArcGIS中應(yīng)用Python腳本提高數(shù)據(jù)生產(chǎn)力的研究[J]. 測繪技術(shù)裝備, 2017, 19(3): 12-14.
[8] 陳軒. 基于ArcGIS利用python腳本對(duì)地理數(shù)據(jù)庫中指定同名圖層的批量合并[J].
[9] 張橋平, 李德仁, 龔健雅. 城市地圖數(shù)據(jù)庫圖形合并技術(shù)[J]. 測繪通報(bào), 2003(9): 27-29.
[10] 劉小華. 基于Python的地理信息數(shù)據(jù)處理研究[J]. 中國化工貿(mào)易, 2015, 7(32).
[11] 田學(xué)志. 基于Python的Arcgis地理處理應(yīng)用研究[J]. 計(jì)算機(jī)光盤軟件與應(yīng)用, 2013(7): 46-46.
Research on Batch Consolidation Method Based on Python in ArcGIS
LIU Xiang-yu, ZHU Da-ming
(Faculty of Land and Resource Engineering, Kunming University of Science and Technology, Kunming 650093, China)
In order to achieve the bulk consolidation of a large number of identical layers in different geodatabases in ArcGIS, This article is based on the geological environment information construction project in Yunnan Province, Based on a comparative analysis of Arcgis secondary development methods, A new Python programming script for ArcGis 10.5 is proposed. This article gives a detailed description of the principles of Python geospatial analysis, Python scripting capabilities, and experimental data processing flow. Experimental results prove the feasibility of the script. Conclusion: In this article, the scripts developed manually based on ArcPy are significantly more error-prone than manual operations, Achieve batch consolidation of layers with the same name in the geodatabase.
Arcgis; Geodatabase processing; Python; Script editing; Merge
TP79
A
10.3969/j.issn.1003-6970.2018.07.034
劉翔宇(1993-),男,昆明理工大學(xué)國土資源工程學(xué)院碩士研究生,研究方向?yàn)?S技術(shù)集成及應(yīng)用。
本文著錄格式:劉翔宇,朱大明. Arcgis中基于Python的地理數(shù)據(jù)庫批量合并方法研究[J]. 軟件,2018,39(7):161-165