C#实现CAD数据转shape或mdb 您所在的位置:网站首页 cad转省 C#实现CAD数据转shape或mdb

C#实现CAD数据转shape或mdb

2023-07-16 12:31| 来源: 网络整理| 查看: 265

本文所指的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 + @"\\" + 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();                     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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有