本文所指的CAD數據為不帶空間參考和擴展數據的數據。如果CAD帶了空間參考或是擴展屬性數據的話,就要采用圖形和屬性分離的方法轉CAD數據,即圖形轉完后需要掛接屬性數據庫。這里就不詳細說明了.
ArcGIS和CAD對空間數據的歸納有所不同,在AutoCad中,點線面可以在同一個圖層中,但是在ArcGIS中,點線面被嚴格的區分為了point、polyline和polygon三種類型的圖層,所以直接用ArcCatalog查看CAD數據時會看到五個圖層(點線面、注記和Multipatch)
話不多說了,進入主題吧
下面的方法實現了點線面圖層轉成Shape文件

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 #p#分頁標題#e#= strFullPath.Substring(index + 1);
string DataSaveFilePath=@"D:CADToShape";
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();
}
#p#分頁標題#e#
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)
{#p#分頁標題#e#
}
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();#p#分頁標題#e#
}
}
{
//工作空間
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 #p#分頁標題#e#= strFullPath.Substring(index + 1);
string DataSaveFilePath=@"D:CADToShape";
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();
}
#p#分頁標題#e#
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)
{#p#分頁標題#e#
}
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();#p#分頁標題#e#
}
}
下面的方法實現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
{ #p#分頁標題#e#
string strFullPath = _cadFilePath;
int index = strFullPath.LastIndexOf("\");
string filePath = strFullPath.Substring(0, index);
string fileName = strFullPath.Substring(index + 1);
string DataSaveFilePath=@"D:CADToMDB";
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 +#p#分頁標題#e# @"\" + 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 (#p#分頁標題#e#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);
}
#p#分頁標題#e#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();
}
}
{
//工作空間
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
{ #p#分頁標題#e#
string strFullPath = _cadFilePath;
int index = strFullPath.LastIndexOf("\");
string filePath = strFullPath.Substring(0, index);
string fileName = strFullPath.Substring(index + 1);
string DataSaveFilePath=@"D:CADToMDB";
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 +#p#分頁標題#e# @"\" + 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 (#p#分頁標題#e#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);
}
#p#分頁標題#e#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中能夠先實現的功能!#p#分頁標題#e#
這里也可以將上面的方法里的參數改為多個cad數據路徑,實現批量轉數據!