基于Python 的数据批处理技术探讨及实现
- 首页 >> Python编程摘要:通过研究ArcGIS 中信息处理技术,以及Python 脚本语言在ArcGIS 中的二次开发技术,介绍了ArcGIS 中数据的批处理工具的开发原理和过程,并且运用这一方法实现了批量裁切、批量拼接、批量定义投影、批量空表删除和批量按属性提取等工具,将其集成成批处理工具箱。使用这种方法开发的批处理工具,弥补了原有批处理工具的不足,使枯燥的数据处理工作自动化、简单化,大大提高了数据处理效率。
在地理信息处理工作中,操作人员接触到的往往是海量数据,而且经常遇到一些重复性的操作,如数据裁剪、拼接、投影变换等地理操作[1]。目前对大批量数据的处理,基本还是靠手工进行,既浪费人力物力,又难以确保数据操作的质量。为了避免重复性工作,数据的批量处理成为数据库系统和数据操作系统中越来越重要的功能[2]。ArcGIS 是目前应用最广泛的GIS 软件,该平台中的ArcToolbox 提供了极其丰富的地学数据处理工具,并且提供有批量处理功能。但是,如果源数据不在同一个文件夹下,则仍然需要一条一条手动选择[3],有很大的局限性。因此对数据批处理技术的研究,显得非常重要。Python 作为一种开源的脚本语言,功能强大,简单易学。从ArcGIS9.0 版本以后,ESRI 公司在众多支持的脚本开发语言中,与Python 达到了全面的集成和兼容。本文研究使用Python 脚本语言来实现数据的批处理。
1 ArcGIS 的地理处理
1.1 地理处理的运行方法在ArcGIS 中,有许多不同的方法可用来完成地理处理任务。用户可以通过4 种方式执行地理处理任务[4,5]:
1)通过对话框运行工具。
2)在命令行运行工具。
3)建立并运行能执行一系列地理处理工具的模型。由于大多数空间数据处理本质上都是交互工具的集合,因此可通过地理处理框架建立空间问题解决方案的自动化流程。模型是数据流图,通过模型可以建立复杂GIS 任务的批处理过程、关联数据和工具,以
产生可编辑、可重用的工作流[6]。
4)创建并运行能执行地理处理工具的脚本。脚本可以在脚本应用程序中运行,也可以添加到工具箱,并像其他任何工具一样,在对话框、命令行、其他模型或脚本中运行。脚本可以以任何与组件对象模型(COM)兼容的脚本语言来编写,例如可以是Python、JScript,也可以是ARC Macro Language(AML)脚本或者可执行文件。本文主要研究通过脚本语言创建并实现地理处理工具。
1.2 地理处理技术方法研究
本文研究的地理处理技术和工具包括空间处理、数据操作和数据转换3 类。以下以矢量裁切、属性提取为例介绍处理命令的用法。
1)矢量裁剪(Clip)。剪辑是一个从要素集中提取要素或部分要素的分析工具,用于从一个要素集使用多边形边界削减要素及其属性。
语法:Clip_analysis<in_features> <clip_features><out_feature_class>{cluster_tolerance}
举例:workspaceE:\arcgis \Geoprocessing\San_DiegoClip_analysis majorrds.shp study_quads.shpstudy_roads.shp
2)按属性提取(Select Layer By Attribute)。
语法:
SelectLayerByAttribute_management<in_layer_or_view>{NEW_SELECTION|ADD_TO_SELECTION|REMOVE_FROM_SELECTION| SUBSET_SELECTION|
SWITCH_SELECTION| CLEAR_SELECTION}
{where_clause}
举例:SelectLayerByAttributestates NEW_SELECTION
"[NAME]='California'"
3)投影变换(Project)。
语法:Project<in_dataset> <out_dataset> <out_coor_
system> {transform_method;transform_method...}{in_
coor_system}
举例: ProjectE:\test_data\dams E:\test_data\dam.shp'd:\
peoject.prj'
2 基于Python 脚本语言的二次开发技术
2.1 Python 脚本语言
Python 是一种不受局限、跨平台、面向对象的开源计算机编程语言,几乎能够在目前所有的操作系统上运行。从ArcGIS9.0 版本以后,ESRI 公司在众多支持的脚本开发语言(JScript, Perl, Python, VBA, VB, C++等)中,与Python 达到了全面的集成和兼容,Python随ArcGIS 软件一同安装。用户能够利用Python 脚本语言在ArcGIS 软件环境中,快速开发出数据批处理脚本,满足数据快速处理的需要[1,3]。
2.2 在Python 中创建地理处理对象
在利用Python 开展地理处理批处理脚本程序时只需要通过引入地理处理模块[7,8],创建地理处理对象,就可以开展程序开发了,主要步骤分以下两步:第一步:导入地理处理模块和创建地理处理对象。import arcgisscripting
# 导入ArcGIS 的地理处理模块;
gp=arcgisscripting.create(9.3)
# 创建ArcGIS 地理处理对象gp ;
第二步:调用脚本对象的属性和方法。
创建了地理处理对象后就可以在脚本中调用对象的属性和方法了,ArcGIS 地理处理对象封装了整个处理代码段,用户只要写出工具执行所需的几个参数就可以实现其功能。例如:
gp.workspac e="c:/Tongass"
# 设定地理处理的工作空间;
output ="c:/St_Johns/data.gdb/roads_Buffer"
# 设定输出路径;
gp. Buffer_analysis(roads, output,"distance", "FULL",
"ROUND", "NONE") # 直接调用地理处理对象的方法
Buffer_analysis 执行地理处理。
2.3 地理数据批处理脚本程序开发
用户在使用地理处理对象Geoprocessor中,一方面可以调用ArcGIS中的地理处理功能、工具和方法;另一方面可以通过Geoprocessor对象的方法创建其他对
象,从而满足地理处理程序开发的需要。在地理数据批处理中,主要包括List(数据罗列)、Describe(数据描述)、Cursor(数据指针)等对象,其中List 方法主要包括listDatasets(数据集列表)、listFeatureClasses(要素列表)、listRasters(获取影像数据集列表)、listTables(属性表列表)、listToolboxes(要素列表)、listWorkspaces(工作空间列表)、listfiles(获取工作空间列表)、listfields(工作空间列表)。
以下代码实现了用一指定的裁切面对某一工作空间下所有影像数据的批量裁切,并将裁切的影像输出到指定目录下。
inputWorkspace = sys.argv[1] # 输入影像数据路径;clipFeature = sys.argv[2] #设定用于裁切的面层;outWorkspace= sys.argv[3] # 设定影像裁切后输出
的工作路径;gp.workspace= inWorkspace # 指定当前的工作路
径;
nodata_value = 255 # 设定裁切后无数据区影像的像素值;
gp.checkoutextension("spatial") #检测地理处理扩展功能是否已打开;
raslist=gp.listrasters() # 对获取工作空间下影像数据集列表;
for ras in raslist: # 遍历影像数据集并获取每一个影像要素;
if not gp.exists(outWorkspace): # 确定输出空间是否存在;
try:
gp. clip_management (ras,clipFeature,outWorkspace)
# 调用影像裁切命令,执行裁切任务;
except: # 运行出错时提示错误信息
gp.getmessages()
2.4 批处理工具的实现
以下以批量拼接、按属性提取功能,对处理工具的功能描述、执行的条件和关键代码进行分析和介绍。1)批量拼接(矢量)。①功能描述:实现了对某一目录下的所有GDB 格式的空间矢量数据的批量自动拼接处理。②执行的条件:输入工作目录,工作目录下放置多个*.MDB 或*.FGDB 格式的空间数据文件。③核心代码:
for workspace in workspaces:
workp = str(workspace)
print workp
gp2.workspace = workp # 遍历每个MDB 数据集
的FeatureClasses;
李强等:基于Python 的数据批处理技术探讨及实现
·56·地理空间信息第 13 卷第 2 期
fclist = gp2.ListFeatureClasses();
for fc in fclist:
Str_Featureclass = workp + "\\" +str(fc)
print Str_Featureclass
gp2.append_management(Str_Featureclass,out_
Location + "\\pingjie.mdb" +"\\" + fc ,"NO_TEST")
2)批量按属性提取。①功能描述:实现了对某一目录下所有GDB 格式的空间矢量数据,以指定的数据图层和SQL 语句批量提取要素。②执行的条件:输入工作目录,工作目录下放置多个*.MDB 或*.FGDB 格式的空间数据文件,然后指定要提取的图层和SQL 语句。③核心代码:
for workspace in workspaces: # 遍历输入空间下的
MDB 数据集
print workspace
workp = str(workspace)
print workp
npos = str(workp).index('.') # 获取MDB 图号
startpos = len(inputpath)
tuhaoname = workp[startpos+1:npos]
gp2.workspace = workp
fclist = gp2.ListFeatureClasses(); # 遍历每个MDB
数据集的FeatureClasses;
for fc in fclist:
if fc == myFeatures:
gp1.CreatePersonalGDB(out_Location,tuhaoname)
#outputfile = "pingjie.mdb"
out = out_Location + "\\" +tuhaoname + ".mdb" +
"\\" + str(fc)
gp2.select_analysis(fc, out ,sqlyuju)
3 地理批处理工具集开发和集成
为了更好地使用脚本程序,可以将编写的脚本程序添加到ArcGIS 的Arctoolbox 工具中,把脚本作为系统工具,并自定义数据批处理工具集,如图1 所示。自定义工具集能够为用户提供友好的界面调用脚本程序,同时也方便脚本程序的管理,而且能够在工具中设置参数,包括工具对话框中显示的名称、工作空间、输入输出的名称和数据类型等,在创建脚本工具时通过图2 设置裁切工具调用时的参数输入,包括输入工作空间、裁切要素、输出工作空间等参数。
图1 自定义处理工具图2 脚本工具参数设置图
4 结语
本文通过介绍Python 脚本语言在地理处理中的应用,实现了一系列复杂地理处理过程的批处理工具,包括批量裁剪、批量按属性提取、批量投影、批量投影转换、批量删除空表等工具,并且在甘肃省基础地理信息中心的支持下,进行了大量测试,实验表明作者开发的批处理工具对提高数据处理和整合的速度和效率有很大作用。Python 是一种简单易学、功能强大、实用的解释性脚本语言,与ArcGIS 软件达到了完美的融合与集成。在实际工作中,利用Python 开发地理数据批处理脚本程序,配置简单、效率高、方便实用,能够大大减少
地理数据处理工作中的重复性劳动,减少手工操作的工作量,对今后公共地理信息在线服务数据的生产和加工、地理国情监测中涉及的地理统计分析工作具有重要的应用价值。