本文所指的CAD数据为不带空间参考和扩展数据的数据。如果CAD带了空间参考或是扩展属性数据的话,就要采用图形和属性分离的方法转CAD数据,即图形转完后需要挂接属性数据库。这里就不详细说明了.
ArcGIS和CAD对空间数据的归纳有所不同,在AutoCad中,点线面可以在同一个图层中,但是在ArcGIS中,点线面被严格的区分为了point、polyline和polygon三种类型的图层,所以直接用ArcCatalog查看CAD数据时会看到五个图层(点线面、注记和Multipatch)
下面的方法实现了点线面图层转成Shape文件
Code [http://www.xueit.com]
public bool CadDataToShape(string _cadFilePath) { //工作空间 IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeatureLayer pFeatureLayer; IFeatureDataset pFeatureDataset;//图层对应数据集 ESRI.ArcGIS.ConversionTools.FeatureClassToFeatureClass feaTofea = new FeatureClassToFeatureClass(); ESRI.ArcGIS.Geoprocessor.Geoprocessor pGeoPro = new ESRI.ArcGIS.Geoprocessor.Geoprocessor();try
{ string strFullPath = _cadFilePath; int index = strFullPath.LastIndexOf("\\"); string filePath = strFullPath.Substring(0, index); string fileName = strFullPath.Substring(index 1); string ";cadGISInfo = new stMdbInfo();
cadGISInfo.mdbFeaturesName = new List<string>(); cadGISInfo.mdbname = fileName;//打开cad数据集
pWorkspaceFactory = new CadWorkspaceFactoryClass(); pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(filePath, 0); if (Directory.Exists(DataSaveFilePath @"\\" fileName)) { DirectoryInfo dirInfo = new DirectoryInfo(DataSaveFilePath @"\\" fileName); foreach (FileInfo file in dirInfo.GetFiles()) { file.Delete(); } Directory.Delete(DataSaveFilePath @"\\" fileName); }Directory.CreateDirectory(DataSaveFilePath @"\\" fileName);
cadGISInfo.mdbfilepath = DataSaveFilePath @"\\" fileName;
//打开一个要素集
pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(fileName);IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;
//对CAD文件中的要素进行遍历处理 int count = pFeatureClassContainer.ClassCount;for (int j = 0; j < pFeatureClassContainer.ClassCount; j )
{ IFeatureClass pFeatClass = pFeatureClassContainer.get_Class(j); cadGISInfo.mdbFeaturesName.Add(pFeatClass.AliasName ".shp"); if (pFeatClass.FeatureType == esriFeatureType.esriFTCoverageAnnotation || pFeatClass.FeatureType == esriFeatureType.esriFTAnnotation) {}
else { feaTofea.in_features = strFullPath @"\\" pFeatClass.AliasName; feaTofea.out_path = DataSaveFilePath @"\\" fileName;feaTofea.out_feature_class = pFeatClass.AliasName;
feaTofea.out_name = pFeatClass.AliasName; pGeoPro.Execute(feaTofea, null); } } return true; } catch { return false; } finally { pWorkspaceFactory = null; pFeatureDataset = null; pFeatureWorkspace = null; GC.Collect(); }}
下面的方法实现CAD数据转成本地的Personal Geodatbase,同时实现了注记图层的转换public bool CadDataToGeodatabase(string _cadFilePath) { //工作空间 IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeatureLayer pFeatureLayer; IFeatureDataset pFeatureDataset;//图层对应数据集//创建MDB工作空间
IWorkspaceFactory pAccessWorkSpaceFactory;//这个conversionTools不包含注记图层的转换
ESRI.ArcGIS.ConversionTools.FeatureClassToFeatureClass feaTofea = new FeatureClassToFeatureClass(); ESRI.ArcGIS.Geoprocessor.Geoprocessor pGeoPro = new ESRI.ArcGIS.Geoprocessor.Geoprocessor(); //ImportCADAnnotation功能,实现导入注记图层 ESRI.ArcGIS.ConversionTools.ImportCADAnnotation importCADAnno = new ImportCADAnnotation(); try { string strFullPath = _cadFilePath; int index = strFullPath.LastIndexOf("\\"); string filePath = strFullPath.Substring(0, index); string fileName = strFullPath.Substring(index 1); string ";cadGISInfo= new stMdbInfo();
cadGISInfo.mdbFeaturesName = new List<string>(); cadGISInfo.mdbname = fileName; //打开cad数据集 pWorkspaceFactory = new CadWorkspaceFactoryClass(); pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(filePath, 0);//创建mdb(personal geodatabase)
pAccessWorkSpaceFactory = new AccessWorkspaceFactoryClass(); if (File.Exists(DataSaveFilePath @"\\" fileName ".mdb")) { File.Delete(DataSaveFilePath @"\\" fileName ".mdb"); }cadGISInfo.mdbfilepath = DataSaveFilePath @"\\" fileName ".mdb";
//ltMdbFilePath.Add(DataSaveFilePath @"\\" fileName ".mdb");pAccessWorkSpaceFactory.Create(DataSaveFilePath, fileName ".mdb", null, 0);
//打开一个要素集 pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(fileName);IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;
//对CAD文件中的要素进行遍历处理 int count = pFeatureClassContainer.ClassCount;for (int j = 0; j < pFeatureClassContainer.ClassCount; j )
{IFeatureClass pFeatClass = pFeatureClassContainer.get_Class(j);
cadGISInfo.mdbFeaturesName.Add(pFeatClass.AliasName); if (pFeatClass.FeatureType == esriFeatureType.esriFTCoverageAnnotation || pFeatClass.FeatureType == esriFeatureType.esriFTAnnotation) { pFeatureLayer = new CadAnnotationLayerClass();//注记图层 importCADAnno.input_features = strFullPath @"\\" pFeatClass.AliasName; importCADAnno.output_featureclass = DataSaveFilePath @"\\" fileName ".mdb" @"\\" pFeatClass.AliasName; importCADAnno.reference_scale = 1000; pGeoPro.Execute(importCADAnno, null); } else { feaTofea.in_features = strFullPath @"\\" pFeatClass.AliasName; feaTofea.out_path = DataSaveFilePath @"\\" fileName ".mdb";feaTofea.out_feature_class = pFeatClass.AliasName;
feaTofea.out_name = pFeatClass.AliasName; pGeoPro.Execute(feaTofea, null); } } return true; } catch(Exception ex) { return false; } finally { GC.Collect(); } }从上面的代码可以看出,实际C#调用了Geoprocessor 执行了ConversionTools.FeatureClass to FeatureClass工具,这是不是有点像用arctoolbox中的功能!这里就可以扩展用Geoprocessor 实现其他arctoolbox中能够先实现的功能!这里也可以将上面的方法里的参数改为多个cad数据路径,实现批量转数据!