【二次开发】CityMaker数据加载——三维模型
**
加载三维模型
**
一: 技术原理
三维模型是计算机对现实世界最真实的表达。CityMaker默认支持的数据库为关系型数据库FDB,即Firebird DataBase。它是一种关系型数据库,存储了地理数据与非地理数据,和各种数据之间的关系,存储了CityMaker所定义的数据结构的三维数据。CityMaker将其操作过程封装在了数据引擎,用户不需要另外安装数据库即可读取。CityMaker同样支持其它关系型数据库如Oracle/MySql/PostgreSql等等,我们可以使用它们建立具有与FDB同样结构的数据库。
FDB是什么?
如上图: FDB数据库定义了三层数据表结构:数据源(DataSource)-数据集(DataSet)-要素类(FeatureClass)。
DataSource——数据源。
地理数据源,对应物理上的一个数据源,包括大文件、数据库、第三方空间数据库。可获取到要素数据集,要素字段,也可创建表存储字段信息,创建查询对象等。
FeatureDataSet——数据集
含有一个或者多个空间列的地理要素数据集。同时还可包含一个或多个表达对象或者特征之间联系的对象关系表,即包含ObjectClass的实例的数据集。支持多个要素类(FeatureClass),但是只有一个ModelClass(模型库),一个ImageClass(纹理库)。
FeatureClass——要素类
具有相同空间、时态、Property特征的一类地理特征。空间特征必须存在,且空间特征可以有一个或多个。空间特征可以是二维几何、三维几何、带有地理参考的栅格数据类型。也就是说要素类必须且至少具有一个空间几何字段。IFeatureClass继承于IObjectClass,IObjectClass继承于ITable。简单说,一个要素类就是由几张表构成的。
一个数据源可以管理多个数据集,一个数据集下可以有多个要素类。数据源的创建采用类工厂模式IDataSourceFactory,通过此接口可以实现数据源的创建,打开,移动,删除,资源回收等。给定数据集名称和投影坐标系对象通过IDataSource数据源的CreateFeatureDataset方法可以创建一个特征数据集,IFeatureDataset可以创建和打开下级的FeatureClass,ObjectClass。
CityMaker支持的所有关系型数据库参见第三节,或者参考SDKHelp中的gviConnectionType。
本章节主要展示如何加载其它关系型数据库的三维模型数据。
二:实现步骤
1. .Net步骤
(1)设置数据源连接
MySql数据库
private void setMySqlDatasourceConnection()
{
IConnectionInfo ci = new ConnectionInfo(); //新建数据连接
ci.ConnectionType = gviConnectionType.gviConnectionMySql5x; //设置数据连接类型为MySql
ci.Server = "localhost"; //服务器地址为本机
ci.Port = 3306; //端口为3306
ci.Database = "test"; //数据库名称为test
ci.UserName = "root"; //用户名为root
ci.Password = "root"; //密码为root
}
Oracle数据库
private void setOracleDatasourceConnection()
{
IConnectionInfo ci = new ConnectionInfo(); //新建数据连接
ci.ConnectionType = gviConnectionType.gviConnectionOCI11; //设置数据连接类型为Oracl
ci.Server = "localhost"; //服务器地址为本机
ci.Port = 1521; //端口为1521
ci.Database = "test"; //数据库名称为test
ci.Instance = "orcl"; //数据库实例
ci.UserName = "admin"; //用户名为root
ci.Password = "admin"; //密码为root
}
CityMaker Server Http
private void setCMDatasourceConnection()
{
IConnectionInfo ci = new ConnectionInfo(); //新建数据连接
ci.ConnectionType = gviConnectionType.gviConnectionCms7Http; //设置数据连接类型为CityMaker
ci.Server = "localhost"; //服务器地址为本机
ci.Port = 8040; //端口为8040
ci.Database = "test"; //数据库名称为test
ci.UserName = ""; //用户名与密码皆为空
ci.Password = "";
}
ArcSDE 数据库
private void setSDEDatasourceConnection()
{
IConnectionInfo ci = new ConnectionInfo(); //新建数据连接
ci.ConnectionType = gviConnectionType.gviConnectionArcSDE10x; //设置数据连接类型为ArcSDE
ci.Server = "localhost"; //服务器地址为本机
ci.Database = "test"; //数据库名称为test
ci.Instance = "5151"; //数据库实例
ci.UserName = "sde"; //用户名为root
ci.Password = "sde"; //密码为root
ci.Version = "sde.DEFAULT"; //数据库版本信息
}
SQLite3
private void setSQLiteDatasourceConnection()
{
IConnectionInfo ci = new ConnectionInfo(); //新建数据连接
ci.ConnectionType = gviConnectionType.gviConnectionSQLite3; //设置数据连接类型为SQLite
ci.Database = "e:\\china.sdb"; //数据库文件地址
ci.UserName = ""; //用户名与密码皆为空
ci.Password = "";
}
(2)加载三维模型
private void loadModel()
{
//打开数据源,获取数据集
IDataSourceFactory dsFactory = new DataSourceFactory();
IDataSource ds = dsFactory.OpenDataSource(ci); //利用数据源工厂打开数据数据源
string[] setnames = (string[])ds.GetFeatureDatasetNames();//获得所有数据集的名称
if (setnames.Length == 0)
return;
IFeatureDataSet dataset = ds.OpenFeatureDataset(setnames[0]);//通过数据集名称打开第一个数据集
string[] fcnames = (string[])dataset.GetNamesByType(gviDataSetType.gviDataSetFeatureClassTable);//通过数据集类型获取FeatureClass(要素类)的所有名称
if (fcnames.Length == 0)
return;
Guid rootId = rendercontrol.ObjectManager.GetProjectTree().RootID; //也可直接用字符串"11111111-1111-1111-1111-111111111111"
//获取要素类,创建要素图层
foreach (string name in fcnames)
{
IFeatureClass fc = dataset.OpenFeatureClass(name);//通过要素类名称打开要素类
IFeatureLayer featureLayer = rendercontrol.ObjectManager.CreateFeatureLayer(fc, "Geometry", null, null, rootId);//创建几何字段名称为“Geometry”的图层
}
}
2. JS步骤
(1)设置数据源连接
MySQL
function setMySqlDatasourceConnection(){
var ci = __g.new_ConnectionInfo; //新建数据连接
ci.connectionType = 2; // 2:gviConnectionType.gviConnectionMySql5x; 设置数据连接类型为MySql
ci.server = "localhost"; //服务器地址为本机
ci.port = "3306"; //端口为3306
ci.database = "test"; //数据库名称为test
ci.userName = "root"; //用户名为root
ci.password = "root"; //密码为root
}
Oracle数据库
function setOracleDatasourceConnection(){
var ci = __g.new_ConnectionInfo; //新建数据连接
ci.connectionType = 4; // 4:gviConnectionType.gviConnectionOCI11; 设置数据连接类型为Oracl
ci.server = "localhost"; //服务器地址为本机
ci.port = 1521; //端口为1521
ci.database = "test"; //数据库名称为test
ci.instance = "orcl"; //数据库实例
ci.userName = "admin"; //用户名为root
ci.password = "admin"; //密码为root
}
CityMaker Server Http
function setCMDatasourceConnection(){
var ci = __g.new_ConnectionInfo; //新建数据连接
ci.connectionType = 101; // 101:gviConnectionType.gviConnectionCms7Http; 设置数据连接类型为CityMaker
ci.server = "localhost"; //服务器地址为本机
ci.port = 8040; //端口为8040
ci.database = "test"; //数据库名称为test
ci.userName = ""; //用户名与密码皆为空
ci.password = "";
}
ArcSDE 数据库
function setSDEDatasourceConnection(){
var ci = __g.new_ConnectionInfo; //新建数据连接
ci.connectionType = 15; // 15: gviConnectionType.gviConnectionArcSDE10x; 设置数据连接类型为ArcSDE
ci.server = "localhost"; //服务器地址为本机
ci.database = "test"; //数据库名称为test
ci.instance = "5151"; //数据库实例
ci.userName = "sde"; //用户名为root
ci.password = "sde"; //密码为root
ci.version = "sde.DEFAULT"; //数据库版本信息
}
SQLite3
function setOracleDatasourceConnection(){
var ci = __g.new_ConnectionInfo; //新建数据连接
ci.connectionType = 10; // 10:gviConnectionType.gviConnectionSQLite3; 设置数据连接类型为SQLite
ci.database = "e:\\china.sdb"; //数据库文件地址
ci.userName = ""; //用户名与密码皆为空
ci.password = "";
}
(2)加载三维模型
function loadModel(){
//打开数据源,获得数据集
var ds = __g.dataSourceFactory.openDataSource(ci); //利用数据源工厂打开数据库
var fdsNames = ds.getFeatureDatasetNames(); //获得所有数据集的名称
if (fdsNames.length == 0)
return false;
var __fds = ds.openFeatureDataset(fdsNames[0]); //打开第一个数据集
var fcNames = __fds.getNamesByType(3); // 3: gviDataSetType.gviDataSetFeatureClassTable; 获得数据集中所有要素类(FeatureClass)的名称
if (fcNames.length == 0)
return false;
var __rootId = __g.objectManager.getProjectTree().rootID; //也可直接用字符串"11111111-1111-1111-1111-111111111111"
//获取要素类,创建要素图层
for (var i = 0; i < fcNames.length; i++) {
var fc = __fds.openFeatureClass(fcNames[i]); //通过名称打开要素类
var fl = __g.objectManager.createFeatureLayer(fc, "Geometry", null, null, __rootId); //创建几何字段名称为“Geometry”的图层
}
}
三:注意事项
1.CityMaker三维模型能够存储在以下的数据库中:
仅列出支持三维模型的连接类型,所有数据源连接类型请参考SDKHelp中IConnectionInfo::ConnectionType
• gviConnectionMySql5x mysql 5.5及以上
• gviConnectionFireBird2x FireBird 2.1.
• gviConnectionOCI11 Oracle 9, Oracle 10, Oracle 11. 需安装Oracle客户端
• gviConnectionPg9 PostgreSQL.
• gviConnectionMSClient Microsoft SQLServer Native Client 2005及以上,需安装SQLServer客户端
• gviConnectionGBase8t GBase8t client.
• gviConnectionArcSDE9x Arc SDE 9 C API
• gviConnectionArcSDE10x Arc SDE 10 C API .
• gviConnectionCms7Http CityMaker Server 7 REST interface, HTTP protocol.
• gviConnectionCms7Https CityMaker Server 7 REST interface, HTTPS protocol.
2.在用其它类型数据库时,可增添该类数据库所需参数,请根据具体情况合理设置
如下(仅列出支持三维模型的连接类型,所有类型请参考SDKHelp中的 IConnectionInfo::SetProperty 方法):
•当ConnectionType == gviConnectionType.gviConnectionFireBird2x时,支持的配置参数有:
•DB_BUFFER_PAGE_NUM 页面大小,会消耗内存。默认值50,取值范围 50 - 131072之间。其它值会按照值归类到这个范围内。