ArcEngine接口大全(带示例)

2026/1/11 3:12:55

1、抽象类,类,和组件对象类

抽象类是不能实例化的,抽象类中是一系列抽象的方法,故是不能实例化的,它只能被继承。不同的类可以继承同一个抽象类,但内部对同一方法的实现可能是不一样的。如AO中的接口都是抽象类。用户可以在类中实现这些接口,也就是继承这些接口。如用户可以在自己的类中实现ICommand接口,生成一个Command,或者实现ICommand、ITool接口,生成一个Tool.

类是不能直接实例化的,它只能作为另一个类的属性或者被其它类的对象实例化。如Sde3Workspace Class、Sde4Workspace Class,FeatureClass,FeatureDataset它们是不能通过New直接实例化的,只能通过SdeWorkspaceFactory CoClass这个组件对象类所实现的

IWorkspaceFactory接口里的Open方法来实例化。FeatureClass,FeatureDataset也是不能直接实例化的,他只能通过IFeatureWorkspace接口里的CreateFeatureClass,CreateFeatureDataset方法来实例化。

组件对象类能够通过New来直接实例化。如 SdeWorkspaceFactory,QueryFilter它们是可以通过New来直接实例化的。

2、继承

类继承(type inheritance)定义了专门的类,它们拥有超类的属性和方法,并且同时也有自身的属性和方法。

上图说明primary line 和secondary line 是line 的一种类型。

实例化(Instantiation)指定一个类的对象有这样的方法,它能够创建另外一个类的对象。

pole 对象有一个方法能够创建transformer 对象。

3、类和接口的实现

一些类可能实现多个接口,一个接口也可能被多个类所实现,但不同的类实现同一个接口可能内部并不是一样的,这就实现了多态性.如ILayer这个接口被多个接口实现,其中包括FeatureLayer和RasterLayer,但这两个类实现ILayer接口时内部实现肯定是不一样的!但在外部对ILayer的操作是一样的!

4、接口之间的相互查询

