QI实例改变空间参考

学习AE一段时间了,总是对QI不是很理解,今天一晚上写了QI实例,尝试理解下。

  1. 首先想到的是→改变空间参考→alter、SpatialReference→alterSpatialReference,输入到帮助文档里。  

查看是IGeoDatasetSchemaEdit接口的方法,那么我们能想到:A.要实例化一个IGeoDatasetSchemaEdit接口变量.B.要得到一个空间参考,也就是改变成什么样的空间参考。我们再在搜索里输入:createSpatialReference→

通过以下这段代码我们知道,CreateSpatialReference根据srID(空间参考ID),创建的空间参考有可能是地理坐标系,也有可能是投影坐标系。

我的参考教程是创建一个地理坐标系,不管是地理坐标系还是投影坐标系,反正空间参考要创建一个,接下来就是解决A的问题了:要实例化一个IGeoDatasetSchemaEdit接口变量。因为接口变量是不能用new来实现的,还是需要接口所支持的类的实例来进行实例化(interface A=new BClass()),我们就很顺其自然的找到了实现了IGeoDatasetSchemaEdit接口的类:FeatureDataset 。

这个时候我们先不要急了:因为我们还有件事没办:到目前位置我们虽然很繁琐的创建了一个地理坐标系的空间参考,但是我们还不知道用这个空间参考来改变谁的空间参考呢,所以我们要想办法获取当前地图的信息。

所以我门选择了FeatureDatset 。这就意味着我们可以通过这个类的变量来进行改变空间参考,当然这个变量的任务就是获取要改变空间参考的信息。

我们也许可以通过IGeoDatasetSchemaEdit p=new FeatureDatasetClass();

但是:FeatureDatasetClass没有定义默认的构造函数所以必须IGeoDatasetSchemaEdit类型接口变量的实例化要么通过FeatureDatasetClass类其他接口进行QI来实现;要么通过支持IGeoDatasetSchemaEdit的其他类来进行实例化(实例化它的类必须有构造函数,否则也只能进行QI)!

但是我们还有一个更好的东西:QI!用QI我们不仅可以实例化,还可以转到其他接口,进而得到图层的信息!所以我门又一次自然的看看这个FeatureDatasetClass 支持哪些接口:第一眼就看到了非常熟悉的IDataset 这个接口,虽然它不是我们要找的。。。我们要找的是:IGeoDataset接口。

也就是说,可以通过 IGeoDataset QI到IGeoDatasetSchemaEdit或者说从 IGeoDatasetSchemaEdit QI到  IGeoDataset

这里我们是用第一种,因为要通过 来获得图层的信息。这时我们再看支持 IGeoDataset的类,因为这个时候我们还是希望进行QI,并最终得到地图信息。

二,单向QI了一段,我们再从其他方向QI一段时间:

我们知道我们可以通过IMap pMap=axMapControl1.Map;  来获得当前地图的信息,我们看到IMap接口有个Layer属性:而这个Layer属性通过get_Layer(int index)函数,返回的是ILayer接口类型变量,这里涉及到ILayer接口,我们看下帮助文档:想进行QI,我们首先找到支持ILayer接口的类,然后看这些类中的其他接口,所以我门又一次看了支持ILayer接口的类:从中我们选择了FeatureLayer类,IFeatureLayer也是这个类的接口,所以我们可以实现从 ILayer接口QI到IFeatureLayer,这时我们看到 IFeatureLayer有个属性:FeatureClass,而这个属性返回都是IFeatureClass接口类型,这也就相当于实现了IFeatureLayer到IFeatureClass的转变,也可以“自认为”是QI的一种,因为IFeatureClass也可以QI到别的接口(当一个接口实在QI不了的时候,看看有没有属性来进行间接QI→个人观点)。

进入正题 我们看看支持IFeatureClass的类,我们看都一个熟悉的类FeatureClass,点开看看,我们发现FeatureClass也支持IGeoDataset接口,

就是说是先了上到下的对接,终于通过QI吧信息对接上了。

总的来说:1.进行QI就是不断的接口跳转,跳转可以是同一个类中的俩个接口之间跳转,也可以通过接口的属性来实现接口“跳转”。

             2.为什么要进行QI:因为接口的方法是在类中显示实现的,每个类能实现的功能不同,而这些功能又是通过不同的接口来实现的,要完成某项操作(如改变空间参考),就会涉及不同的方法,这些方法在不同的接口中,这些接口只有通过共同的类来实现跳转。

以上是我对照教程+帮助文档+自己理解写的,不是很专业,口语用的比较多,但还是希望对初学者能有一点的帮助吧!

个人观点,转载请注明出处!

原文地址:https://www.cnblogs.com/chuang8/p/2757781.html