搜索
开启辅助访问

QQ登录

只需一步,快速开始

立即注册 找回密码
查看: 486|回复: 2

关于FDB互导或者复制

[复制链接]

4

主题

4

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2016-9-6 11:34:31 | 显示全部楼层 |阅读模式
本帖最后由 墨染流年 于 2016-9-6 15:03 编辑

最近一段时间一直在折腾FDB互导的事,看起来很简单的事,做起来就没有那么简单,出了很多问题,所以写个帖子记录。

首先说一下步骤:

1.创建一个新的FDB

2.创建域

3.创建数据集

4.复制资源文件(模型,贴图)

5.创建要素类并添加字段,

6.添加渲染索引和域

7.导入数据(在此可以重新分组归类整理)

8.释放资源

下面,我们来看一下具体的:

1.创建一个新的FDB

IConnectionInfo conn = new ConnectionInfo();
       conn.ConnectionType = gviConnectionType.gviConnectionFireBird2x;
       conn.Database = 创建的文件路径(文件以.FDB结尾);
       IDataSource ds = new DataSourceFactory().CreateDataSource(conn, null);

这个如果是fdb之间互导可以省略,互导从第二个步骤开始。

2.创建域

在创建完FDB就要需要把域创建出来,

         string []DomainNames= old_ds.GetDomainNames();
                if (DomainNames.Length > 0)
                {
                    for (int i = 0; i < DomainNames.Length; i++)
                    {
                        ds.AddDomain(old_ds.GetDomainByName(DomainNames).Clone());
                    }
                }

3.创建数据集

有了数据源那么就可以创建数据集了,注意:这一步不一定要在创建域之后,与创建域没有必然关系,创建域只要在添加域之前就可以。

string wkt = @"UNKNOWNCS[""\unnamed\""]";//注意:符合OGC标准的WKT字符串。
       ICoordinateReferenceSystem crs = new CRSFactory().CreateFromWKT(wkt);

IFeatureDataSet fds= ds.CreateFeatureDataset(数据集名称, crs as ISpatialCRS);

4.复制资源文件(模型,贴图)

复制资源需要两个dataset,下面是从b数据集复制到a数据集,

     IResourceManager rmA = fdsA as IResourceManager;
            IResourceManager rmB = fdsB as IResourceManager;

            IModel fineModel = null;//精细模型
            IModel simpleModel = null;//简单模型

            EnumResName ern= rmB.GetModelNames();
            while (ern.MoveNext())
            {
                string modelName = ern.Current;
                if (!rmA.ModelExist(modelName))  //同名检查,注意:这里应该还有判断模型加密,如果加密直接跳过或者提醒都可以,我这里没加密的所以没有判断
                {
                    fineModel = rmB.GetModel(modelName);//获取精模
                    simpleModel = rmB.GetSimplifiedModel(modelName);//获取简模
                    if (fineModel != null)
                    {
                        if (rmA.AddModel(modelName, fineModel, simpleModel))
                        {
                            // 特别注意:判断贴图是否加密,加密的贴图无法入库
                            if (!rmB.IsImageEncrypted)
                            {
                                //添加模型贴图
                                string[] imgNames = fineModel.GetImageNames();
                                if (imgNames.Length > 0)
                                {
                                    foreach (string imgName in imgNames)
                                    {
                                        if (!rmA.ImageExist(imgName))
                                        {
                                            rmA.AddImage(imgName, rmB.GetImage(imgName));
                                        }
                                    }
                                }
                                if (simpleModel != null)
                                {
                                    imgNames = simpleModel.GetImageNames();
                                    if (imgNames.Length > 0)
                                    {
                                        foreach (string imgName in imgNames)
                                        {
                                            if (!rmA.ImageExist(imgName))
                                            {
                                                rmA.AddImage(imgName, rmB.GetImage(imgName));
      

5.创建要素类并添加字段,6.添加渲染索引和域,7.导入数据(在此可以重新分组归类整理),5,6,7,可以用一段代码写出,如果有分组归类情况可以自己改变一下代码,很简单,只要拆分一下就可以。

         string[] old_fcNames = old_dataset.GetNamesByType(gviDataSetType.gviDataSetFeatureClassTable);

         for (int i = 0; i < old_fcNames.Length; i++)
                {
                    old_fc = old_dataset.OpenFeatureClass(old_fcNames);
                    old_fields = old_fc.GetFields();

             fc = fds.CreateFeatureClass(新要素类名称, old_fields.Clone());//创建新的要素类

             //添加索引,域
                    if (fc != null)
                    {
                        fc.LockType = gviLockType.gviLockExclusiveSchema; //独占锁
                        IGridIndexInfo index = new GridIndexInfo();//空间列索引

                 //索引

                 index.L1 = 500;
                        index.L2 = 2000;
                        index.L3 = 10000;
                        index.GeoColumnName = "Geometry";//设置几何列名称为字段名称
                        fc.AddSpatialIndex(index as IIndexInfo);
                        IRenderIndexInfo rInfo = new RenderIndexInfo();
                        rInfo.GeoColumnName = "Geometry";
                        rInfo.L1 = 500;
                        fc.AddRenderIndex(rInfo);
                        //域
                        for (int i = 0; i < old_fields.Count; i++)
                        {
                            IFieldInfo old_field = old_fields.Get(i);
                            if (old_field.Name.ToLower() == "oid") { continue; }
                            if (old_field.Domain != null)
                            {
                                IFieldInfo fi = fc.GetFields().Get(fc.GetFields().IndexOf(old_field.Name));
                                fi.Domain = ds.GetDomainByName(old_field.Domain.Name);
                                fc.ModifyField(fi);
                            }
                        }
                        fc.LockType = gviLockType.gviLockSharedSchema; //共享锁
                    }

             IFdeCursor cursor = old_fc.Search(查询条件,如果没有new一个QueryFilter对象全部查询就可以, true);
                    int rowcount = old_fc.GetCount(查询条件,如果没有new一个QueryFilter对象全部查询就可以);
                    IRowBuffer row;

             IFdeCursor cursorInsert=fc.Insert();

             for (int k = 0; k < rowcount; k++)
                    {
                        row = cursor.NextRow();

                 row.SetNull(0);//给oid赋值为null,注意:这一步很重要,如果是重新整理数据的话,很可能oid重复报错,我就在在这被坑好久

                 cursorInsert.InsertRow(row.Clone(););//添加数据
                    }
                }

8.释放资源就不用说了吧,有close的就close,没有的就用System.Runtime.InteropServices.Marshal.ReleaseComObject(comObj)来强制销毁。

差不多整个代码都贴出来了,源码就不上传了,有问题可以在评论里说明。

觉得不错不要忘了给个好评撒

0

主题

1

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2016-9-6 15:08:23 | 显示全部楼层
学习了
回复

使用道具 举报

2

主题

3

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2016-10-25 14:35:24 来自手机 | 显示全部楼层
学习一下,也是刚开始研究citymaker

QQ|Archiver|手机版|GIS3D 基地 ( 京ICP备16033688号

GMT+8, 2017-10-20 02:23 , Processed in 0.109307 second(s), 27 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表
 
Skyline中文社区-总群
帮主 gis3d 海洪