河南省基礎地理信息中心 石 晶
河南省遙感測繪院 郭子珍
河南省基礎地理信息中心 李小勇
ARCGIS 是美國環(huán)境系統(tǒng)研究所ESRI(Environment system Research Institute)推出的一套完整的軟件產(chǎn)品,旨在構建完善的GIS(Geographic Information System)系統(tǒng)。
利用ARCGIS進行空間數(shù)據(jù)執(zhí)行空間分析、建模、數(shù)據(jù)處理任務過程中,幾乎所有操作都會涉及重復的工作,例如數(shù)據(jù)格式轉(zhuǎn)換,裁切拼接,投影變換等。如果采用人工處理,效率低并且容易出錯,為了保證數(shù)據(jù)質(zhì)量,減少重復勞動,需要創(chuàng)建可自動執(zhí)行批量處理的方法。
空間數(shù)據(jù)的地理處理是以數(shù)據(jù)變換的框架為基礎。典型的地理處理工具會在ArcGIS 數(shù)據(jù)集(如要素類、柵格或表)中執(zhí)行操作,并最終生成一個新數(shù)據(jù)集。每個地理處理工具都用于對地理數(shù)據(jù)執(zhí)行一種非常重要的小操作,例如將數(shù)據(jù)集從一個地圖投影中投影到另一個地圖投影中、向表中添加字段或在要素周圍創(chuàng)建緩沖區(qū)。在ArcGIS 中包含了數(shù)百個此類地理處理工具。
在軟件編程領域中,語言可基本分為兩類:系統(tǒng)語言和腳本語言。系統(tǒng)語言是諸如C++和.NET,用于通過計算機的低級圖元和原始資源從底層開發(fā)應用程序。腳本語言(例如Python和Perl)用于將多個應用程序組合到一起,該語言使用計算機內(nèi)置的高級功能,回避了系統(tǒng)語言編程程序必須處理的具體細節(jié)。與系統(tǒng)語言相比,腳本語言更加易學易用,對編程有基本的了解便足以很好地使用它們。
與空間位置有關的地理數(shù)據(jù),按組織形式分為矢量數(shù)據(jù)和柵格數(shù)據(jù)兩大類。在ARCGIS中,常用的矢量數(shù)據(jù)有:Coverage,Shapefile 和Geodatabase,這幾種都是ARCGIS 的原生數(shù)據(jù)格式,在ARCGIS中使用最多。
Python是一種不受局限、跨平臺的開源編程語言,它功能強大且簡單易學。因而得到了廣泛應用和支持。ArcGIS 從9.0 開始中引入了Python。此后,Python被視為可供地理處理用戶選擇的腳本語言并得以不斷發(fā)展。Python的部分優(yōu)勢為:易于學習,非常適合初學者,也特別適合專家使用;可伸縮程度高,適于大型項目或小型的一次性程序(稱為腳本);可移植,跨平臺;可嵌入(使ArcGIS可腳本化);穩(wěn)定成熟;用戶社區(qū)規(guī)模大。
Python已延伸到ArcGIS中,成為了一種用于進行數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理和地圖自動化的語言,有助于提高工作效率。
在ARCGIS的地理處理框架中,腳本與模型都可用來創(chuàng)建新工具。模型是使用可視化編程語言(模型構建器)創(chuàng)建的;而腳本是使用基于文本的語言和文本編輯器創(chuàng)建的。和模型一樣,使用分布向?qū)韺⒛_本引入至自定義工具箱中,然后該腳本就會成為您可在模型或其他腳本中使用的另一個工具。系統(tǒng)工具中有多個都是腳本。從技術角度而言,編寫一個腳本但不將其引入工具箱,此時,該腳本便不屬于工具,而僅是磁盤上的一個獨立腳本,在PythonWin下可以運行。
ARCTOOLBOX的“BATCH”可以進行批處理,但是如果源數(shù)據(jù)本身不在同一個文件夾下,仍然需要手動一條一條選擇,很不方便。使用PYTHON 編寫腳本進行批處理是行之有效的方法。日常中需要處理的數(shù)據(jù)目錄格式一般為:D:項目圖幅名層名。批處理時一般需要把項目名稱文件夾下所有圖幅運行一遍。
對于批處理非常重要的一點是遍歷目錄下所有待處理數(shù)據(jù)有兩種基本的方法。
1.利用Python現(xiàn)成的函數(shù),os模塊中walk()可以獲得一個文件夾下的所有目錄名,子目錄名,以及所有文件名。語法如下:
for pathroot,dirnames,filename in os.walk(“D:\workspace”)
其中pathroot 返回所有目錄的路徑名,dirnames 返回所有的子目錄名,filenames返回所有文件名。
2.另外利用Geoprocessor Programming Model 中的Lists,語法如下:
Import arcgisscripting
gp=arcgisscripting.create()
workspaces = gp.listworkspaces(“*”,“Folder”)#獲得項目名稱下的所有圖幅目錄。
fcs=gp.ListFeatureClasses()#獲得圖幅目錄下所有要素類。
例子1:批量裁切矢量數(shù)據(jù)。
import arcgisscripting,sys,os
gp =arcgisscripting.create()
gp.workspace = sys.argv[1]#工作目錄
clipFeatures = sys.argv[2]#用來裁切的矢量數(shù)據(jù)集
outWorkspace = sys.argv[3]#輸出目錄
clusterTolerance = float(sys.argv[4])#容限值
try:
#獲得目錄下所有數(shù)據(jù)集
fcs = gp.ListFeatureClasses()
#循環(huán)所有數(shù)據(jù)集
fcs.Reset()
fc = fcs.Next()
while fc:
try:
outFeatureClass = outWorkspace+"/"+fc
gp.Clip_analysis(fc,clipFeatures,outFeatureClass,clusterTolerance)
fc = fcs.Next()
except:
fc = fcs.Next()
except:
gp.AddMessage(gp.GetMessages(2))
print gp.GetMessages(2)
例子2:多幅圖多圖層批量拼接shape數(shù)據(jù)。
import arcgisscripting,sys,os
gp = arcgisscripting.create(9.3)
gp.workspace = gp.GetParameterAsText(0)
try:
ws = gp.workspace
workslist = gp.listworkspaces("*","Folder")
print workslist
for layer in ["resa","cpta","boua","brga","hfca","hyda","lfca","lrda","rfca","tera","vega"]:
i=0
while i<len(workslist):
works = workslist[i]
out_feat_class = layer+".shp"
if gp.exists(works+"\"+layer+".shp"):
if not gp.exists(out_feat_class):
gp.CreateFeatureclass(ws,layer,"POLYGON",works+"\"+layer+".
print works+"\"+layer+".shp"
print out_feat_class
try:
gp.Append_management(works+"\"+layer+".shp",out_feat_class,"NO_TEST")
i=i+1
except:
i=i+1
continue
else:
i=i+1
except:
gp.AddMessage(gp.GetMessages(2))
print gp.GetMessages(2)
如果用戶常用ARCTOOLBOX進行數(shù)據(jù)處理,可以將以上代碼獲得參數(shù)的語句改為gp.workspace=gp.GetParameterAsText(0),注意從“0”開始,這樣在ArcToolbox 中添加新Toolbox,在Toolbox下添加Script,指向已經(jīng)寫好的腳本文件。上述例子就可以在ARCGIS的Arctoolbox中使用。
以上例子均在ARCGIS9.3、Python2.5 中調(diào)試通過。另外筆者還編寫了批量變換投影信息,批量按圖號分帶,批量轉(zhuǎn)換數(shù)據(jù)格式等多個腳本程序。
綜上,Python 編寫地理批量處理工具簡捷、實用,方便解決工作中的實際問題。掌握Python對日常數(shù)據(jù)處理工作有很大幫助。