C#实现CAD数据转shape或mdb
本文所指的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 = 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();
}
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();
}
}
{
// 工作空间
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 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();
}
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 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 + @" \\ " + 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();
}
}
{
// 工作空间
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 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 + @" \\ " + 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数据路径,实现批量转数据!
来自:http://www.cnblogs.com/MyLucifer/archive/2010/10/26/1861747.html