轉(zhuǎn)帖|其它|編輯:郝浩|2010-11-01 11:41:12.000|閱讀 2134 次
概述:本文所指的CAD數(shù)據(jù)為不帶空間參考和擴(kuò)展數(shù)據(jù)的數(shù)據(jù)。如果CAD帶了空間參考或是擴(kuò)展屬性數(shù)據(jù)的話(huà),就要采用圖形和屬性分離的方法轉(zhuǎn)CAD數(shù)據(jù),即圖形轉(zhuǎn)完后需要掛接屬性數(shù)據(jù)庫(kù)。這里就不詳細(xì)說(shuō)明了.
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
本文所指的CAD數(shù)據(jù)為不帶空間參考和擴(kuò)展數(shù)據(jù)的數(shù)據(jù)。如果CAD帶了空間參考或是擴(kuò)展屬性數(shù)據(jù)的話(huà),就要采用圖形和屬性分離的方法轉(zhuǎn)CAD數(shù)據(jù),即圖形轉(zhuǎn)完后需要掛接屬性數(shù)據(jù)庫(kù)。這里就不詳細(xì)說(shuō)明了.
ArcGIS和CAD對(duì)空間數(shù)據(jù)的歸納有所不同,在AutoCad中,點(diǎn)線(xiàn)面可以在同一個(gè)圖層中,但是在ArcGIS中,點(diǎn)線(xiàn)面被嚴(yán)格的區(qū)分為了point、polyline和polygon三種類(lèi)型的圖層,所以直接用ArcCatalog查看CAD數(shù)據(jù)時(shí)會(huì)看到五個(gè)圖層(點(diǎn)線(xiàn)面、注記和Multipatch)
下面的方法實(shí)現(xiàn)了點(diǎn)線(xiàn)面圖層轉(zhuǎn)成Shape文件
public bool CadDataToShape(string _cadFilePath)
{
//工作空間
IWorkspaceFactory pWorkspaceFactory;
IFeatureWorkspace pFeatureWorkspace;
IFeatureLayer pFeatureLayer;
IFeatureDataset pFeatureDataset;//圖層對(duì)應(yīng)數(shù)據(jù)集
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;
//打開(kāi)cad數(shù)據(jù)集
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;
//打開(kāi)一個(gè)要素集
pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(fileName);
IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;
//對(duì)CAD文件中的要素進(jìn)行遍歷處理
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();
}
}
下面的方法實(shí)現(xiàn)CAD數(shù)據(jù)轉(zhuǎn)成本地的Personal Geodatbase,同時(shí)實(shí)現(xiàn)了注記圖層的轉(zhuǎn)換
public bool CadDataToGeodatabase(string _cadFilePath)
{
//工作空間
IWorkspaceFactory pWorkspaceFactory;
IFeatureWorkspace pFeatureWorkspace;
IFeatureLayer pFeatureLayer;
IFeatureDataset pFeatureDataset;//圖層對(duì)應(yīng)數(shù)據(jù)集
//創(chuàng)建MDB工作空間
IWorkspaceFactory pAccessWorkSpaceFactory;
//這個(gè)conversionTools不包含注記圖層的轉(zhuǎn)換
ESRI.ArcGIS.ConversionTools.FeatureClassToFeatureClass feaTofea =
new FeatureClassToFeatureClass();
ESRI.ArcGIS.Geoprocessor.Geoprocessor pGeoPro =
new ESRI.ArcGIS.Geoprocessor.Geoprocessor();
//ImportCADAnnotation功能,實(shí)現(xiàn)導(dǎo)入注記圖層
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;
//打開(kāi)cad數(shù)據(jù)集
pWorkspaceFactory = new CadWorkspaceFactoryClass();
pFeatureWorkspace =
(IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(filePath, 0);
//創(chuàng)建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);
//打開(kāi)一個(gè)要素集
pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(fileName);
IFeatureClassContainer pFeatureClassContainer =
(IFeatureClassContainer)pFeatureDataset;
//對(duì)CAD文件中的要素進(jìn)行遍歷處理
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();
}
}
從上面的代碼可以看出,實(shí)際C#調(diào)用了Geoprocessor 執(zhí)行了ConversionTools.FeatureClass to FeatureClass工具,這是不是有點(diǎn)像用arctoolbox中的功能!這里就可以擴(kuò)展用Geoprocessor 實(shí)現(xiàn)其他arctoolbox中能夠先實(shí)現(xiàn)的功能!
這里也可以將上面的方法里的參數(shù)改為多個(gè)cad數(shù)據(jù)路徑,實(shí)現(xiàn)批量轉(zhuǎn)數(shù)據(jù)!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載