CAD数据导入数据库

CAD数据导入数据库

1、读取CAD数据

分层读取CAD数据

        /// <summary>
        /// 获取CAD图层(点线面)
        /// </summary>
        /// <param name="filePath">CAD文件路径</param>
        /// <param name="featureType">导出类型1 点 2 线 3 面 4 注记</param>
        /// <returns></returns>
        private IFeatureLayer GetCADFeatureLayer(string filePath, int featureType)
        {
            if (!File.Exists(filePath))
                return null;
            //创建CAD工作空间
            IFeatureLayer layer = new CadFeatureLayerClass();
            CadWorkspaceFactoryClass CADWFC = new CadWorkspaceFactoryClass();
            IFeatureWorkspace workspace = CADWFC.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0) as IFeatureWorkspace;
            //打开工作数据集
            IFeatureDataset featureDataset = workspace.OpenFeatureDataset(System.IO.Path.GetFileName(filePath));
            IFeatureClassContainer featureClassContainer = (IFeatureClassContainer)featureDataset;
            //CAD文件要素遍历
            for (int i = 0; i < featureClassContainer.ClassCount; i++)
            {
                //获取要素
                IFeatureClass featureClass = featureClassContainer.get_Class(i);
                //判断类型
                if (featureClass.ShapeType == esriGeometryType.esriGeometryPoint && featureType == 1)
                {
                    //点
                    layer.FeatureClass = featureClass;
                    return layer;
                }
                else if (featureClass.ShapeType == esriGeometryType.esriGeometryPolyline && featureType == 2)
                {
                    //线
                    layer.FeatureClass = featureClass;
                    return layer;
                }
                else if (featureClass.ShapeType == esriGeometryType.esriGeometryPolygon && featureType == 3)
                {
                    //面  
                    layer.FeatureClass = featureClass;
                    return layer;
                }
                else if (featureClass.ShapeType == esriGeometryType.esriGeometryAny && featureType == 4)
                {
                    //注记
                    layer = new CadAnnotationLayerClass();
                    layer.FeatureClass = featureClass;
                    return layer;
                }
            }
            return null;
        }

2、写入数据

        /// <summary>
        /// 数据入库
        /// </summary>
        /// <param name="currentLayer">入库图层(写入数据的图层)</param>
        /// <param name="CadPath">CAD文件路径</param>
        /// <param name="fieldGridView">通用属性字段表</param>
        /// <param name="progressInput">进度条</param>
        private void SaveFeature(IFeatureLayer currentLayer, string CadPath, GridView fieldGridView,ProgressBarControl progressInput)
        {
            //参数判断
            if (!File.Exists(CadPath))
            {
                return;
            }
            
            //获取Cad 点图层
            IFeatureLayer featureLayer = GetCADFeatureLayer(CadPath, 1);
            IFeatureCursor featureCursor = null;

            string sql = "";
            featureCursor = featureLayer.Search(null, false);
            //设置最大进度条
            progressInput.Properties.Maximum = featureLayer.FeatureClass.FeatureCount(null)+5;
            //判断数据是否存在
            if (progressInput.Properties.Maximum==5)
            {
                return;
            }

            progressInput.Properties.ShowTitle = true;
            progressInput.Properties.PercentView = true;
            progressInput.Properties.Step = 1;
            progressInput.EditValue = 5;

            //字段表
            DataTable dataTable = ((DataView)fieldGridView.DataSource).ToTable();
            if (dataTable.Rows.Count==0)
            {
                return;
            }
            //默认字段
            Dictionary<string, string> fieldsDic = new Dictionary<string, string>
            {
                { "ISTEMP", "0" }
            };
            //赋值字段
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                if (dataTable.Rows[i][1] != null && dataTable.Rows[i][1].ToString() != "")
                    fieldsDic.Add(dataTable.Rows[i][0].ToString(), dataTable.Rows[i][1].ToString());
            }

            //创建要素
            IWorkspaceEdit workspace = (IWorkspaceEdit)((IDataset)currentLayer).Workspace;
            try
            {
                if (workspace.IsBeingEdited())
                {
                    return;
                }
                //打开编辑
                workspace.StartEditing(false);
                workspace.StartEditOperation();
                // 创建要素缓存
                IFeatureBuffer newFeatureBuffer = currentLayer.FeatureClass.CreateFeatureBuffer();
                IFeatureCursor insertCursor = currentLayer.FeatureClass.Insert(true);

                IFeature feature;
                while ((feature = featureCursor.NextFeature()) != null)
                {
                    progressInput.PerformStep();
                    newFeatureBuffer.Shape = feature.Shape;
                    //字段赋值
                    foreach (string key in fieldsDic.Keys)
                    {
                        if (newFeatureBuffer.Fields.FindField(key)!=-1)
                        {
                            newFeatureBuffer.set_Value(newFeatureBuffer.Fields.FindField(key), fieldsDic[key]);
                        }
                    }
                    insertCursor.InsertFeature(newFeatureBuffer);
                    System.Windows.Forms.Application.DoEvents();
                }
                //写入
                insertCursor.Flush();
                //保存与结束编辑
                workspace.StopEditOperation();
                workspace.StopEditing(true);
            }
            catch
            {
                //异常 关闭编辑
                workspace.StopEditOperation();
                workspace.StopEditing(true);
                return;
            }
        }

3、解释

进度条说解释ProgressBarControl:

  1. 刷新进度
    System.Windows.Forms.Application.DoEvents();
  2. 进度条百分比设置:
    progressInput.Properties.ShowTitle = true; progressInput.Properties.PercentView = true;

4、项目引用

using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid.Views.Grid
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Windows.Forms;

5、声明

1)文章来源于项目实践,如存在问题或疑问,请留言,感谢您的阅读,谢谢!
2)转载请标注来源,感谢您的阅读
3)代码来源于项目,敏感部分已去除,如存在错误,或者错别字请留言(手敲),感谢你的阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值