【二次开发】CityMaker数据加载——三维模型

版权声明:CityMaker技术服务中心——小白 https://blog.csdn.net/weixin_38476447/article/details/86686910

**

加载三维模型

**

一: 技术原理

三维模型是计算机对现实世界最真实的表达。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之间。其它值会按照值归类到这个范围内。

猜你喜欢

转载自blog.csdn.net/weixin_38476447/article/details/86686910