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:
- 刷新进度
System.Windows.Forms.Application.DoEvents();
- 进度条百分比设置:
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)代码来源于项目,敏感部分已去除,如存在错误,或者错别字请留言(手敲),感谢你的阅读