logo资料库

C#实现CAD数据转shape或mdb.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
C#实现CAD数据转shape或mdb
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 数据路径,实现批量转数据!
分享到:
收藏