接边算法研究1
整个11月份都在忙入库程序的修改工作,因此整个11月份的blog仅仅一篇,现在这一步的东西终于基本结束,目前在做最后一步工作:程序自动接边。
在开始接边代码编写之前,我在网上找了一些论文研究过,很遗憾,几乎没有一篇对我的具体工作有帮助。它们都是谈流程该如何如何,顶多用伪代码来画画结构图。咱不信这个邪,自己想,自动接边是如何完成的。
我们首先考虑一下接边的数据情况,接边要么是多幅标准图入库,需要在图幅边框处进行接边;要么是更新区范围内入库,需要对更新线左右两边的对象进行接边。那么接边基于什么规则呢?一是位置,比如说接边线两边两栋房子的距离小于多少可以认为是同一栋;另一个是属性规则,有些房子就是挨在一起的,但总不能不分青红皂白连接在一块吧,这个时候我们再看看它们的结构或层数是否一致来判别。大部分的论文大概都只讲到了这里,不肯再透露更多的算法信息了。
再考虑一下使用什么样的开发方式,我们知道,使用自动接边运算以后,绝对达不到100%的构面效果,因此一般都需要进行手工接边一下,鉴于此,最方便的编辑工具就是ArcMap了,我们就使用ArcMap作为接边运算的框架,即先使用VBA来写功能,写完以后再将它使用DLL来改写一下。
因此,这篇blog就将讲两个方面的东西,一个是如何通过VBA和DLL的方式为ArcMap这个框架添加新的功能,另一方面则是如何实现自动接边的具体算法。
首先我们使用VBA来写接边算法,这是因为使用VBA的方式最简单,容易调试。由于自动接边不用人工干预,在ArcMap中新建一个Macro或UICommand对象都行,然后我们来开始讲解接边的具体做法。
首先我们需要找到更新线要素类,如何在ArcMap载入的图层中找到这个类很简单,遍历Map对象,然后找出来嘛,一般而言,更新图层这些特殊的辅助要素类名称都是固定的,这样找的方式就更简单。[一般而言,在一个Map中寻找一个名称为name的对象,最好写个函数来判断一下,因为一个名为ABC的要素类如果保存在个人geodatabase中和在SDE中时,载入进Map对象,后者的图层名就是用户名.ABC]
找到更新线图层后,根据项目号(别的规则也行),取出当前需要处理的更新线对象[这个也简单,是写AO程序员最最基本的能力],取出这个要素以后,获得它的Shape,然后QI到ITopologicalOperator接口,做Buffer运算。这个Buffer的值该取多大,取决于我们能够接受的要素容差,如果容差是0.1,那就把缓冲区设置的大于0.1就好了,这样,我们就得到了一个由线缓冲出来的面对象[这个Polygon多半还有洞存在]。
有了这个缓冲区以后,我们就需要找到需要接边的图层了。由于这些图层可能是点、线或多边形,因此要寻找出处于缓冲区中的这些图层的对象,需要使用空间过滤器,且空间关系各不相同,如点是esriSpatialRelContains,线是esriSpatialRelCrosses,而多边形是esriSpatialRelOverlaps[关于这些关系,请参考IRelationshipOperator接口的介绍]。我们使用IFeatureClass.Select方法来寻找出这些要素对象,并将它们放在一个选择集中。
寻找到这些要素对象以后,我们就遇到了这个算法的第一个重点:如何在这些要素中寻找出具有某种关系的“对象对”。以房屋层为例,如何找到在更新线左右两侧的要素,且其要素距离小于容差,它们具有相同的共享边,且这些房屋的标注信息是一样的。我们首先想想如何比较一个要素集中的要素对象两两比较,其实很简单,使用下面的代码,以一个具有100个对象的集合为例:
dim i as integer,j as integer
for i=1 to 100
for j=1 to 100
if i=j then goto e1
<判断代码......>
e1:
next
next
[程序基本已经完成,正在完善,这篇blog也在逐渐写过程中......]
Related Items
Comments
这个算法在最新的blog中已经有所讲解,但具体如何实现,在这里不方便透露
请问蒋老师:
点要素需要接边吗?我们现在做的都没有接边
接边,自然有边才能接了。点的话可以判断两个点的距离是否在容差之内,如果是可以认为它们是同一个点并删除其中一个。
嗯,呵呵,是这个道理,谢谢
实际情况中,复杂的数据不可能做到100%的接边,以地籍类的数据为例,我们无法找出涵盖所有地块情况的接边规则来进行接边,再者,即便你找出了涵盖所有情况的接边规则,那效率肯定是非常低下的,接边是个较为复杂的问题,个人觉得还是程序接边和手工接边相结合较好.
您好,想问下如果做两个面接边应该如何实现呢,我看过您的书ao开发基于net那本:-)
关键是识别两个边是否该接在一起,如果可以,Union一下即可。判断是否该接边比较复杂,可以用属性、距离、相交几何体类型来判断的。
您的这篇文章有没有接着往下写呢,我想接着看
另外还想问下有没有别的联系方式,比如QQ或MSN,只能在这里留言吗?:-)
属性、距离比较好理解,相交不太明白,能解释一下吗:-)
如果两个面刚刚是相接的,你要测量下其相接线的长度是否在一定范围内,确定其是否值得融合。
Leave a comment
Or, take a look at Archives and Categories
我用VC开发软件,数据自己定义,能否告知更多的接边(面)算法理论。谢谢了。