2023年11月23日发(作者:)

C#实现CAD数据转shapemdb(转)

本⽂所指的CAD数据为不带空间参考和扩展数据的数据。如果CAD带了空间参考或是扩展属性数据的话,就要采⽤图形和属性分离的⽅法转CAD数据,即图

形转完后需要挂接属性数据库。这⾥就不详细说明了.

ArcGISCAD对空间数据的归纳有所不同,在AutoCad中,点线⾯可以在同⼀个图层中,但是在ArcGIS中,点线⾯被严格的区分为了pointpolyline

polygon三种类型的图层,所以直接⽤ArcCatalog查看CAD数据时会看到五个图层(点线⾯、注记和Multipatch

话不多说了,进⼊主题吧

下⾯的⽅法实现了点线⾯图层转成Shape⽂件

代码

public bool CadDataToShape(string _cadFilePath)

{

//⼯作空间

IWorkspaceFactory pWorkspaceFactory;

IFeatureWorkspace pFeatureWorkspace;

IFeatureLayer pFeatureLayer;

IFeatureDataset pFeatureDataset;//图层对应数据集

eClassToFeatureClass feaTofea = new FeatureClassToFeatureClass();

cessor pGeoPro = new cessor();

try

{

string strFullPath = _cadFilePath;

int index = dexOf("");

string filePath = ing(0, index);

string fileName = ing(index + 1);

string DataSaveFilePath=@"D:CADToShape";

cadGISInfo = new stMdbInfo();

turesName = new List<string>();

e = fileName;

//打开cad数据集

pWorkspaceFactory = new CadWorkspaceFactoryClass();

pFeatureWorkspace = (IFeatureWorkspace)omFile(filePath, 0);

if ((DataSaveFilePath + @"" + fileName))

{

DirectoryInfo dirInfo = new DirectoryInfo(DataSaveFilePath + @"" + fileName);

foreach (FileInfo file in es())

{

();

}

(DataSaveFilePath + @"" + fileName);

}

Directory(DataSaveFilePath + @"" + fileName);

epath = DataSaveFilePath + @"" + fileName;

//打开⼀个要素集

pFeatureDataset = atureDataset(fileName);

IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;

//CAD⽂件中的要素进⾏遍历处理

int count = ount;

for (int j = 0; j < ount; j++)

{

IFeatureClass pFeatClass = _Class(j);

(ame+".shp");

if (eType == CoverageAnnotation || eType == Annotation)

{

}

else

{

_features = strFullPath + @"" + ame;

_path = DataSaveFilePath + @"" + fileName;

_feature_class = ame;

_name = ame;

e(feaTofea, null);

}

}

return true;

}

catch

{

return false;

}

finally

{

pWorkspaceFactory = null;

pFeatureDataset = null;

pFeatureWorkspace = null;

t();

}

}

下⾯的⽅法实现CAD数据转成本地的Personal Geodatbase,同时实现了注记图层的转换

代码

public bool CadDataToGeodatabase(string _cadFilePath)

{

//⼯作空间

IWorkspaceFactory pWorkspaceFactory;

IFeatureWorkspace pFeatureWorkspace;

IFeatureLayer pFeatureLayer;

IFeatureDataset pFeatureDataset;//图层对应数据集

//创建MDB⼯作空间

IWorkspaceFactory pAccessWorkSpaceFactory;

//这个conversionTools不包含注记图层的转换

eClassToFeatureClass feaTofea = new FeatureClassToFeatureClass();

cessor pGeoPro = new cessor();

//ImportCADAnnotation功能,实现导⼊注记图层

CADAnnotation importCADAnno = new ImportCADAnnotation();

try

{

string strFullPath = _cadFilePath;

int index = dexOf("");

string filePath = ing(0, index);

string fileName = ing(index + 1);

string DataSaveFilePath=@"D:CADToMDB";

cadGISInfo= new stMdbInfo();

turesName = new List<string>();

e = fileName;

//打开cad数据集

pWorkspaceFactory = new CadWorkspaceFactoryClass();

pFeatureWorkspace = (IFeatureWorkspace)omFile(filePath, 0);

//创建mdb(personal geodatabase)

pAccessWorkSpaceFactory = new AccessWorkspaceFactoryClass();

if ((DataSaveFilePath + @"" + fileName + ".mdb"))

{

(DataSaveFilePath + @"" + fileName + ".mdb");

}

epath = DataSaveFilePath + @"" + fileName + ".mdb";

//(DataSaveFilePath + @"" + fileName + ".mdb");

(DataSaveFilePath, fileName + ".mdb", null, 0);

//打开⼀个要素集

pFeatureDataset = atureDataset(fileName);

IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;

//CAD⽂件中的要素进⾏遍历处理

int count = ount;

for (int j = 0; j < ount; j++)

{

IFeatureClass pFeatClass = _Class(j);

(ame);

if (eType == CoverageAnnotation || eType == Annotation)

{

pFeatureLayer = new CadAnnotationLayerClass();//注记图层

_features = strFullPath + @"" + ame;

_featureclass = DataSaveFilePath + @"" + fileName + ".mdb" + @"" + ame;

nce_scale = 1000;

e(importCADAnno, null);

}

else

{

_features = strFullPath + @"" + ame;

_path = DataSaveFilePath + @"" + fileName + ".mdb";

_feature_class = ame;

_name = ame;

e(feaTofea, null);

}

}

return true;

}

catch(Exception ex)

{

return false;

}

finally

{

t();

}

}

从上⾯的代码可以看出,实际C#调⽤了Geoprocessor 执⾏了eClass to FeatureClass⼯具,这是不是有点像⽤arctoolbox中的功能!这⾥就可以

扩展⽤Geoprocessor 实现其他arctoolbox中能够先实现的功能!

这⾥也可以将上⾯的⽅法⾥的参数改为多个cad数据路径,实现批量转数据!