刘 雄,李 宇,陈 刚
(中国地质大学(武汉)信息工程学院,湖北 武汉 430074)
Arcpy支持下的线要素几何自动接边与属性检查
刘雄,李宇,陈刚
(中国地质大学(武汉)信息工程学院,湖北 武汉 430074)
由于客观条件所限或为了提高工作效率,线状矢量数据的采集通常采用分人员分区域方法进行采集,这导致后期数据接边工作繁琐且容易出错。为提高线状数据接边效率和质量,本文基于Arcpy编写了几何自动接边和属性检查Python脚本工具,实现了线状矢量数据自动匹配功能并能提示对应不一致属性,提高了接边效率和成果质量,减轻了工作人员工作强度。在第一次全国地理国情普查中的应用验证了方法的可靠性。
Arcpy;自动匹配;几何接边;属性检查;地理国情
线状矢量数据的生产常采用分幅分区域生产,因此容易造成跨图幅的线状要素的断裂[1],而且容易导致线状数据很难在几何上完全对应[2],属性也可能存在差异。因此,生产的数据需要进行后期处理,常规数据处理办法是通过人工手动对几何位置进行调整,保证位置对应,然后逐属性进行比对以确保属性一致。对于一些数据接边,不仅要求两边数据对应位置、属性一致,而且还要求两边数据同时处于接边边界上,这就要求工作人员非常耐心,对数据进行反复调整、检查,以保证接边成果质量。针对接边常见问题,本文基于ArcGIS中的Arcpy,进行Python脚本工具编写,实现数据自动几何接边,而且生成属性不一致定位矢量数据以便工作人员进行属性检查。由于脚本工具充分利用ArcGIS已有的分析工具,因此易于实现。工具在第一次全国地理国情普查中得到了实际应用。
Python作为一种通用的开源编程语言,易于学习和使用,在ArcGIS地理处理中用作脚本语言[3]。而ArcGIS中Arcpy站点包,是为以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础[4]。基于Arcpy编写Python脚本工具可以充分利用ArcGIS已有的分析工具,大大减小程序编写难度,同时也提高了运行效率[5]。
一般情况下数据接边包括几何位置对应一致和各字段属性一致。几何接边要求包括:①待接边数据在一定容差范围内处于接边界线上;②待接边数据几何位置差值不超过容差[6-9]。完成几何接边之后,进行属性检查,即对数据进行属性一致性判断。在获取待接边数据属性后,逐一对各属性进行比对,对属性不一致要素生成定位文件,并记录不一致属性内容。
1. 几何接边
几何接边不仅要求接边数据端点位于接边界线上,而且对应数据端点位置小于容差。因此,在实现几何接边过程中,需要同时处理以上两个问题。
(1) 接边数据预处理
由于工作人员操作或其他原因,本该位于接边界线上的数据可能不是严格位于边界线上,出现如过伸线、未及线现象。因此在进行数据接边前需要对数据进行预处理,使本应该在边界线上的要素严格位于边界上。利用ArcGIS中已有的“修剪线”和“延伸线”工具完成数据预处理。对应Python语句如下:
arcpy.TrimLine_edit(in_features,myDistance,"DELETE_SHORT")
arcpy.ExtendLine_edit(in_features,myDistance,"FEATURE")
其中,in_features为待预处理的接边数据;myDistance为用户给定的修剪、延伸范围值。
(2) 获取待接边点列
通过上述操作完成了数据预处理。由于直接操作线要素会比较麻烦,因此本文采用操作点的方式实现对线要素进行操作[10]。
为了获取边界线上的点列,首先需要将线要素进行“要素折点转点”操作,将获取的点要素类与边界线进行相交处理,获取的点要素类即为接边数据边界点列,调用语句分别为:
arcpy.FeatureVerticesToPoints_management(in_features,point_features,"BOTH_ENDS")
arcpy.Intersect_analysis([point_features,Edge_features],Ipoint_features,"ALL")
其中,in_features为经过预处理后的待接边数据;Edge_features为接边边界线。
(3) 自动匹配序对
由于待接边数据都有实际的现实意义,因此,在对待接边数据进行点列匹配时,按照距离最近进行匹配是可行的。通过调用“近邻分析”对数据进行自动匹配并生成“空间校正”所需的链接文件,其具体调用语句如下:
arcpy.Near_analysis(Apoint_features,Bpoint_features,search_radius,"LOCATION","NO_ANGLE")
数据A和B为待接边数据,其中Apoint_features为待接边数据A在边界线上的点列,Bpoint_features为待接边数据B在边界线上的点列,search_radius为指定用于搜索候选邻近要素的半径。
(4) 生成链接文件
利用已经经过“近邻分析”处理的数据,生成链接文件。
DataRow=[]
for row in arcpy.da.SearchCursor(Apoint_features,["SHAPE@XY","NEAR_DIST","NEAR_X","NEAR_Y"]):
DataRow.append(row)
output=open('ListData.txt′,′w′)
i=1
for row in DataRow:
if row[1]>0:
gx,gy=row[0]
sx=row[2]
sy=row[3]
StrData=str(i)+′ ′+str(gx)+′ ′+str(gy)+′ ′+str(sx)+′ ′+str(sy)+′ ′
output.writelines(StrData)
i=i+1
output.close()
(5) 几何接边
对生成的链接文件,利用空间校正工具,完成几何接边。几何接边详细步骤如图1所示。
2. 属性检查
对于上述已经完成几何接边的数据,需要对各接边属性进行比对,保证属性一致性。为了便于用户能够快速了解到各字段不一致属性,本文在属性判断的同时生成定位点。创建点要素类语句如下:
arcpy.CreateFeatureclass_management(out_path,out_name,"POINT","","","",mySRef)其中,out_path为创建点要素类输出位置;out_name为要素类名称;mySRef为输出要素数据集的空间参考。
图1 几何接边流程
为了便于操作,本文采用端点代替线要素的方法进行检查。与上述几何接边一样,利用“要素折点转点”获取线要素端点,将获取的端点与边界线进行相交处理,获取边界线上的点列代替线要素。然后按照一定容差对两边点列进行匹配,并对属性字段进行逐一比对,输出属性不一致字段。
由于部分数据不仅要求属性字段一致,而且线条方向也要一致,如水系线,这就需要对接边数据方向进行判断,本文采用的方式是将获取的线要素终点与上面获取边界线上的端点进行位置比对,以确定方向一致性。线要素方向存在4种可能,如图2所示。
图2 4种接边方向情况
图2中,箭头和深灰点表示终点,浅灰点表示接边线上的端点,竖向线条表示接边界线。对图2(b)(c)(d)中终点进行了位置挪动,以便绘制。上述4种情况中,(b)、(d)表示方向一致,(a)、(c)表示方向不一致。对应脚本语句如下:
def GetDirection(AEndP,BEndP,AID,BID,AXY,BXY,search_radius):
i=1
j=1
for row in AEndP:
if row[1]==AID:
ax,ay=row[0]
x,y=AXY
if (math.sqrt((ax-x)**2+(ay-y)**2)>search_radius):
i=-1
break
for row in BEndP:
if row[1]==BID:
bx,by=row[0]
x,y=BXY
if(math.sqrt((bx-x)**2+(by-y)**2)>search_radius):
j=-1
break
myDirection=True #方向一致
if i*j==1:
myDirection=False #方向不一致
return myDirection
其中,AXY、BXY分别表示A、B要素在边界上的端点坐标;AID、BID表示A、B要素的ID;AEndP、BEndP表示终点要素几何位置和属性列;search_radius为给定的匹配容差。
属性检查的具体流程如图3所示。
本文利用湖北省某相邻两县第一次国情普查HYDL数据作测试。该两县数据由不同生产单位进行生产采集。HYDL层数据涉及属性要素较多,而且需要保持水流流向一致,因此具有较好的试验价值。
图3 属性检查流程
图4(a)为未经处理数据,其中粗线表示两县接边边界线即县界,从图中可知,数据除了对应位置错位,部分数据还存在未及线和过伸线问题。图4(b)数据经过几何接边处理,数据不仅都在边界线上,而且也解决了错位问题及几何接边问题。图4(c)是进行属性检查处理,其中圆点为生成的属性问题定位点,各点对应的属性问题记录如图5属性表所示。从图5中可以很明确地得知问题类型和各字段属性不一致内容,且可以便捷地辅助工作人员对属性进行修改。
图4 几何接边与属性检查成果
图5 属性检查定位点属性表
通过图4、图5可知,利用几何接边可以很便捷地处理接边中存在的绝大部分问题,而属性检查则极大地帮助用户进行数据修改、检查,能够较好地解决接边中的问题。
本文针对传统手动接边的缺陷,利用ArcGIS中的Arcpy站点包进行几何接边和属性检查脚本工具编写,较大程度上减轻了工作人员的工作量,同时也提高了工作效率和成果质量。在第一次地理国情普查中的应用则验证了方法的可靠性,有较好的实际应用价值。另外,文中所涉及工具大部分以ArcGIS中自带分析工具为主,容易实现,可以为其他单位提供参考。
[1]蒋勇,刘江,黄功文.基于ArcGIS Engine的IPointCollection接边检查法的研究[J].测绘与空间地理信息,2014,37(11):124-125.
[2]朱欣焰,张建超,李德仁.无缝空间数据库的概念、实现与问题研究[J].武汉大学学报(信息科学版),2002,27(4):382-386.
[3]余咏胜,彭艳丽,尹言军.基于Arcpy的影像地图自动处理技术研究[J].测绘通报,2015(3):82-84.
[4]牟乃夏,刘文宝,王海银,等.ArcGIS 10地理信息系统教程——从初学到精通[M].北京:测绘出版社,2012.
[5]辛兵厂,王来强,张朝坤.浅谈Python在地理国情普查数据处理中的应用[J].测绘与空间地理信息,2014, 37(6):108-110.
[6]费小睿,陈玉娜.大比例尺地形图自动接边检查的实现[J].城市勘测,2015(1):60-62.
[7]隋春光,范荣双,尹连旺.数字海图无缝拼接方法研究[J].武汉大学学报(信息科学版),2005,30(3):278-281.
[8]吴铭杰. 基于AutoCAD扩展实体数据的地形图接边功能的实现[J].测绘与空间地理信息, 2013,36(5):158-159.
[9]刘允,刘阳,杨钊.大比例尺地形图数据接边程序设计与实现[J].城市勘测, 2012(1): 65-67.
[10]周顺平,张江东,左泽均.线要素任意范围接边算法的设计与实现[J].测绘科学,2012,37(5):20-22.
Automatic Edge Matching and Attribute Checking of Line Features Based on Arcpy
LIU Xiong,LI Yu,CHEN Gang
10.13474/j.cnki.11-2246.2016.0271.
2016-02-23
刘雄(1991—),男,硕士,主要研究方向为精密工程测量与变形监测。E-mail:cugliuxiong@163.com
P208
B
0494-0911(2016)08-0114-04
引文格式:刘雄,李宇,陈刚.Arcpy支持下的线要素几何自动接边与属性检查[J].测绘通报,2016(8):114-117.