【二次开发】CityMaker数据操作——创建数据库

**

数据库创建

**

一、原理

FDB数据库定义了三层结构:数据源(DataSource)- 数据集(DataSet)- 要素类(FeatureClass)。

DataSource——数据源。

地理数据源,对应物理上的一个数据源,包括大文件、数据库、第三方空间数据库。可获取到要素数据集,要素字段,也可创建表存储字段信息,创建查询对象等。

FeatureDataSet——数据集

含有一个或者多个空间列的地理要素数据集。同时还可包含一个或多个表达对象或者特征之间联系的对象关系表,即包含ObjectClass的实例的数据集。支持多个要素类(FeatureClass),但是只有一个ModelClass(模型库),一个ImageClass(纹理库)。

FeatureClass——要素类

具有相同空间、时态、Property特征的一类地理特征。空间特征必须存在,且空间特征可以有一个或多个。空间特征可以是二维几何、三维几何、带有地理参考的栅格数据类型。也就是说要素类必须且至少具有一个空间几何字段。IFeatureClass继承于IObjectClass,IObjectClass继承于ITable。简单说,一个要素类就是由几张表构成的。

一个数据源可以管理多个数据集,一个数据集下可以有多个要素类。数据源的创建采用类工厂模式IDataSourceFactory,通过此接口可以实现数据源的创建,打开,移动,删除,资源回收等。给定数据集名称和投影坐标系对象通过IDataSource数据源的CreateFeatureDataset方法可以创建一个特征数据集,IFeatureDataset可以创建和打开下级的FeatureClass,ObjectClass。

实现代码
数据库的创建可归纳为以下四个步骤:

(1)新建一个类工厂DataSourceFactory;

(2)创建数据源

(3)创建数据集

(4)创建要素类

1. .Net

   IConnectionInfo ci=new ConnectionInfo();//FDE连接信息对象
   ci.ConnectionType = gviConnectionType.gviConnectionFireBird2x;
   ci.Database = @"D:\citymakerbookdata\数据库test1.FDB";
   IDataSourceFactory dsFactory = new DataSourceFactory();//类工厂
   IDataSource ds = dsFactory.CreateDataSource(ci,null);  //创建数据源        

   const string unknown = "UNKNOWNCS[\"unnamed\"]";
   ICoordinateReferenceSystem ptrCoordsys = new CRSFactory().CreateFromWKT(unknown);//坐标参考系统
   IFeatureDataSet dset = ds.CreateFeatureDataset("newDataset", ptrCoordsys as ISpatialCRS); //创建数据集
   IFieldInfoCollection fields = CreateFields();//创建字段集合,至少含一个空间列
   IFeatureClass fc = dset.CreateFeatureClass("POI", fields);//创建要素类

    //根据需求创建要素类中的字段
    private IFieldInfoCollection CreateFields()
    {
        IFieldInfoCollection fields = new FieldInfoCollection();
        IFieldInfo field0 = new FieldInfo();
        field0.Name = "NameF";
        field0.FieldType = gviFieldType.gviFieldString;
        field0.Alias = "名称";
        fields.Add(field0);

        IFieldInfo field1 = new FieldInfo();
        field1.Name = "Remark";
        field1.FieldType = gviFieldType.gviFieldString;
        field1.Alias = "备用";
        fields.Add(field1);

        IFieldInfo field2 = new FieldInfo();
        field2.Name = "Geometry";
        field2.FieldType = gviFieldType.gviFieldGeometry;
        IGeometryDef geodef = new GeometryDef();
        geodef.HasZ = true;
        geodef.GeometryColumnType = gviGeometryColumnType.gviGeometryColumnPOI;
        field2.GeometryDef = geodef;
        field2.Alias = "POI";
        
        fields.Add(field2);
        return fields;
    }

2. JS

    var ci = __g.new_ConnectionInfo;  
    ci.connectionType = gviConnectionType.gviConnectionFireBird2x;
    ci.database = "D:\citymakerbookdata\数据库test1.FDB";
    var dsFactory = __g.dataSourceFactory;
    var ds = dsFactory.createDataSource(ci,"");            

    var unknow = "UNKNOWNCS[\"unnamed\"]";
    var ptrCoordsys = __g.crsFactory.createFromWKT(unknow);
    var dset = ds.createFeatureDataset("newDataset", ptrCoordsys);            
    var fields = createFields();//该方法可以参考上面.NET代码
    var fc = dset.createFeatureClass("POI", fields);      

二、实现效果

通过创建数据源、数据集、要素类三步,数据库就创建好了。我们可以通过Builder打开来看一看。如下图所示,我们创建的数据库,三层结构分别为:数据库test1-newDataset-POI; 要素类中字段分别为我们通过代码添加的fieldinfo,其中空间列类型为POI。
【二次开发】CityMaker数据操作——创建数据库