时间:2024-05-04
谷正楠 张震
摘要:针对以往GIS设计与开发课程教学中,学生对于编程语言畏难的问题,本文设计一个基于ArcPy的GIS数据批处理程序教学实验,以批量裁剪栅格数据为例,详细阐述了程序设计的具体思路及过程,旨在为学生自主设计实用的批处理程序提供参考,同时提高学生对GIS开发的自信,培养学生对GIS开发的兴趣,加深学生对GIS开发的认识,强化学生的GIS开发能力,为以后的编程学习奠定基础。
关键词:ArcPy;GIS数据;批处理;程序设计;开发
中图分类号:G642 文献标识码:A
文章编号:1009-3044(2021)18-0114-03
开放科学(资源服务)标识码(OSID):
Teaching Experimental Design of GIS Data Batch Processing Program Based on ArcPy
GU Zheng-nan, ZHANG Zhen
(School of Geomatics, Anhui University of Science and Technology, Huainan 232001, China)
Abstract:For the current problem that students were afraid of programming language in the past teaching of GIS design and development courses, this article designs a teaching experiment of GIS data batch processing program based on ArcPy. Taking batch cropping of raster data as an example, the specific ideas of program design are explained in detail. The purpose of this process is to provide a reference for students to design practical batch processing programs independently, and at the same time improve students confidence in GIS development, cultivate students interest in GIS development, deepen students understanding of GIS development, and strengthen students GIS development capabilities. Lay the foundation for future programming learning.
Key words:ArcPy; GIS data; batch processing; program design; development
1 引言
GIS開发是地理信息科学专业重要的专业基础课程[1-2],以往的授课多以ArcGIS Engine教学为主,学生编程基础薄弱,会对开发产生畏难情绪[3],而Python语言简单易学且编程灵活[4],有助于学生轻松上手。ArcPy是基于ArcGIS的Python站点包,通过调用ArcPy,可以开发出大量的用于处理GIS数据的实用程序[5],既可以解决传统的ArcMap软件处理GIS数据效率低、处理速度慢且容易出错等问题[6-7],又可以培养学生对于GIS开发的积极性,加深学生对开发的认识,锻炼学生的开发能力。因此,在传统ArcGIS Engine教学前,引入基于ArcPy的GIS数据批处理实验,有助于提高学生对开发的自信,拓宽学生对开发的视野,为以后的编程学习奠定基础。
本文设计基于ArcPy的GIS数据批处理程序教学实验,旨在让学生学习和掌握Python和ArcPy程序设计的基础知识与GIS二次开发技术相关的理论知识,并引导学生在以后的学习中自主开发实用的批处理程序。
2 ArcPy简介
ArcPy是继承ArcGIS 9中arcgisscripting模块的基础上,在ArcGIS 10中引入Python站点包发展而成[8-9]。它的出现为用户在ArcGIS平台上更便捷的使用 Python 语言操作提供了可能。通过调用ArcPy站点包,不仅可以访问所有地理处理工具(包括扩展模块),还可以调用多种有用的模块、函数和类,便于快速查询和批量处理GIS 数据。
3 GIS数据批处理实验方案设计
3.1 实验设计思路
实验设计以栅格数据批量裁剪为例,通过详细演示实验步骤,引导学生根据实验设计方案,选择ArcToolbox中其他工具完成实验。采用由浅入深的教学方法,详细介绍栅格数据批量裁剪的思路,该思路对学生理解其他工具批处理操作具有重要的指导意义。
3.1.1 栅格数据裁剪思路
“帮助”是学习GIS开发最好的资料,在实验中辅导学生根据“帮助”依次完成操作。虽然本课程的授课学生都具有ArcGIS操作的基础,但缺乏对ArcGIS“帮助”中代码的使用意识。本实验以栅格初级裁剪为例引导学生查看“帮助”。
首先指导学生打开ArcToolbox中的栅格裁剪工具,查看“帮助”,复制下面这一行代码:
arcpy.Clip_management(
"c:/data/image.tif","1952602 294196 1953546 296176", "c:/data/clip.gdb/clip01","#","#","NONE","NO_MAINTAIN_EXTENT")
并将其拷贝到ArcMap的Python窗口中。根据“帮助”文档:第一个参数和第四个参数分别是输入的栅格数据和矢量数据,需要将其更改为自己的存储路径及数据名称;第二个参数是裁剪范围的坐标,按照X-Minimum,Y-Minimum,X-Maximum,Y-Maximum的顺序存储,打开ArcMap中的Clip工具,按照步骤将矢量数据导入便可以看到矢量数据的矩形范围,按照顺序更改该参数的数值;第三个参数是数据裁剪后的输出路径及数据名称,同样将其更改为自己的存储路径及保存名称;第五个参数是设置缺失值,可以将其设置为0,也可以保持默认(#为默认值)设置;第六个参数是选择裁剪的几何形状,有两个值可选择,NONE代表按照输入数据的最小矩形范围裁剪,ClippingGeometry代表按照输入矢量数据的几何形状进行裁剪,这里选择ClippingGeometry方式裁剪;第七个参数是选择是否要调整裁剪范围,同样有两个值可选择,MAINTAIN_EXTENT代表按照矩形范围进行裁剪,NO_MAINTAIN_EXTENT代表调整为按照输入矢量数据的几何形状进行裁剪,这里选择 NO_MAINTAIN_EXTENT。需要注意的是,即使第六個参数选择的是ClippingGeometry,若第七个参数选择MAINTAIN_EXTENT,结果也将是按照矩形范围进行裁剪。
所有参数设置完成后,运行代码,即可得到栅格数据的处理结果,如图1所示:
该方法虽然能够正确实现栅格数据裁剪,但每次都需要重新写入代码,耗时耗力。因此,引导学生将“帮助”文档里的所有代码复制到IDLE的脚本文件里:
import arcpy
arcpy.env.workspace = "C:/Workspace"
arcpy.Clip_management(
"c:/data/image.tif","1952602 294196 1953546 296176", "c:/data/clip.gdb/clip01","#","#","NONE","NO_MAINTAIN_EXTENT")
其中,arcpy.env.workspace为设置工作空间,即将其路径设置为待处理栅格数据的存储路径,并将Clip_management( )函数的七个参数按照前文所述的步骤进行修改。值得注意的是,每次运行代码时都需要去查找矢量数据的矩形范围,很不便捷。
接下来引入Describe( )函数的概念,指导学生在“帮助”中找到Describe( )函数。ArcPy中的Describe( )函数可以访问不同数据集和数据集的不同属性对象,包括输入数据集的数据类型、空间参考、要素范围以及属性字段等。基于此,通过该函数的extent属性来访问输入矢量数据的矩形范围。修改后的代码为:
import arcpy
arcpy.env.workspace = " D:/data"
clipFeature = "D:/data/clip.shp"
raster = "D:/data /image.tif"
outraster = " D:/result.gdb/clip"
desc = arcpy.Describe(clipFeature)
extent = desc.extent
arcpy.Clip_management(
raster , str(extent), outraster, clipFeature , "#","ClippingGeometry" ,"NO_MAINTAIN_EXTENT")
同时思考:如何基于以上程序,对多幅影像实现批量裁剪?
常规思路:循环与if语句相结合,通过对扩展名进行筛查的方式获取目标数据。
ArcPy提供的思路:利用ArcPy中提供的一系列列表函数。
3.1.2 批处理思路
首先在“帮助”文档里找到ArcPy提供的函数,打开列表数据(Listing data),浏览Arcpy提供的九个列表函数。列表函数可以根据指定条件进行搜索,列出所有符合条件的数据,并以列表的形式返回。如处理矢量数据可以采用ListFeatureClasses( )函数,处理字段类型数据可以采用ListFields( )函数,处理文件类型的数据可以采用ListFiles( )函数等。这里处理的数据为栅格数据,故采用ListRasters( )函数,同样将下面的代码复制到脚本文件里:
rasters = arcpy.ListRasters("*", "GRID")
for raster in rasters:
ListRasters( )函数包括wild_card和raster_type两个参数,分别代表文件名称和类型。将上面代码的文件类型更改为tif,即可列出文件夹中所有.tif格式的栅格数据,再结合for循环,即可实现数据的批处理。修改后的代码为:
import arcpy
import os
arcpy.env.workspace = " D:/data"
clipFeature = "D:/data/clip.shp"
rasters = arcpy.ListRasters("*", "tif")
for raster in rasters:
outraster= "D:/result.gdb/" + os.path.splitext(raster)[0] + "_clip"
desc = arcpy.Describe(clipFeature)
extent = desc.extent
arcpy.Clip_management(
raster , str(extent), outraster, clipFeature , "#","ClippingGeometry" ,"NO_MAINTAIN_EXTENT")
这里用到了os包提供的splitext( )函数,该函数可以将文件名与扩展名分离出来,从而实现为每一个输出影像不重复命名。
3.1.3 程序界面设计
将编写完成后的程序打包为ArcGIS中地理处理工具形式的Toolbox,便于下次处理数据时直接使用。同时注意,上述代码都是直接指定路径的,若想实现与用户的交互操作,還需要引入GetParameterAsText( )函数,该函数可以以字符串的形式获取输入数据和输出数据的路径。因此完成代码的最后一步是要将上述代码的所有路径更改为arcpy.GetParameterAsText(i)(i按照先后顺序赋为0,1,2…),然后在ArcMap中新建一个Toolbox,并将脚本文件导入Toolbox,设置相应参数。最后设计的程序界面如图2所示:
根据该程序,裁剪栅格数据(.tif格式)时,只需要输入栅格数据的存储路径、裁剪范围(.shp文件)并选择裁剪结果的保存路径即可。
3.2 学生实验实施与效果
本实验的最终目的是帮助学生快速理解在ArcGIS平台中Python和ArcPy的开发方式、掌握ArcPy批处理程序并提高学生的GIS开发能力。基于此,在对2017级地理信息科学专业的学生进行基于ArcPy的GIS数据批处理程序教学实验设计的课程后,让学生根据上述实验,在ArcToolbox中选择任意工具(不得重复选择)设计批处理程序并撰写实验报告。
结果表明,通过本次实验,多数学生已经认识到了ArcPy功能的强大以及批处理程序设计的便捷,实现了对ArcPy的入门,并有兴趣继续学习程序设计,以便在未来的学习中可以解决更多问题。
4 结束语
本文基于ArcPy站点包,设计了一个批量裁剪栅格影像的程序,通过该程序可以使学生更直观、清楚的了解到基于ArcPy设计批处理程序处理GIS数据的快速、高效,也可以培养学生对于程序设计的兴趣。同时,本程序设计的方法、思想也同样适用于基于ArcPy的其他批处理程序设计,可以为学生自主开发批处理程序提供参考,提高学生的GIS开发能力。
参考文献:
[1] 姜建武,李景文,陆妍玲,等.普通本科GIS专业技术开发类课程教学探讨[J].中国教育技术装备,2019(6):95-97.
[2] 马晓哲,张晓萱,耿文均.高校GIS专业软件开发课程教学现状及革新[J].高师理科学刊,2019,39(6):98-101.
[3] 胡最.地方高校GIS专业程序设计技能培养[J].地理空间信息,2020,18(12):58-62,7.
[4] 杨彩云,詹国华.引导性问题案例在Python数据分析基础课程的教学[J].计算机教育,2021(1):154-157,162.
[5] 周崴,徐东炯,沈丽娟.基于Python和ArcPy的专题图批量制作方法[J].测绘与空间地理信息,2020,43(10):17-20.
[6] 曹斌.基于ArcPy的矢量数据批处理方法研究[J].科技创新与应用,2017(21):90,92.
[7] 段春华,高磊.基于ArcPy的图斑影像批量截图方法研究[C]//江苏省测绘地理信息学会2020年学术年会论文集.南京,2020:113-115.
[8] 邱世平,潘立仁,韦建飞.基于ArcGIS数据驱动页面与Python脚本语言的专题图批量出图技术研究[J].林业调查规划,2020,45(2):15-20.
[9] 杜宁,刘国栋.基于Arcpy与ModelBuilder批量提取栅格数据属性表模型实验的分析[J].重庆建筑,2020,19(3):13-14.
【通联编辑:王力】
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!