ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别

时间:2022-10-19 15:00:49

最近忙着做毕业设计,用到了点对象,发现ArcEngine中定义了三个点对象(结构),就想钻一下牛角尖,弄清楚其区别是什么。

一、先来看一下查到的类库和接口,如下图:

 ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别

ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别

 ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别


不难发现,WKSPoint、WKSPointZ是在System类库中定义的两种系统结构Structure,我理解为C++里面的结构体变量(C#与C++有一定的联系,都是面向对象的语言),即这哥俩是系统变量,写代码在哪儿都可以任意用,需添加ESRI.ArcGIS.esriSystem引用。


二、再来看一下IPoint的接口:

 ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别

 ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别

 

如图,可以看到,IPoint接口定义的点对象Point是一个二维点对象,在“Description”中,写到了“一个Point是表示二维XY平面中的特定(xy)位置的零维物体。一个Point可以具有与之相关的Z值、M值和ID属性。这些属性的存在不会改变Point对象的维数(即仍然是0维啦),也不会改变基于Point执行的几何计算。属性仅被认为是属性计算时,点是ZAware, MAware, or PointIDAware。可以使用PutoCords方法构造点,单独设置XY属性,或者使用IConstructPoint 接口。”

 ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别

再看上图Point对象的构成,也就是说,Point对象是0维对象,不是二维,也不是三维,它只有X/Y坐标属性,在进行三维开发或者三维相关的工作时,可以通过Z属性(注意是单独另外的属性,而不是与X/Y一样的坐标)来设置。或者再对比下面两个图,即可明显地看出区别。

 ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别

ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别


再来看一下对Point对象的Z值属性的解释,如下图,描述信息翻译过来为“返回或设置Point点对象的Z属性。虽然Z属性是指点的三维深度,但点在空间上仍然只存在于具有Z属性的2维中。此外,点必须成为ZAware对象才能使用Z属性。”在C#开发环境使用时,下图中的代码是很好的例子。

 ArcEngine开发中WKSPoint、WKSPointZ与IPoint三种点对象的区别

同样地,M值应该很简单了,就是测量属性,设置测量容差的。用法和Z值类似,描述信息如下:

Description

Returns or Sets the M attribute on the Point.  The M attribute refers to the Point's measure (similar to an address).  The point must be MAware to make use of the M attribute.

 

三、延伸小知识

从上面的对比中可以得出结论,ArcGIS乃至ArcEngine开发中点对象(IPoint)是0维的,而不是一维或二维。那么以此类推,线对象是一维,面对象是二维的。

对于GISer来说,这是一个很重要而且基础的知识点。笔者准备考研时在某一年的真题中就考过,当时还不理解原因,现在清楚了,哈哈。


四、要注意的是对象模型图中查不到WKSPoint、WKSPointZ结构类型,因为对象模型图中都是接口和类及其继承关系等信息,所以可以查到IPoint接口。笔者上面写的信息都是在ArcGIS的在线帮助文档上面查的。