基于ArcGIS Engine的自动智能图幅接边算法与实现
2014-02-19穆凯
穆 凯
(1.新疆维吾尔自治区第二测绘院, 新疆 乌鲁木齐830000)
测绘领域目前常用的图幅接边编辑软件有Geoway、AutoCAD、MapGIS、ArcDIS、Coredraw等,这些软件在自动接边时存在的问题有:不提供接边检查、无属性项接边、接边生硬、直角房屋接边角度变形、独立面要素接边与相邻面产生面裂隙、大数据量接边计算缓慢等[1-3]。人工接边则存在接边精度无法保证、属性项接边检查工作量大、容易出现遗漏等问题[4]。本文结合上述常见的接边问题,按照人机交互的接边方式,先检查再接边,保留检查结果,阐述错误原因,并能定位错误位置,保证接边准确性。设计智能算法确保大数据量接边速度,做到线接边自然过渡、面接边角度无变化、无缝接边。设计了多种接边方案,最终实现操作者使用该程序能最大程度地提高工作效率、节约生产成本、保证产品质量。
1 常用的编辑软件接边方法
1.1 ArcGIS自动接边
ArcGIS中利用Spatial Adjustment里的edge match实现自动接边。设置接边缓冲区,对接边要素采用样条法进行平滑。可以选择一个目标点由多个源点连接来保证面要素接边时不产生面裂隙,但ArcGIS接边工具中没有提供接边检查,属性接边后无法保持原要素的角度,接边方式采用主图附图各改一半的方式,接边后有些地方还得靠手工接边。
1.2 MapGIS接边
MapGIS提供了一个“接边处理”的模块,可以根据参数设置的方式进行接边范围及容差设置,只支持单层接边,线面接边要分开,接边效果生硬不自然,接边结果为两图各改一半,无接边检查,无属性检查。
1.3 Geoway接边
Geoway 软件中专门设计了接边工程,设计了接边边线确认功能来保证接边的准确性,可以设置接边缓冲区,提供了3种接边方案来应对与已成图接边时所产生的问题。在线接边过程中采用5点递减的偏移方式进行自然过渡处理,保证接边不生硬。可以采用框选、点选要素的方式进行自动接边。但是在Geoway软件中没有提供直接构面概念,其中的面要素都是通过线要素构面的方式进行的,所以对线要素接边后要进行重构面的处理。此外Geoway中也没有提供接边检查,以及属性项接边的功能,接边后面形状有变化。
1.4 AutoCAD、Coredraw接边
AutoCAD和Coredraw本身并不是专业的GIS软件,所以在设计中并没有提供专门的接边功能,可以通过软件中自带的捕捉和属性查看功能进行人工接边,接边费时费力,且容易遗漏,精度不高。
2 智能接边算法
2.1 设计思路
将整个程序分为接边检查与接边修复2个部分来实现。接边检查功能的设计既是对自动接边功能的一种补充,又是对自动接边成果的一种检验。接边检查对因特定原因不能实现自动接边需要手动接边的图幅提供了参考依据[5]。接边修复分为线要素接边、面要素接边和属性项接边3种类型,修复侧重各有不同,如图1所示。
2.2 接边边界线的提取
边界的确定直接影响到接边的最终成果,它具有唯一性、准确性的特点。下文中各种算法的实现都是以边界线的提取为前提的。
首先通过图号计算出主图图廓四角的大地坐标,然后通过高斯反算计算出投影坐标,为了确保图廓精度,采用人机互动的方式对图廓坐标予以显示,并可以进行人工校正,再利用主图与副图的图号判断它们之间的空间位置关系,确定相邻边界线并将其保存为Geometry的数据形式,便于空间分析使用。
2.3 接边检查算法
图1 接边设计流程图
按点查询按要素修改的接边方式,判断这些在边界上的点是否在限差范围内,可以通过判断是否存在与其相同类型的邻图点就可以。如果邻图不存在对应接边点则为空间几何位置不接边。在接边检查中先提取主图与副图边界线上的点,缩小比较范围,来提高运算效率。具体方法如下:
对已提取的边界线Geometry建立缓冲极小的缓冲区,分别对主图和副图作缓冲区分析,提取每幅图中与边界线上存在的点并将其分别保存至数据库临时表中。
IGeometry geometry = topologicalOperator.Buffer(distance);//对边界线建立缓冲区
IRelationalOperator relationalOperator = geometry as IRelationalOperator;//将缓冲区放入关系容器中
if (relationalOperator.Contains(pointCollection.get_Point(i)))//提取边线上的点
再对主图边界线上的点逐一建立缓冲区,缓冲区范围为接边限差的最大距离。逐一与副图边界线上的点作比较,如果缓冲区范围内不存在副图中的要素和边界线的交点,则证明该点所在位置的对应几何体与副图存在几何位置不接边的情况,用红色边框对该点所在位置进行标注,并记录错误信息。通过axMapControl1.CenterAt方法可以实现双击错误信息局部放大错误位置的效果。如果缓冲区范围内存在副图点,则查询其属性信息是否与主图属性一致,如不一致用蓝色边框标出,并记录具体错误原因,如图2所示。
图2 错误记录及错误标注
这种接边检查算法可能在面属性检查时出现误判,将无公共边但存在公共点的一对面进行比较,而对角相邻的面实际上属性是可以不一致的。因此要在属性比较前判断2个面是否存在公共边,再进行属性比较,如图3所示。
图3 芦苇不会与相邻的密集进行属性比较
2.4 线要素接边算法
几何位置接边主要分线接边和面接边2种,每种方式都有其所侧重的方向。线接边首先通过接边检查后查找出有错误的点所对应的几何体,判断几何形状是线的几何体,对该点作缓冲区查找,找出其可移动限差范围内的最近的一个属性相同的线形几何体与其进行接边。接边算法是将2条线在图廓线上对应点移动至同一位置实现接边,但这种算法所实现的接边效果过渡不自然,因此要加入一定的智能算法对角度变化较大的线进行拟合。首先判断接边前后的线在节点移动后角度变化是否超过30°,如果超过30°则对其进行拟合,如图4所示。
提取与线要素边线上的点相邻的连续4个点进行拟合处理(如不足4点则注记递减),主要的拟合算法有样条法和逐渐递减的方法。测试对5点进行2次样条法拟合和3次样条法拟合后发现,在对一些特殊的线段拟合后会超出移动限差位移,所以最终选用逐级递减方式进行拟合过渡。以下为算法的实现过程(usep1为边界上点的序号,如果usp1为终点,下式中usp1后改为减号,mdx1 、mdy1为边界上点坐标位移):
newp12.PutCoords(p1c.get_Point(usep1 + 1).X - (mdx1/ 5 * 4), p1c.get_Point(usep1 + 1).Y - (mdy1 / 5 * 4));
newp13.PutCoords(p1c.get_Point(usep1 + 2).X - (mdx1/ 5 * 3), p1c.get_Point(usep1 + 2).Y - (mdy1 / 5 * 3));
图4 有过渡的自然接边与没有过渡的生硬接边比较
newp14.PutCoords(p1c.get_Point(usep1 + 3).X - (mdx1/ 5 * 2), p1c.get_Point(usep1 + 3).Y - (mdy1 / 5 * 2));
newp15.PutCoords(p1c.get_Point(usep1 + 4).X - (mdx1/ 5 * 1), p1c.get_Point(usep1 + 4).Y - (mdy1 / 5 * 1));
2.5 面要素接边算法
面要素接边主要侧重于解决接边后面形状变形、接边后产生面裂隙和部分面不到边界线这3类问题。其余接边算法与线要素接边相似,都是将2个不同要素边线上对应的一对点移动至同一位置。
接边后,面要素形状变形的原因是在边界线上点位移后所产生的角度变化。因此只要对边线上的点和与之相邻且不在边线上的点同时做平行移动,就不会发生角度变化。通过判断与需要移动的点、相邻序号的点和边界线的关系判断面要素点集的单调性,从而确定需要作平行移动的点[6]。
图5 1点的相邻点是2和8,2也在边线上对1和8点进行平行移动
在确定需作同时平行移动的点后(图5中8号点)对两点同时作平行移动达到接边后面要素形状不变的效果。接边后产生面裂隙的原因是,在对2个面要素因接边发现位移后,与其有公共边的相邻面没有同时发生对应位移从而产生了面裂隙[7]。采用对移动节点作缓冲区分析的方法提取与之对应的面要素,并提取对应的点进行映射移动,如图6所示。
通常一个由4条边构成的面在被裁切后会与切割线有2个交点,比较复杂的面会有偶数个交点,当出现奇数个节点时,就有可能会是在作业过程中产生的失误而导致的有一端点不在边界线上。除此之外,也会有偶数个节点,但在特殊情况下也存在部分面不到边界线的情况。针对此情况,通过逐一判断与面要素所有在边界线上的点相邻序号的左右2个节点来判断它们是否在边界线上,如果都不在边界上,则选择移动限差内离边线距离最近的一个节点,将其移动至边界上。
图6 无缝接边
3 结 语
经过实际应用检验发现,智能接边算法可有效节省系统内存资源,快速进行图幅要素的接边检查,实现数字地图的快速接边,解决了一般接边算法存在的接边生硬、接边后形状变化和接边后存在的面裂隙等问题。而且具有简单、实用、运行效率高等特点,特别是在数据量比较大的情况下效果尤其明显。但是这种算法在对结构过于复杂的面进行接边时,暂时还存在一些遗漏,今后将进一步完善。
[1]赵江洪.GIS中多图幅自动接边的实现方法探讨[J].测绘通报,2006(2):50-52
[2]孙丽娜,李吉之,陈静.基于AO的同比例尺地形图无缝接边技术及其实现方法[J].测绘工程,2007(6):49-53
[3]王永哲,金永宝,刘烜.基于ArcGIS Engine 9.2的图幅自动接边算法的实现[J].安徽农业科学,2008(34):15 263-15 265
[4]戴相喜,周卫,高磊.DLG数据任意范围接边算法及实现[J].测绘通报,2008(7):32-35
[5]赵江洪.地理信息系统中多图幅接边的设计与实现[J].测绘科学,2004(1):45-46,6
[6]曹丽娟.基于ArcObjects的多图幅自动接边研究与实现[J].软件导刊,2010(9):49-51
[7]韩志远.基于ArcObjects的城市基础地理信息系统的设计与实现[J].大众科技,2010 (12):31-32