无锡水文工程地质勘察院有限责任公司
【摘 要】本文结合测绘地理信息业务中坐标构面这一常见需求,介绍了基于Python语言通过调用ArcPy站点包在ArcGIS平台下完成脚本工具封装的方法。文章介绍了传统坐标构面方法存在的问题、脚本工具处理数据的实现、工具封装及其优点等为读者提供了一种可行高效的解决思路。
【关键词】坐标构面 Arcpy 脚本工具 ArcGIS
在测绘地理信息业务中,技术员经常遇到将大量坐标创建成面状要素的需求,但是在目前市面上却很难找到一款便捷可靠的工具来实现这一功能。在ArcGIS平台下,传统解决方法需要大量的人工交互、数据转换和逻辑检查才能完成。然而ArcGIS对Python语言的引入及Arcpy站点包的提供,为用户自己开发出满足相关功能的工具提供了便利。
ArcGIS因其强大的功能和优异的可扩展性,在测绘地理信息从业者中有着广泛的应用。尽管如此该平台在面对处理大量坐标构面这一需求时仍显得不够灵活,其常见的处理方法如下:
在ArcMap桌面组件完成坐标文件的读取和点要素创建;
利用点集转线脚本工具,创建线要素;
利用要素转面工具,调用线要素构面;
检查与修改。
上述方法虽然能完成坐标文件向面要素的创建,但却存在一定的不足,具体表现在以下方面:首先是处理流程长,对从业者要求较高;其次在完成环岛面创建时会出现拓扑错误,无法创建出面要素中的空洞;再次是创建重叠面时会出现拓扑错误,重叠区域会创建成独立面;最后成果需要人工检查和修改拓扑问题,删除过程数据等。有此可见传统作业方法存在较多问题且效率较低。
Python语言因为其简单易学、免费开源、跨平台、解释性、面向对象等特点受到广大开发者青睐,ArcGIS平台从9.0版本起引入了python,并在10.0版本后提供了ArcPy站点包,此站点包提供了大量的模块、类和函数,通过它们用户可以访问ArcGIS所有的地理处理工具。自此用户可以利用ArcPy兼取Python语言的优点和ArcGIS强大的功能,完成地理处理工具的自由拓展。
本文工具基于ArcGIS10.2平台自带的python2.7解释器,脚本采用PyCharm编写调试,具体的实现方法如下文所述:
程序以读取模式打开txt文本并获取文本内的全部数据,文本数据规定为四列,依次分别是地块编号、地块内折点序号、横坐标、纵坐标,每个字段间用逗号隔开。代码实现如下
coords = open(input,"r")
coordlines = coords.readlines()
用代码创建一个空的面状要素并由插入游标打开,用于逐条插入后续实例化出的面对象。创建面状要素要传入三个参数分别是路径名称、要素层名称、坐标系名称,其中后者是可选参数,插入游标只需要获取几何令牌"SHAPE@",其实现代码如下:
arcpy.CreateFeatureclass_management(os.path.dirname(output), os.path.basename(output),"POLYGON",
spatial_reference=pro)
cursor = arcpy.da.InsertCursor(output, ["SHAPE@"])
利用for循环,逐条遍历每一条坐标。将每条记录用Point类实例化成一个点对象,并把点对象用追加的方式逐个写入到事先准备好的空数组中,当下一条记录的地块编号改变时,停止写入,用Poygon类调用上述数组实例化出面对象,并将此面对向通过插入游标写入面图层。随后清空数组,继续遍历下一个地块的坐标直至遍历结束。其主要代码如下:
array = arcpy.Array()
ID = -1
for xy1 in coordlines:
xy=xy1.split(",")
if ID == -1:
ID = xy[0]
if ID != xy[0]: #当前的ID不等于之前的ID时,即当前地块遍历结束
cursor.insertRow([arcpy.Polygon(array)]) #创建并由游标写入面。
array.removeAll()
array.add(arcpy.Point( ID=xy[0],xy[2], xy[3])) #把点对象追加入数组
ID = xy[0]
cursor.insertRow([arcpy.Polygon(array)]) #处理最后一个面。
2.2、脚本工具的封装
上述脚本虽然能解决坐标构面的问题,但仍不够友好,因为用户至少要满足两个条件,一是当前电脑要有匹配的集成开发环境(IDE);二是用户要有python基础来完成代码参数传入。为提升用户体验本文在ArcGIS平台中进一步完成脚本工具封装。
在ArcCatalog的My Toolboxes中平台提供了自定义工具箱功能,在工具箱中添加新的脚本工具,依次完成工具名称、标签、描述、代码导入、输入及输出参数设置后完成工具封装。在参数设置环节,另需要将代码中的传入方法改写成以下方式:
input= arcpy.GetParameterAsText(0) #传入txt坐标文档
output = arcpy.GetParameterAsText(1) #指定输出的面要素
pro = arcpy.GetParameterAsText(2) #指定面要素的坐标投影
最后一个是可选参数,在工具使用中,用户需确保指定的坐标系统与待处理坐标在空间位置上匹配,否则会导致面写入失败。工具封装完成后,在项目描述中添加必要的功能和使用说明。
图:脚本工具截面
经实际工作检验,基于ArcPy的坐标转面工具与传统计算方法比较有以下优点:①、解决了传统作业方法创建环岛面、重叠面的拓扑错误问题,成果无需要对应的检查修改。②、与分步计算相比节省大量精力和时间、降低了数据处理的技术门槛。③、避免了过程数据的产生。
参考文献:
[1] ArcGIS帮助文档 10.2.
[2][美]Paul A.Zandbergen著 李明巨 刘昱君 陶旸 张磊译,面向ArcGIS的Python脚本编程,人民邮电出版社,2016.
作者信息:俞昌华
注册单位:无锡水文工程地质勘察院有限责任公司
寄件地址:江苏省无锡市滨湖区周新苑280号立信大厦11层