一个类可以实现多个接口,每一个接口可能包括一系列的属性和方法,但有时候一个接口里可能没有你想要的方法和属性,可能在这个类所实现接口的另一个接口里,这就涉及到从一个接口转到这个类所实现接口的另一个接口里,对于类所实现的一系列接口里,接口间是可以相互跳转的。如我想对一个feature的属性进行修改,给的就是这个feature的IFeature接口,我们知道对一个feature进行修改必须要把这个feature所在的featureclass的工作空间设为可编辑,且编辑结束后要结束编辑,这就要通过这个IFeatue接口来获得这个这个feature所在的IFeatureClass接口和IWorkspace接口,我们知道IFeatue接口里有一个object属性,这个属性返回的是IObjectClass,而FeatureClass这个类实现了IObjectClass和IFeatureClass这两个接口,这样就可以通过接口跳转从IObjectClass转换成IFeatureClass,这样就可以获得feature的IFeatureClass接口,其代码(c#)如下:

IObjectClass i_objcls=I_FtrCur.Class;

IFeatureClass i_ftrcls=(IFeatureClass)i_objcls;

Feature所在的FeatureClass的IFeatureClass接口有了,还要这个FeatureClass所在的工作空间的IWorkspace接口,获取这个接口可以通过两个方法

一、通过IFeatureClass接口里的FeatureDataset属性来获得IFeatureDataset接口。

IFeatureDataset接口里有一个Workspace属性返回IWorkspace接口,但这种方法有一个特别说明就是这个FeatureClass必须是一个FeatureDataset的成员,如果这个FeatureClass是一个独立,这个FeatureDataset返回的就是一个空值。所以这种方法对FeatureClass是一个FeatureDataset的成员时是适用的,独立时就不适用了。

二、通过接口转换。

FeatureClass实现了多个接口,其中有IDataset接口和IFeatureClass接口,我们已经有了IFeatureClass接口,就可以通过接口跳转来获得IDataset接口,在IDataset接口里有一个Workspace属性返回IWorkspace接口,这种方法对于FeatureClass是一个FeatureDataset的成员和FeatureClass是独立的这两种情况都是可以的。代码如下:

IDataset i_ftrDset=(IDataset)i_ftrcls //接口跳转

IFeatureWorkspace i_wks=(IFeatureWorkspace)i_ftrDset.Workspace

=============================================================================

个人感觉在OMD图中比较难理解的就是可实例化类CLASS。我做了以下例子去理解它: ArcEngine中 workSpace 就是一个可实例化类, WorkSpace不能用new创建,但可以通过WorkSpaceFarctory.Openfromfile()方法来创建.如下: IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactoryClass(); IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(ConnectionString, 0); 但当我们尝试用New去创建一个Workspace类时,如下: IWorkspace pWorkspace = new WorkspaceClass(); 就会出现以下错误:

“类型”ESRI.ArcGIS.Geodatabase.WorkspaceClass未定义构造函数;

所以,Class和CoClass的主要区别就是CoClass是带构造函数的Class.以此它可以用New直接创建对象

1. IField接口(esriGeoDatabase)

IField接口的第一个属性AliasName(只读,获得字段的别名)

IField接口的第二个方法CheckValue(Value)(方法,对于指定的属性字段,基于字段类型判断参数值是否有效,有效,则返回True,否则返回False) 例子代码:

1. Set pField = pFields.Field(6) ’第六个字段

2. bChkField = pField.CheckValue(45.86) 3. If bChkField = True Then……

IField接口的其他属性均为只读属性,常用有Name(只读,获得字段的名称) 例子代码:

1. Dim pFields As IFields 2. 3. 4. 5. 6. 7. 8. 9.

Dim pField As IField

Dim pGeoDef As IGeometryDef Dim pDomain As IDomain Dim i As Long

Set pFields = pFeatClass.Fields For i = 0 To pFields.FieldCount - 1 Set pField = pFields.Field(i)

If pField.Type = esriFieldTypeGeometry Then

10. Set pGeoDef = pField.GeometryDef 11. Else

12. Debug.Print pField.AliasName 13. Debug.Print pField.DefaultValue 14. Set pDomain = pField.Domain 15. Debug.Print pField.Editable

16. Debug.Print pField.IsNullable 17. Debug.Print pField.Length 18. Debug.Print pField.Name 19. Debug.Print pField.Precision 20. Debug.Print pField.Required 21. Debug.Print pField.Scale 22. Debug.Print pField.Type 23. Debug.Print pField.VarType 24. End If 25. Next

2. IFieldEdit接口(esriGeoDatabase)

所有该接口的属性均为可读可写,经常用与对新建字段的设置,因为字段一旦被设置,其基本属性就不能被更改,所以就需要该接口类型的变量去转换,方法为:

IFeatureClass pFC_SCP_PT;

IFieldEdit editPT = new FieldClass(); pFC_SCP_PT.AddField((IField)editPT);

如果在vb中去编写代码,则赋值和获取均为同一属性,而在C#中,为了区分设置和获取,属性均有两个,类似于Name和Name_2,这样就可以区分了,普遍用设置的带有_2的那个属性。

IFieldEdit接口的第一个属性Name (读写,设置或者获取该变量类型变量字段的名称) IFieldEdit接口的第二个属性Precision(读写,设置或者获取该变量类型变量字段的长度) IFieldEdit接口的第三个属性Scale(读写,设置或者获取该变量类型变量字段的精度) IFieldEdit接口的第四个属性Type(读写,设置或者获取该变量类型变量字段的类型) 例子代码:

1. IFeatureClass pFC_SCP_PT; 2. editPT = new FieldClass(); 3. editPT.Precision_2 = 8; 4. editPT.Scale_2 = 3;

5. editPT.Name_2 = \

6. editPT.Type_2 = esriFieldType.esriFieldTypeDouble; 3. IFields接口(esriGeoDatabase) IFields接口的第一个属性Field(Index) (只读,以用于获取具体的字段,返回类型为IField) IFields接口的第二个属性FieldCount(只读,以用于获取属性的数量)

利用上面两个接口并用索引去依次循环获得每一列的属性pField(Ifield接口) 例子代码: 1. 2. 3. 4. 5.

Dim i As Long

Dim pField As IField

For i = 0 To (pFields.FieldCount - 1) Set pField = pFields.Field(i)

Debug.Print pField.Name & \

6. Next i


ArcEngine接口大全(带示例).doc 将本文的Word文档下载到电脑
搜索更多关于: ArcEngine接口大全(带示例) 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219