AE接口使用理解Geodatabase篇(一)

来源:互联网 发布:淘宝退款骗局揭秘 编辑:程序博客网 时间:2024/04/30 03:01

Geodatabase类型:

1.personal:ACCESS数据库,2G数据

2.file:作用于1相同,不需要一栏ACCESS

3.ArcSDE:基于大型关系数据库,如:SQL SERVER,Oracle,DB2,是基于关系型数据库基础上的地理数据库服务器。


1). Dataset:

       A: 用于简单数据集,如table,feature class,geometric network,topologies,

       打开数据集:通过接口IFeatureWorkspace和IFeatureClassContainer使用open方法打开已存在的数据集

       创建新数据集:IFeatureWorkspace的CreateFeatureClassf方法,要求提供数据及名称,fields,以及在geodatabase中的存储方式。

     B:  network datasets,terrains,representations,cadastral fabrics.

        打开数据集:IDatasetContainer2,提供数据集名或索引

       创建数据集:IDatasetContainer2的CreateDataset方法,提供dataelement

2)

对比 TableObject classFeatureClassContainsRowsObjectsFeaturesRow createion methodITable.CreateRowITable.CreateRowIFeatureClass.CreateFeatureSupports subtypesfalsetruetrueSupports domainsfalsetruetrueRequrired fieldsNoneObjectIDObjectID,shape3)Rows,Features

ITable.CreateRow, IFeatureClass.CreateFeature分别设置属性和空间几何对象,然后调用IRow.Store和IFeatureClass.Store方法保存

创建多行和多个feature

ITable.CreateRowBuffer和IFeatureClass.CreateFeatureBuffer创建,用ITable.Insert和IFeatureClass.Insert保存

4)Fields:组成Tables, Objects和Features

通过IFields 和IIndex接口访问,当创建了字段集合以后,将Fields作为参数传给IFeatureWorkspace.CreateFeatureClass方法,用于创建feature class。

对已存在的数据集进行添加、删除字段操作,使用IClass接口的AddField,DeleteField和FindField方法,而不是IFieldsEdit接口

5)Domains:数据约束(属性规则),给字段指定有效值,存在于工作空间级别,可以被多个object class中的字段共享

类型:CodedValueDomain以字符串的形式给出某字段所有的有效值

            RangeDomain以最大最小值的形式给出某字段的取值范围

IField 读取字段信息,IFieldEdit修改字段信息

6)Subtypes:将具有相似规则与行为的对象划分到单独的objectclass中,在单个的objectclass中定义,不能共享,通过ISubtypes接口访问

7)Cursors和selection sets

    A.  cursors用于逐条遍历记录,只能往一个方向遍历

     类型:search:检索、编辑记录 ; update:编辑、删除记录; insert:添加记录。

     创建:通过接口ITable,IFeatureClass,ISelectionSet,IQueryDef创建,三种类型的cursors都可以通过ICursor和IFeatureCursor访问

    B. selection sets包含了某个数据集的子集,并一定包含ObjectID字段,通常通过ITable.Select方法获取,可以反复遍历多次

8) Queries:

      最简单的查询方法:ITable.Search和ITable.Select分别返回search cursor和selection set 通过IQueryFilter接口访问

      如果只获取符合条件的记录中的某几个字段的值,可以通过IQueryFilter.SubFields属性获取

     ISpatialFilter:

     IQueryDef:联合查询。

    一,只能对同一工作空间中的对象进行查询, 使用WhereClause属性设置联合查询条件;SubFields属性设置结果集中的字段集合;Evaluate方法获取查询结果。 

    二、从已存在的QueryDef对象创建query table,即创建IQueryName2类型的对象,并肩已有的QueryDef对象赋值给IQueryName2.QueryDef属性

      public void QueryName2_Direct(IWorkspace workspace)

{

    IFeatureWorkspace pFtWS=(IFeatureWorkspace)workspace;

    IQueryDef queryDef=pFtWS.CreateQueryDef();

   queryDef.SubFields="*";

   queryDef.Table="parcels,house_listings";

    queryDef.WhereClaus="parcel.parcel_id=house_listing.parcel_id";

    

    IQueryName2 queryName2=new TableQueryNameClass();

    queryName2.PrimaryKey="parcel.parcel_id";

    queryName2.QueryDef=queryDef;

}

   三、根据relationship类对象创建RelQueryTable对象,用以联接任意数据源的数据进行联合查询,实现ITable和IFeatureClass接口

      public void RelQryTabExample(IFeatureClass featureClass,string featureClassField,ITable table,string tableField)
        {
            IMemoryRelationshipClassFactory memoryRelationClassFactory = new MemoryRelationshipClassFactoryClass();
            IRelationshipClass relationshioClass = memoryRelationClassFactory.Open("samplejoin",(IObjectClass)featureClass,featureClassField,(IObjectClass)table,tableField,"forward","backward",esriRelCardinality.esriRelCardinalityOneToMany);
            IRelQueryTableFactory relQueryTableFactory = new RelQueryTableFactoryClass();
            ITable relQueryTable = (ITable)relQueryTableFactory.Open(relationshioClass,true,null,null,"",true,true);
            ICursor cursor = relQueryTable.Search(null,true);
            IFields fields = cursor.Fields;
            int i = fields.FieldCount;
            for (int j = 0; j < i;j++)
            {
                IField field = fields.get_Field(j);
                Console.WriteLine(field.Name);
            }
        }


联合查询比较 QueryDefQuery tableRelQueryTableCan span data sourcesfalsefalsetrueJoins persisted asCursorTableTableMatches all 1:N candidatesTrueTrueFalse