arcengine开发 GDB转VCT 拿去吧你

4 篇文章 0 订阅
4 篇文章 1 订阅

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using System.IO;
using System.Windows.Forms;
using Domain.VCT.FileGDB;
using Esri.FileGDB;
using Domain.Log;
using log4net;
using Domain.VCT.Geo;
namespace Domain.VCT
{
    public class GDB2VCTConvertor
    {
        //日志
        protected ILog logger = LoggerService.GetLogger();
        public GDB2VCTConvertor()
        {
        }
        /// <summary>
        /// 获取gdb文件中的所有图层节点,并按照层级结构组织成树状结构
        /// </summary>
        /// <param name="gdbPath">gdb文件路径</param>
        /// <returns></returns>
        public List<LayerNode> GetLayerNodesForGDB(string gdbPath)
        {
            List<LayerNode> layerNodeList = null;
            IWorkspaceFactory gdbWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
            IFeatureWorkspace pFeatureWorkspace = gdbWorkspaceFactory.OpenFromFile(gdbPath, 0) as IFeatureWorkspace;
            IWorkspace pWorkspace = gdbWorkspaceFactory.OpenFromFile(gdbPath, 0) as IWorkspace;
            IEnumDataset pEnumDataSets = pWorkspace.get_Datasets(esriDatasetType.esriDTAny);
            pEnumDataSets.Reset();
            IDataset pDataSet = pEnumDataSets.Next();
            if (pDataSet != null)
            {
                layerNodeList = new List<LayerNode>();
            }
            //用于输出测试
            int releasI = -1;
            while (pDataSet != null)
            {
                if (pDataSet is IFeatureDataset)
                {
                    IFeatureDataset pFeatureDataSet = pFeatureWorkspace.OpenFeatureDataset(pDataSet.Name);
                    IFeatureClassContainer pFeatureclassContainer = (IFeatureClassContainer)pFeatureDataSet;
                    IEnumFeatureClass pEnumFeatureClass = (IEnumFeatureClass)pFeatureclassContainer.Classes;
                    IFeatureClass pFeatureClass = (IFeatureClass)pEnumFeatureClass.Next();
                    //子节点链表
                    List<LayerNode> childrenNodeList = new List<LayerNode>();
                    TreeNode[] childrenNodes = new TreeNode[5];
                    while (pFeatureClass != null)
                    {
                        IDataset pFeaureClassDataSet = pFeatureClass as IDataset;
                        LayerNode childrenNode = new LayerNode() { name = pFeaureClassDataSet.Name, aliasName = pFeatureClass.AliasName, featureType = pFeatureClass.FeatureType, shapeType = pFeatureClass.ShapeType };
                        childrenNodeList.Add(childrenNode);
                        pFeatureClass = (IFeatureClass)pEnumFeatureClass.Next();
                        if (pFeaureClassDataSet != null)
                        {
                            GC.Collect();
                            releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeaureClassDataSet);
                            Console.WriteLine("pFeaureClassDataSet {0} - {1}", "释放", releasI);
                        }
                    }
                    LayerNode layerNode = new LayerNode() { name = pDataSet.Name };
                    if (childrenNodeList.Count > 0)
                    {
                        layerNode.childrenList = childrenNodeList;
                    }
                    layerNodeList.Add(layerNode);
                    if (pFeatureDataSet != null)
                    {
                        GC.Collect();
                        releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureDataSet);
                        Console.WriteLine("pFeatureDataSet {0} - {1}", "释放", releasI);
                    }
                    if (pFeatureclassContainer != null)
                    {
                        GC.Collect();
                        releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureclassContainer);
                        Console.WriteLine("pFeatureclassContainer {0} - {1}", "释放", releasI);
                    }
                    if (pEnumFeatureClass != null)
                    {
                        GC.Collect();
                        releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumFeatureClass);
                        Console.WriteLine("pEnumFeatureClass {0} - {1}", "释放", releasI);
                    }
                    if (pFeatureClass != null)
                    {
                        GC.Collect();
                        releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureClass);
                        Console.WriteLine("pFeatureClass {0} - {1}", "释放", releasI);
                    }
                }
                else if (pDataSet is IFeatureClass)
                {
                    IFeatureClass pFeature = pDataSet as IFeatureClass;
                    LayerNode childrenNode = new LayerNode() { name = pDataSet.Name };
                    layerNodeList.Add(childrenNode);
                }
                else if (pDataSet is ITable)
                {
                    ITable pTable = pDataSet as ITable;
                    LayerNode childrenNode = new LayerNode() { name = pDataSet.Name };
                    layerNodeList.Add(childrenNode);
                }
                pDataSet = pEnumDataSets.Next();
            }
            //释放workspace空间,即关闭workspace
            /*pFeatureWorkspace = null;
            pWorkspace = null;
            gdbWorkspaceFactory = null;*/
            if (pDataSet != null)
            {
                GC.Collect();
                releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pDataSet);
                pDataSet = null;
                Console.WriteLine("pDataSet {0} - {1}", "释放", releasI);
            }
            if (pEnumDataSets != null)
            {
                GC.Collect();
                releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumDataSets);
                pEnumDataSets = null;
                Console.WriteLine("pEnumDataSets {0} - {1}", "释放", releasI);
            }
            if (pWorkspace != null)
            {
                GC.Collect();
                releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pWorkspace);
                pWorkspace = null;
                Console.WriteLine("pWorkspace {0} - {1}", "释放", releasI);
            }
            if (pFeatureWorkspace != null)
            {
                GC.Collect();
                releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureWorkspace);
                pFeatureWorkspace = null;
                Console.WriteLine("pFeatureWorkspace {0} - {1}", "释放", releasI);
            }
            if (gdbWorkspaceFactory != null)
            {
                //关闭资源锁定  
                IWorkspaceFactoryLockControl ipWsFactoryLock = (IWorkspaceFactoryLockControl)gdbWorkspaceFactory;
                if (ipWsFactoryLock.SchemaLockingEnabled)
                {
                    ipWsFactoryLock.DisableSchemaLocking();
                }
                GC.Collect();
                releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(gdbWorkspaceFactory);
                releasI = System.Runtime.InteropServices.Marshal.ReleaseComObject(ipWsFactoryLock);
                gdbWorkspaceFactory = null;
                Console.WriteLine("gdbWorkspaceFactory {0} - {1}", "释放", releasI);
            }
            GC.Collect();
            GC.WaitForPendingFinalizers();
            return layerNodeList;
        }
        public bool GDB2VCTConvert(string gdbPath, string vctPath)
        {
            bool flag = false;
            Geodatabase _geodatabase;
            _geodatabase = Geodatabase.Open(gdbPath);
            string[] dataSetTypes = _geodatabase.DataSetTypes;
            IWorkspaceFactory gdbWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
            IFeatureWorkspace pFeatureWorkspace = gdbWorkspaceFactory.OpenFromFile(gdbPath, 0) as IFeatureWorkspace;
            IWorkspace pWorkspace = gdbWorkspaceFactory.OpenFromFile(gdbPath, 0) as IWorkspace;
            IEnumDataset pEnumDataSets = pWorkspace.get_Datasets(esriDatasetType.esriDTAny);
            pEnumDataSets.Reset();
            //采用系统默认编码方式
            /*
             *  FileMode.Create直接创建新的文件
             *  FileMode.Append追加
             *  FileMode.OpenOrCreate如果文件存在则打开,写的覆盖文件,如果写入文件没有原来文件长,则没有覆盖的部分仍旧存在。
             */
            FileStream fWriter = new FileStream(vctPath, FileMode.Create, FileAccess.Write);
            StreamWriter streamWriter = new StreamWriter(fWriter, Encoding.Default);
            VCT vct = new VCT();
            Header header = vct.mHeader;
            header.DataMark = "CNSDTF-VCT";
            /*
             当前版本
             */
            header.Version = "GB/T 17798-2007";
            /*             
             * C表示笛卡尔坐标系
             * D表示大地坐标系
             * P表示投影坐标系
             * 缺省为C
             */
            header.CoordinateSystemType = "C";
            header.Dim = 2;
            /*
             * M表示米
             * D表示经纬度
             */
            header.XYUnit = "M";
            header.Topo = 0;
            header.MinX = 79.238;
            header.MinY = 27.608;
            header.MaxX = 89.070;
            header.MaxY = 36.583;
            header.Separator = ',';
            vct.mHeader.write(streamWriter, vct.mHeader.Separator);
            //vct.mFeatureTypes = new FeatureTypes(new PartTag { BeginTag = "FeatureCodeBegin", EndTag = "FeatureCodeEnd" });
            //输出要素类型
            vct.mFeatureTypes.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
            pEnumDataSets.Reset();
            //输出属性表结构
            vct.mTableStructurePart.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
            IDataset pDataSet = pEnumDataSets.Next();
            //输出几何要素
            vct.mGeometryPart.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
            //输出注记
            vct.mAnnotationPart.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
            //输出属性表
            vct.mAttributePart.write(streamWriter, pEnumDataSets, pFeatureWorkspace, header.Separator);
            /*if (pDataSet is IFeatureDataset) {
                IFeatureDataset pFeatureDataSet = pFeatureWorkspace.OpenFeatureDataset(pDataSet.Name);
                IFeatureClassContainer pFeatureclassContainer = (IFeatureClassContainer)pFeatureDataSet;
                IEnumFeatureClass pEnumFeatureClass = (IEnumFeatureClass)pFeatureclassContainer.Classes;
                IFeatureClass pFeatureClass = (IFeatureClass)pEnumFeatureClass.Next();
                while (pFeatureClass != null)//在每一个数据集中遍历数据层IFeatureClass
                {
                    IFields pFields = pFeatureClass.Fields;
                    int count=pFields.FieldCount;
                    IField pfield = pFields.get_Field(0);
                    string fName = pfield.Name;
                    int fLength=pfield.Length;
                    //esriFeatureType type = pfield.Type;
                    WriteFeatureClass(pFeatureClass);
                }
                int i = 0;
            }
            else if (pDataSet is ITable)
            {
            }
            else if (pDataSet is IFeatureClass) { 
            }*/
            streamWriter.Close();
            fWriter.Close();
            return flag;
        }
        /// <summary>
        /// 将gdb中指定的图层转换至vct文件中
        /// </summary>
        /// <param name="gdbPath">gdb文件路径</param>
        /// <param name="vctPath">转出的vct文件路径</param>
        /// <param name="LayerlayerPaths">gdb中要转出的图层路径,如"\\Dataset\\PDT"</param>
        /// <returns></returns>
        public bool GDB2VCTConvert(string gdbPath, string vctPath, IList<string> LayerlayerPaths)
        {
            bool flag = false;
            //采用系统默认编码方式
            /*
             *  FileMode.Create直接创建新的文件
             *  FileMode.Append追加
             *  FileMode.OpenOrCreate如果文件存在则打开,写的覆盖文件,如果写入文件没有原来文件长,则没有覆盖的部分仍旧存在。
             */
            FileStream fWriter = new FileStream(vctPath, FileMode.Create, FileAccess.Write);
            StreamWriter streamWriter = new StreamWriter(fWriter, Encoding.Default);
            FileGDB_VCT vct = new FileGDB_VCT();
            logger.Info("开始转换GDB到VCT");
            logger.InfoFormat("-----------------------------------------------------");
            Header header = vct.mHeader;
            header.DataMark = "CNSDTF-VCT";
            /*
             当前版本
             */
            header.Version = "GB/T 17798-2007";
            /*             
             * C表示笛卡尔坐标系
             * D表示大地坐标系
             * P表示投影坐标系
             * 缺省为C
             */
            header.CoordinateSystemType = "C";
            header.Dim = 2;
            /*
             * M表示米
             * D表示经纬度
             */
            header.XYUnit = "M";
            header.Topo = 0;
            header.Separator = ',';
            //vct.mFeatureTypes = new FeatureTypes(new PartTag { BeginTag = "FeatureCodeBegin", EndTag = "FeatureCodeEnd" });
            Geodatabase _geodatabase = null;
            try
            {
                _geodatabase = Geodatabase.Open(gdbPath);
                FileGDBTableHelper fGDBTableHelper = new FileGDBTableHelper();
                List<Esri.FileGDB.Table> tableList = new List<Esri.FileGDB.Table>();
                //元数据几何
                List<TableMeta> tableMetaList = new List<TableMeta>();
                List<TableInfo> tableInfoList = new List<TableInfo>();
                VExtent totalExtent = new VExtent();
                totalExtent.XMin = float.MaxValue;
                totalExtent.YMin = float.MaxValue;
                totalExtent.XMax = float.MinValue;
                totalExtent.YMax = float.MinValue;
                foreach (string layerPath in LayerlayerPaths)
                {
                    // Open the Polygon test table, states.
                    Esri.FileGDB.Table mTable = _geodatabase.OpenTable(layerPath);
                    TableMeta tMeta = fGDBTableHelper.GetTableMeataFromMetaDefinition(mTable.Definition);
                    tableList.Add(mTable);
                    tableMetaList.Add(tMeta);
                    //数据表与其元数据组成的对象,用于文件记录输出
                    TableInfo tableInfo = new TableInfo() { mTable = mTable, mTableMeta = tMeta };
                    tableInfoList.Add(tableInfo);
                    //头文件赋值
                    totalExtent = totalExtent.ExtentMerge(tMeta.Extent);
                    header.CoordinateSystemType = tMeta.CoordinateSystem.CoordinateSystemType;
                    header.Spheroid = tMeta.CoordinateSystem.Ellipsoid.Spheroid;
                    header.Projection = tMeta.CoordinateSystem.Projection == null ? "" : tMeta.CoordinateSystem.Projection.Name;
                    header.MapScale = tMeta.CoordinateSystem.MapScale;
                    /*
                     * M表示米
                     * D表示经纬度
                     */
                    header.XYUnit = tMeta.CoordinateSystem.Projection == null ? "D" : "M";
                }
                header.MinX = totalExtent.XMin;
                header.MinY = totalExtent.YMin;
                header.MaxX = totalExtent.XMax;
                header.MaxY = totalExtent.YMax;
                //输出文件头
                vct.mHeader.write(streamWriter, vct.mHeader.Separator);
                //输出要素类型
                vct.mGenerallFeatureTypePart.write(streamWriter, tableMetaList, header.Separator);
                //输出属性表结构
                vct.mGenerallTableStructurePart.write(streamWriter, tableMetaList, header.Separator);
                //输出几何要素
                vct.mFileGDBGeometryPart.write(streamWriter, tableInfoList, header.Separator);
                //输出注记
                vct.mGenerallAnnotationPart.write(streamWriter, tableInfoList, header.Separator);
                //输出属性表
                vct.mGenerallAttributePart.write(streamWriter, tableInfoList, header.Separator);
                /*
                 * 输出图形表现数据
                 * vct.mGenerallAnnotationPart.mAnnotationList为在输出annotation时读取到的注记信息
                 * 
                 * 没有写日志
                 */
                vct.mGenerallRepresentationPart.write(streamWriter, vct.mGenerallAnnotationPart.mAnnotationList, header.Separator);
            }
            catch (FileGDBException ex)
            {
                Console.WriteLine("GDB2VCTConvert failed {0} - {1}", ex.Message, ex.ErrorCode);
                this.logger.Error(ex.Message.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine("GDB2VCTConvert failed General exception.  " + ex.Message);
                this.logger.Error(ex.Message.ToString());
            }
            finally
            {
                if (_geodatabase != null)
                {
                    _geodatabase.Close();
                }
            }
            streamWriter.Close();
            fWriter.Close();
            this.logger.Info("转换GDB到VCT结束");
            this.logger.InfoFormat("-----------------------------------------------------");
            return flag;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        private bool Table2VCT()
        {
            bool flag = false;
            try
            {
            }
            catch (FileGDBException ex)
            {
                Console.WriteLine("PolygonGeomTest failed {0} - {1}", ex.Message, ex.ErrorCode);
            }
            catch (Exception ex)
            {
                Console.WriteLine("PolygonGeomTest failed General exception.  " + ex.Message);
            }
            return flag;
        }
        public bool WriteFeatureClass(IFeatureClass myFeatureClass)
        {
            bool flag = false;
            FeatureType fType = new FeatureType();
            //获取几何要素类型
            string strFeatureType = "";
            switch (myFeatureClass.ShapeType)
            {
                case esriGeometryType.esriGeometryPoint:
                    strFeatureType = "Point";
                    break;
                case esriGeometryType.esriGeometryLine:
                    strFeatureType = "Line";
                    break;
                case esriGeometryType.esriGeometryPolygon:
                    strFeatureType = "Polygon";
                    break;
            }
            fType.mGeomtryType = strFeatureType;
            //fType.mTypeName=myFeatureClass.
            IFeatureCursor pFeatCursor = myFeatureClass.Search(null, false);
            IFeature pFeature = pFeatCursor.NextFeature();
            while (pFeature != null)
            {
                IGeometry pGeo;
                pGeo = pFeature.Shape;
                pFeature.get_Value(0);
                //pFeat.Fields.get_Field(0).Type;
                //esriFieldType.
                pFeature.get_Value(0);
                if (pGeo is IPolyline)
                {
                    IPolyline pline = pGeo as IPolyline;
                }
                if (pGeo is IPoint)
                {
                    IPoint pLabelPoint = pGeo as IPoint;
                }
                if (pGeo is IPolygon)
                {
                    IPolygon pPolygon = pGeo as IPolygon;
                }
                pFeature = pFeatCursor.NextFeature();
            }
            //fType.mGeomtryType = pFeatureClass.FeatureType;
            return flag;
        }
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值