zoukankan      html  css  js  c++  java
  • 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();
                }

            }

    下面的方法实现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"null0);
                        
    //打开一个要素集
                        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数据路径,实现批量转数据!

     

  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/MyLucifer/p/1861747.html
Copyright © 2011-2022 走看看