zoukankan      html  css  js  c++  java
  • C#实现CAD数据转shape或mdb (转)

    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数据路径,实现批量转数据!

    来自:http://www.cnblogs.com/MyLucifer/archive/2010/10/26/1861747.html

     

  • 相关阅读:
    Vitamio中文API文档(3)—— MediaController
    [活动]hhhchina.net很暴力,还有更好的投票方式吗?
    [anytao.activity]也来拉票,不只为评选
    [活动]Scott,来了
    写在2007,行胜于言
    《你必须知道的.NET》,评价和推荐
    [你必须知道的.NET]第十七回:貌合神离:覆写和重载
    [你必须知道的.NET]第十八回:对象创建始末(上)
    当选2008 Microsoft MVP,从好的开始继续
    [你必须知道的.NET]第十九回:对象创建始末(下)
  • 原文地址:https://www.cnblogs.com/gisoracle/p/1890115.html
Copyright © 2011-2022 走看看