最近项目开始要用到ArcEngine中的相交分析,网上的图文并茂的文章相当多,写的非常好,这里不做多的转载。只对我在通过相交分析求两个线段的交点时碰到的问题进行一个记录。
ArcEngine中相交分析用到接口为 ITopologicalOperator 这里需要用到它里面的 Intersect方法,功能很强大,能根据两个交的几何图形得到对应的各种交集(点,线,面等)现在我要做两个线段的交集,代码如下:
IPolyline tmpLine1 = new PolylineClass(); tmpLine1.FromPoint = 起点; tmpLine1.ToPoint = 终点; IPolyline tmpLine2 = new PolylineClass(); tmpLine2.FromPoint = 起点; tmpLine2.ToPoint = 终点; ITopologicalOperator topoOperator = tmpLine1 as ITopologicalOperator; IGeometry geo = topoOperator.Intersect(tmpLine2 , esriGeometryDimension.esriGeometry0Dimension); if (!geo.IsEmpty) { IPointCollection Pc = geo as IPointCollection; IPoint Pt = Pc.get_Point(0); }
网上有很多相似的代码,都是在MapControl中对两条线段进行相交分析,但是我的两个线段是3D下的,结果是相交点的Z属性为NaN,找了好久,以为是有另外的接口像 IRelationalOperator3D 和IRelationalOperator一样,但是确实没有。最后在google看文章时发现了问题所在。除了起点和终点要是三维点外,IPolyline也要打开Z属性。上面的代码需要加上这个:
IZAware zaware = tmpLine1 as IZAware;
zaware.ZAware = true;
两条线都要加,这样再对其做相交分析就能正常得到Z属性了!