C#实现 CAD 数据转 shape 或 mdb
作者:不详 出处:网络转载 2010-11-1 11:41:12 阅读 705 次
本文所指的 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();
cadGISInfo.mdbname = fileName;
//打开 cad 数据集
pWorkspaceFactory = new CadWorkspaceFactoryClass();
pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile
(filePath, 0);
if (Directory.Exists(DataSaveFilePath + @"\\" + fileName))
{
DirectoryInfo dirInfo = new DirectoryInfo(DataSaveFilePath + @"\\" + fileNa
me);
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)pF
eatureDataset;
//对 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();
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.AliasNa
me;
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 数据路径,实现批量转数据!