自动构面算法的描述与实现[c#]1

Posted by 蒋波涛 18 October,2007 Views (1)Comment

网络上的许多GIS常用算法描述都非常简练,有的要么梗概介绍算法原理,有的要么直接给出一堆看不懂的代码,在此之前,我并没有专门学习过GIS的算法,直到最近我迫切需要实现一个由线要素转换为面要素的算法,才开始对算法进行研究,经过几天的摆弄,终于成功地基于ArcObjects+C#2.0实现了“自动构面”的功能。不敢独享,特发布出来给大家。

我的方法介绍从最基本开始,即我现在有一个线要素类,如何将它变成一个面要素类

GIS中的的许多算法,如最短路径和由线构面算法,都是一种图结构,需要使用图算法来实现。同样的,对于自动构面,我们一般使用的是“左转算法”,这是一种基于点和与点关联的线而计算的算法,即基于一个拓扑网络的算法。因此,我们的第一个任务是,如何实现一个拓扑网络?

拓扑网络的基本构成是点Node和边Edge,点与边各自还需要描述自己与对方的关系,我们的第一步便是将一个线要素类转换为一个拓扑网络。拓扑网络是由节点和线段组成,注意是“线段”,因此,我们需要从一个任意的线网(Polyline network)中寻找出组成它们的线段和节点。我们用4个线段画一个“井”样的图形,这个图的线段数量是12条,而节点数量也是12条,而传入的Polyline是4条,那么,如何从这4条Polyline中获得12条线段和12个节点呢?

很简单,AO提供了基本的操作函数,首先,我们需要使用ITopologicalOperator::Union方法将这4条Polyline合并为一条Polyline,然后,我们对这个新生成的Polyline使用ITopologicalOperator::Simplify方法将其打散,这样,新的Polyline将是一条由12条线段和24个节点组成的Polyline。为什么是24个节点,因为打散后的每一条线段都有自己的节点,这样,在12个点击中,有4组,每组3个节点是多余的,因为有一个点位置有4个点在描述,这就是“井”中间的4个点。

代码:

private void GetAllSegmentPoints(IList<IPolyline> PolylineCollection)
        {
            //将所有的Polyline合并为一个Polyline
            IPolyline pPolyline = new PolylineClass();
            ITopologicalOperator3 pTopo = null;
            for (int i = 0; i < PolylineCollection.Count; i++)
            {
                pTopo = PolylineCollection[i] as ITopologicalOperator3;
                pPolyline = pTopo.Union(pPolyline) as IPolyline;
            }

            //简化唯一的Polyline,将其打散为一个具有多个Segment的Polyline
            pTopo = pPolyline as ITopologicalOperator3;
            pTopo.IsKnownSimple_2 = false;
            pTopo.Simplify();
            //打散后的Polyline
            IPolyline pPly = pTopo as IPolyline;
            _pSegmentcollection = (ISegmentCollection)pPly;//打散后Polyline所有的Segment对象
            Console.WriteLine(_pSegmentcollection.SegmentCount.ToString());

            IPointCollection pPointCol = (IPointCollection)pPly;//打散后所有的节点,其数量为Segment的2倍,需要处理
            _pointCollection = this.processDuplicatePoint(pPointCol);//删除了重复点后的所有节点Point对象,即节点集合
            Console.WriteLine(_pointCollection.PointCount.ToString());
        }

Related Items

Categories : .NET开发 Tags : ArcObjects  个人咚咚  计算机图形学  
Comments
2007-12-4 18:54:47

支持博主~~~~~~~

wheroy 于 2010-4-13 2:23:02 回复
如果你要用AO,那没就可以直接用AO的Geoprocessor地理处理工具实现,用的着怎么折腾吗?要么就不用AO ,自己全部搞定。

Posted by leon Gravatar Icon

Leave a comment

Or, take a look at Archives and Categories

目录

存档