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 " 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

 

你可能感兴趣的:(shape)