ARCGIS中应用Python脚本进行空间数据批量处理的研究与实现
2012-08-15河南省基础地理信息中心
河南省基础地理信息中心 石 晶
河南省遥感测绘院 郭子珍
河南省基础地理信息中心 李小勇
ARCGIS 是美国环境系统研究所ESRI(Environment system Research Institute)推出的一套完整的软件产品,旨在构建完善的GIS(Geographic Information System)系统。
利用ARCGIS进行空间数据执行空间分析、建模、数据处理任务过程中,几乎所有操作都会涉及重复的工作,例如数据格式转换,裁切拼接,投影变换等。如果采用人工处理,效率低并且容易出错,为了保证数据质量,减少重复劳动,需要创建可自动执行批量处理的方法。
空间数据的地理处理是以数据变换的框架为基础。典型的地理处理工具会在ArcGIS 数据集(如要素类、栅格或表)中执行操作,并最终生成一个新数据集。每个地理处理工具都用于对地理数据执行一种非常重要的小操作,例如将数据集从一个地图投影中投影到另一个地图投影中、向表中添加字段或在要素周围创建缓冲区。在ArcGIS 中包含了数百个此类地理处理工具。
在软件编程领域中,语言可基本分为两类:系统语言和脚本语言。系统语言是诸如C++和.NET,用于通过计算机的低级图元和原始资源从底层开发应用程序。脚本语言(例如Python和Perl)用于将多个应用程序组合到一起,该语言使用计算机内置的高级功能,回避了系统语言编程程序必须处理的具体细节。与系统语言相比,脚本语言更加易学易用,对编程有基本的了解便足以很好地使用它们。
一、空间数据
与空间位置有关的地理数据,按组织形式分为矢量数据和栅格数据两大类。在ARCGIS中,常用的矢量数据有:Coverage,Shapefile 和Geodatabase,这几种都是ARCGIS 的原生数据格式,在ARCGIS中使用最多。
二、Python简介
Python是一种不受局限、跨平台的开源编程语言,它功能强大且简单易学。因而得到了广泛应用和支持。ArcGIS 从9.0 开始中引入了Python。此后,Python被视为可供地理处理用户选择的脚本语言并得以不断发展。Python的部分优势为:易于学习,非常适合初学者,也特别适合专家使用;可伸缩程度高,适于大型项目或小型的一次性程序(称为脚本);可移植,跨平台;可嵌入(使ArcGIS可脚本化);稳定成熟;用户社区规模大。
Python已延伸到ArcGIS中,成为了一种用于进行数据分析、数据转换、数据管理和地图自动化的语言,有助于提高工作效率。
三、空间数据批处理
在ARCGIS的地理处理框架中,脚本与模型都可用来创建新工具。模型是使用可视化编程语言(模型构建器)创建的;而脚本是使用基于文本的语言和文本编辑器创建的。和模型一样,使用分布向导来将脚本引入至自定义工具箱中,然后该脚本就会成为您可在模型或其他脚本中使用的另一个工具。系统工具中有多个都是脚本。从技术角度而言,编写一个脚本但不将其引入工具箱,此时,该脚本便不属于工具,而仅是磁盘上的一个独立脚本,在PythonWin下可以运行。
ARCTOOLBOX的“BATCH”可以进行批处理,但是如果源数据本身不在同一个文件夹下,仍然需要手动一条一条选择,很不方便。使用PYTHON 编写脚本进行批处理是行之有效的方法。日常中需要处理的数据目录格式一般为:D:项目图幅名层名。批处理时一般需要把项目名称文件夹下所有图幅运行一遍。
对于批处理非常重要的一点是遍历目录下所有待处理数据有两种基本的方法。
1.利用Python现成的函数,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:批量裁切矢量数据。
import arcgisscripting,sys,os
gp =arcgisscripting.create()
gp.workspace = sys.argv[1]#工作目录
clipFeatures = sys.argv[2]#用来裁切的矢量数据集
outWorkspace = sys.argv[3]#输出目录
clusterTolerance = float(sys.argv[4])#容限值
try:
#获得目录下所有数据集
fcs = gp.ListFeatureClasses()
#循环所有数据集
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数据。
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进行数据处理,可以将以上代码获得参数的语句改为gp.workspace=gp.GetParameterAsText(0),注意从“0”开始,这样在ArcToolbox 中添加新Toolbox,在Toolbox下添加Script,指向已经写好的脚本文件。上述例子就可以在ARCGIS的Arctoolbox中使用。
以上例子均在ARCGIS9.3、Python2.5 中调试通过。另外笔者还编写了批量变换投影信息,批量按图号分带,批量转换数据格式等多个脚本程序。
综上,Python 编写地理批量处理工具简捷、实用,方便解决工作中的实际问题。掌握Python对日常数据处理工作有很大帮助。