彩票走势图

C#实现CAD数据转shape或mdb

转帖|其它|编辑:郝浩|2010-11-01 11:41:12.000|阅读 2134 次

概述:本文所指的CAD数据为不带空间参考和扩展数据的数据。如果CAD带了空间参考或是扩展属性数据的话,就要采用图形和属性分离的方法转CAD数据,即图形转完后需要挂接属性数据库。这里就不详细说明了.

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  本文所指的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数据路径,实现批量转数据!


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP