汪元超
(成都市国土规划地籍事务中心,四川 成都 610032)
在勘测定界中,生成专用格式的界址点坐标交换文件,通常的做法是从ArcGIS导出为CAD,将提取的坐标在Excel中编辑后输出到文本文件,再编辑相关的表头和其他信息,这种方法操作繁琐、容易出错、效率低下,也有利用ArcGIS自带的模型构建器或其他语言实现了这种文件的输出,但上述方法都存在自动化程度不高、操作繁琐,不支持多部件、多边形岛(挖孔)等特殊格式的缺陷,为解决这些痛点,并提高工作效率和成果质量,有必要研究如何完美实现勘测定界界址点坐标TXT文件快速输出。
界址点坐标交换文件是原国土资源部制定的以纯文本格式明文存储,以便于读取和管理的标准文件格式。最早是应用于建设用地备案中,后陆续用于制作电子报盘数据、增减挂钩备案、土地开发整理等,是自然资源系统(原国土系统)内广泛使用的一种数据交换文件。
该文件包括文件头属性描述、地块坐标两大块。文件头属性描述为12行的固定格式,格式如图1所示的文件实例。地块坐标部分根据具体的地块数量为行数不定的数据块,其中每一个数据块由该地块的属性描述和该地块的节点坐标组成,地块的属性描述格式为“界址点数,地块面积,地块编号,地块名称,记录图形属性(点、线、面),图幅号,地块用途,地类编码,@”,节点坐标的格式为“点号,地块圈号,X坐标,Y坐标”。需要特别注意以下几点:
(1)地块属性描述中的“地块面积”单位为公顷,需保留4位有效数字。
(2)节点坐标中的“X坐标”“Y坐标”为测量学中定义的坐标轴,分别代表北坐标和东坐标,与ArcGIS、CAD和数学上定义的坐标轴相反。
(3)地块必须闭合,每个地块的最后一个坐标和该地块的第一个坐标一致。
(4)对于有扣挖的宗地,扣挖出来的地块需要使用不同的圈号来表示(如图2所示:一个矩形内部挖掉了一个三角形和一个五边形,矩形的圈号为1,内部的三角形和五边形的圈号在1后面顺序递增,分别为2和3)。
图1为图2所示图形输出后的文件格式实例。
图1 文件格式示例图
图2 示例图形
Python是一种通用的支持动态输入的面向对象的解释型语言,它简洁易读、易于学习、易于扩展,已成为最流行最热门的编程语言。
ArcPy是以ArcgisScripting模块为基础并继承了其功能进而构建的Python站点包。目的是以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础。
用ArcPy编写ArcGIS应用程序的优势在于,它不仅完整继承了Python的易学、易用、易扩展的特性,还能够完整使用ArcGIS自带的很多工具包,使初学者能够快速入门并编写具有复杂功能的附加模块。
本文编写的相关代码利用了ArcGIS内部的Polylgon对象,因此首先需要了解Polygon对象的相关特性和数据结构。
Polylgon对象是一个或多个Ring对象的有序集合,它可以由单个Ring对象构成,也可以由多个Ring组成。其数据结构如图3所示。
图3 Polylgon对象数据结构示意图
从这张图上可以看出Polygon是Rings构成,而Ring又是由Segment构成,Segment包含线(Line)、圆弧(Circular Arc)、椭圆弧(Elliptic Arc)、贝塞尔曲线(Bezier Curve)4种类型的曲线,这4种曲线都是由Points坐标集合构成。在代码实现的过程中,我们只需要按照这个数据结构构造出Points坐标集合即可。需要注意的是,组成Polygon的是Ring,其中Ring可以分为OuterRing(外环)和InnerRing(内环)。外环和内环都是有方向的,它们的区别是外环的方向是顺时针的,内环的方向是逆时针的。如图4所示。
图4 Ring的内外环示意图
以图2为例,图中包含2个地块,通过数据访问模块“da.SearchCursor”按行逐条读取数据,可以直接获得要素的节点个数和面积属性。而对于节点坐标,尤其是图2右侧地块这种有挖孔的多边形岛形式(挖孔)的地块,很多文献中是无法处理的,或者处理的方法冗长,这里笔者经过反复调试,通过将读取的每一条要素转成JSON格式再通过字典转成List数组的形式,实现快速读取要素内部部件的每一个节点坐标,除开前面几行固定需要写入的文件头属性描述,核心的节点坐标输出功能只用了20多行代码,整体代码块一共50行即实现了相关功能,充分体现了ArcPy简洁、高效的特性。数据处理流程如图5所示,完整代码如下。
图5 文件输出处理流程图
文本给出了完整的代码,基于ArcPy实现了界址点坐标交换文件的快速输出。相比手动编辑或其他方法,主要的改进和提升:
(1)完美支持多部件、多边形岛(挖孔)等各种特殊格式。
(2)自动化程度高,不需要人工干预。
相关代码已大量运用于实际工作项目中,相比其他方法极大提高了效率和准确性,以前编辑一个地块需要3~5 min,现在只需要不到10 s。
本文仅用不到50行代码即实现了上述功能,充分体现了ArcPy简洁、高效的特点。用ArcPy编写ArcGIS应用程序的优势在于,它不仅完整继承了Python的易学、易用、易扩展的特性,还能够完整使用ArcGIS自带的很多工具包,使初学者也能够快速入门并编写具有复杂功能的附加模块。本文为ArcPy应用于各种矢量和栅格数据的批处理提供了一些方法和思路。