AE的空间分析(转载)
1.1 ITopologicalOperator接口
1.1.1 ITopologicalOperator接口简介ITopologicalOperator接口用来通过对已存在的几何对象做空间拓扑运算以产生新的结合对象。实现该接口的类有Point,Multipoint,Polyline,Polygon,MultiPatch这些都是高级几何对象,另外GeometryBag也实现了该接口,低级的构建几何对象如Segments(Line,Circular Arc,Elliptic Arc,Bezier Curve),Paths或者Rings如果想使用该接口需包装成高级几何对象。
ITopologicalOperator接口在GIS开发中使用非常广泛,通常GIS系统中缓冲区分析,裁剪几何图形,几何图形差分操作,几何图形合并操作等都需要使用此接口。下表是ITopologicalOperator接口主要的方法说明:
方法名称 | 说明 |
Boundary | 几何图形对象的边界 |
Buffer | 对几何图形对象进行缓冲区空间拓扑操作 |
Clip | 对几何图形对象进行裁剪空间拓扑操作 |
ConstructUnion | 高效的合并多个枚举几何对象与单个几何对象合并为单个几何对象,这对于大量几何对象的合并非常高效 |
ConvexHull | 构建几何对象的凸边形 |
Cut | 切割几何对象 |
Difference | 一个几何图形减去它与另一个几何图形相交的部分 |
Intersect | 两个同维度几何对象的交集部分 |
Simplify | 使几何对象拓扑一致 |
SymmetricDifference | 对称差分将两个几何图形的并集部分减去两个几何图形交集的部分 |
Union | 合并两个同维度的几何对象为单个几何对象 |
1. Boundary属性
如图所示Polygon几何对象的Boundary是组成它的Polyline几何对象
Polyline几何对象的[Boundary是组成它的顶点Point几何对象
而Point几何对象的Boundary是空对象
2.Buffer方法:
Buffer方法可以给一个高级几何对象产生一个缓冲区,无论是Polygon,Polyline,Point它们的缓冲区都是具有面积的几何对象
3.Clip方法
Clip方法可以将用一个Envelope对象对一个几何对象进行裁剪,参见结果是几何对象被Envelope 对象所包围的部分
4.ConvexHull方法
ConvexHull方法可以产生一个几何图形的最小的边框凸多边形(没有凹面包含几何图形的最小多边形)
5.Cut方法
Cut方法不支持GeometryBags几何对象,它可以指定一条切割曲线和一个几何图形,经过切割运算后把几何图形分为左右两部分,做,右两部分是相对曲线的方向而言。点与多点不能被切割,Polyline和Polygon只有与切割曲线相交时才能执行Cut方法
6.Difference方法
Difference方法用于产生两个几何对象的差集。
7.Union方法和ConstructUnion都用于合并几何对象,所不同的是前者合并两个同维度的几何对象为单个几何对象,而后者是高效的合并多个枚举几何对象与单个几何对象合并为单个几何对象,这对于大量几何对象的合并非常高效的。
8.Intersect方法
Intersect方法用于返回两个同维度几何对象的交集,即两个几何对象的重合部分。
9.SymetricDifference方法
SymetricDifference方法用于产生两个几何图形的对称差分,即两个几何的并集部分减去两个几何的交集部分
10.IsSimple属性和Simplify方法
IsSimple属性用于检测几何对象是否是拓扑正确即为简化几何对象,而Simplify方法用于简化几何对象使几何对象的拓扑正确。
在开发对几何对象空间分析时,所操作的几何对象必须是简化的几何对象,以下代码片段演示了如何使一个几何对象在拓扑上一致,例如在一个PointCollection对象中移除所有的重合点;对于segmentCollection移除所有重合线段,而相交的线段会变成非相交线段(即在相交处产生一个顶点);对于Polygon所有相交的环将被移除,未封闭的环将被封闭。
1 private void SimplifyGeometry(IGeometry pGeometry) 2 { 3 try 4 { 5 ITopologicalOperator pTopOperator = pGeometry as ITopologicalOperator; 6 if (pTopOperator != null) 7 { 8 if (!(pTopOperator.IsKnownSimple)) 9 { 10 if (!(pTopOperator.IsSimple)) 11 { 12 pTopOperator.Simplify(); 13 } 14 } 15 } 16 } 17 catch (Exception Err) 18 { 19 MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); 20 } 21 }
6.4 IRelationalOperator接口
6.4.1 IRelationalOperator接口简介几何对象之间都存在某种关联关系,如包含,相等,在内部,相交,叠加等。这些关联关系的获得都可以通过IRelationalOperator接口来获得,关系运算是在两个几何对象间进行的,通过IRelationalOperator的某一个方法返回一个布尔值来说明这两个几何对象是否有这种关系。所有支持ITopologicaloperator的几何对象的类也实现了IRelationalOperator接口,其中包括Envelope对象,这意味着还可以对两个几何对象的Envelope进行关联关系检查。
方法名称 | 描述 |
Contains | 检查两个几何图形几何图形1是否包含几何图形2 |
Crosses | 用于检测两个几何图形是否相交 |
Equal | 用于检测两个几何图形是否相等 |
Touches | 用于检测两个几何图形是否相连 |
Disjoint | 用于检测两个几何图形是否不相交 |
Overlaps | 用于检测两个几何图形是否有重叠 |
Relation | 用于检测是否存在定义relationship |
Within | 检查两个几何图形几何图形1是否被包含于几何图形2 |
6.4.2判断几何对象包含关系功能开发 以下代码片段演示如何判断几何图形A是否包含几何图形B:
1 /// 2 /// 检测几何图形A是否包含几何图形B 3 /// 4 /// 几何图形A 5 /// 几何图形B 6 /// True为包含,False为不包含 7 private bool CheckGeometryContain(IGeometry pGeometryA, IGeometry pGeometryB) 8 { 9 IRelationalOperator pRelOperator = pGeometryA as IRelationalOperator; 10 if (pRelOperator.Contains(pGeometryB)) 11 { 12 return true; 13 } 14 else 15 { 16 return false; 17 } 18 }
6.5 IProximityOperator接口
6.5.1 IProximityOperator接口简介
IProximityOperator接口用于获取两个几何图形的距离,以及给定一个Point,求另一个几何图形上离离给定点最近的点。IProximityOperator接口的主要方法有:QueryNearesPoint,ReturnDistance, ReturnNearestPoint
ReturnDistance方法用于返回两个几何对象间的最短距离,QueryNearesPoint方法用于查询获取几何对象上离给定输入点的最近距离的点的引用,ReturnNearestPoint方法用于创建并返回几何对象上离给定输入点的最近距离的点。
6.5.2 最近点查询功能开发
以下代码片段演示如何使用IProximityOperator接口获取给定点与要查询的几何图形的最近点:
1 /// 在pGeometry上返回一个离pInputPoint最近的point 2 /// 3 /// 给定的点对象 4 /// 要查询的几何图形 5 /// the nearest Point 6 private IPoint NearestPoint(IPoint pInputPoint, IGeometry pGeometry) 7 { 8 try 9 { 10 IProximityOperator pProximity = (IProximityOperator)pGeometry; 11 IPoint pNearestPoint = pProximity.ReturnNearestPoint(pInputPoint, esriSegmentExtension.esriNoExtension); 12 return pNearestPoint; 13 } 14 catch(Exception Err) 15 { 16 MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); 17 return null; 18 } 19 }
以下代码片段演示如何使用IProximityOperator接口查询给定的两个几何对象的距离:
1 /// 2 /// 获取两个几何图形的距离 3 /// 4 /// 几何图形A 5 /// 几何图形B 6 /// 两个几何图形的距离 7 private double GetTwoGeometryDistance(IGeometry pGeometryA, IGeometry pGeometryB) 8 { 9 IProximityOperator pProOperator = pGeometryA as IProximityOperator; 10 if (pGeometryA!=null|| pGeometryB !=null) 11 { 12 double distance= pProOperator.ReturnDistance(pGeometryB); 13 return distance; 14 } 15 else 16 { 17 return 0; 18 } 19 }