【二次开发】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。