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)
Table | Object class | FeatureClass | |
Contains | Rows | Objects | Features |
Row createion method | ITable.CreateRow | ITable.CreateRow | IFeatureClass.CreateFeature |
Supports subtypes | false | true | true |
Supports domains | false | true | true |
Requrired fields | None | ObjectID | ObjectID,shape |
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);
}
}
QueryDef | Query table | RelQueryTable | |
Can span data sources | false | false | true |
Joins persisted as | Cursor | Table | Table |
Matches all 1:N candidates | True | True | False |