自动构面算法的描述与实现[c#]1
网络上的许多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
Comments
Leave a comment
Or, take a look at Archives and Categories
支持博主~~~~~~~