在使用 ArcEngine 进行开发的时候,用的最多的就是其 Geometry 库中的对象,Geometry 库也是 ArcEngine 的基础.这一段时间打算将开发中用到过的和
Geometry 有关的内容总结一下,其实这些内容基本上在 ArcEngine 的帮助 文档中都可以找到.
Geometry 库在体系结构上分为下面几个部分:
1.空间对象的表达和构造
2.空间对象的拓扑运算和关系判定
3.空间对象的变换(在这里引入了地理坐标系统和投影坐标系统)
4.其他辅助接口
本篇主要论述空间对象的表达,下一篇将讨论空间对象的构造.
ArcEngine 中的几何体的主要层次表示如下
其中 IGeometry 处于最顶端,是所有几何体的基接口,它包含了 ArcEngine 对于几何体的一般定义。主要包括四个属性:维数、是否为 Empty、外包、图形是否
为空和空间参考(SpatialReference)。这四个方面都是很重要。其中维数(Dimension)在涉及到几何运算的时候会被经常用到,但是由于几何对象的操作都比较特殊,而且我们都有比较直观的感受,所以在开发的过程中经常忽略这个属性也不会导致错误.包络面是一个特殊的概念,它表达的是一个几何图形的外包矩形,这个外包矩形在作空间关系判断的时候可以很快的作出非判断。图形为空是由于计算机的处理所引入的一个概念,计算机操作可能会产生一些实际上不符合理论要求的几何图形,其中有一些情况就会使得几何图形为空。例如点的坐标为 Double.NaN(NaN 为 IEEE 定义的一个特殊数,表示不是一个可以理解的数值).或者某个多边形只有三个共线的点等等。这些情况下几何图形显然不能参与运算了,但是仍然可以被存储,这些就是 Empty 的图形,在获取几何图形后必须要先判断其是否为 Empty,如果是就不能参与几何运算。空间参考为几何图形定义两个方面的内容:其一是几何图形所在的坐标系统,其二是告诉你数据的有效精度,在计算机中坐标数据一般都使用浮点数,但是浮点运算是有误差的。所以必须制定精度才能比较准确的运算。否则就会出现计算不对称的情况例如:1/3*3 一般都不等于 1。但是如果指定了精度就可以解决这类问题了。
IGeometry 派生出四个子类
IPoint 表示一个点
IMultipoint 用多个点表示的一个对象
IEnvelope 表示一个包络面(也就是外包)
ICurve 表示曲线
IPoint 表示一个点,从概念上讲特别简单,但是 ESRI 在 IPoint 这个接口上添加了两个特别的方法:
ConstrainAngle(double constrainAngle,IPoint anchor,bool allowOpposite)这个方法的运算结果如下所述:
首先用anchor和constrainAngle在一个以anchor为极点的极坐标系中构造一个无限的射线(矢量)然后从 IPoint 当前的坐标出发作一个垂直于这条射线的直线,交点就是 IPoint 的新的当前值.如果 allowOpposite 为 true,那么还可以向射线的反向延长线作垂线。这个方法可以用来约束新点必须在某条直线上。如图所示
ConstrainDistance(double distance,IPoint anchor);这个方法的运算结果如下所示:
首先以anchor为圆心distance为半径作一个圆,然后连接anchor和IPoint的当前点位置构成一条射线,这条射线或者其延长线会和圆有一个交点,这个点就是 IPoint 的当前位置。这个方法可以用来约束新点距离某个点的距离必须为多少。如图所示:
IPoint 的构造方法有两大类:
1.直接构造.开发者 new 一个 PointClass 对象自己手工给它设定坐标的值.
2.使用 IConstructPoint 来构造.IConstructPoint 提供了 10 中构造点的方法.
关于 IPoint 的构造将在专门的文章中列出。