ArcGis 打开CAD文件的几种方法

方法一、


  iworkspacefactory pworkspacefactory;


  ifeatureworkspace pfeatureworkspace;


  ifeaturelayer pfeaturelayer;


  ifeaturedataset pfeaturedataset;


  //打开cad数据集


  pworkspacefactory = new cadworkspacefactoryclass();


  pfeatureworkspace = (ifeatureworkspace)pworkspacefactory.openfromfile(directorypath, 0);


  //打开一个要素集


  pfeaturedataset = pfeatureworkspace.openfeaturedataset(filename);


  //ifeaturclasscontainer可以管理ifeaturedataset中的每个要素类 


  ifeatureclasscontainer pfeatureclasscontainer = (ifeatureclasscontainer)pfeaturedataset;


  //对cad文件中的要素进行遍历处理 


  for (int i = 0; i < pfeatureclasscontainer.classcount - 1; i++)


  {


  ifeatureclass pfeatureclass = pfeatureclasscontainer.get_class(i);


  if (pfeatureclass.featuretype == esrifeaturetype.esriftannotation)


  {


  //如果是注记,则添加注记层


  pfeaturelayer = new cadannotationlayerclass();


  }


  else//如果是点、线、面,则添加要素层


  {


  pfeaturelayer = new featurelayerclass();


  pfeaturelayer.name = pfeatureclass.aliasname;


  pfeaturelayer.featureclass = pfeatureclass;


  this.axmc_main.map.addlayer(pfeaturelayer);


  this.axmc_main.activeview.**();


  }


  }


  方法二、


  //--定义工作空间,并用cadworkspacefactoryclass()实例化它 


  iworkspacefactory pworkspacefactory = new cadworkspacefactoryclass();


  //--打开相应的工作空间,并赋值给要素空间,openfromfile() 


  //--中的参数为cad文件夹的路径 


  ifeatureworkspace pfeatureworkspace = pworkspacefactory.openfromfile(directorypath, 0) as ifeatureworkspace;


  /*--打开线要素类,如果要打开点类型的要素,需要把下边的代码该成: 


  *-- ifeatureclass pfeatureclass = pfeatureworkspace.openfeatureclass (filename + ":point"); 


  *-- 由此可见filename为cad图的名字,后边加上要打开的要素类的类型,中间用冒号  


  *-- 隔开,大家可以想想多边形和标注是怎么打开的。 */


  //point polyline


  ifeatureclass pfeatureclass = pfeatureworkspace.openfeatureclass(filename + ":point");


  ifeaturelayer pfeaturelayer = new featurelayerclass();


  pfeaturelayer.featureclass = pfeatureclass;


  this.axmc_main.map.addlayer(pfeaturelayer);


  this.axmc_main.activeview.**();


  方法三、


  /*--下边的两行代码是定义一个cad工作空间,然后打开它,但这次不是赋值给 


  --ifeatureworkspace对象,而是赋值给iworkspace定义的对象*/


  iworkspacefactory pworkspacefactory = new cadworkspacefactoryclass();


  iworkspace pworkspace = pworkspacefactory.openfromfile(directorypath, 0);


  //--定义一个cad画图空间,并把上边打开的工作空间赋给它 


  icaddrawingworkspace pcaddrawingworkspace = pworkspace as icaddrawingworkspace;


  //--定义一个cad的画图数据集,并且打开上边指定的工作空间中一幅cad图 


  //--然后赋值给cad数据集 


  icaddrawingdataset pcaddrawingdataset = pcaddrawingworkspace.opencaddrawingdataset(filename);


  //--通过icadlayer类,把上边得到的cad数据局赋值给icadlayer类对象的 


  //--caddrawingdataset属性 


  icadlayer pcadlayer = new cadlayerclass();


  pcadlayer.caddrawingdataset = pcaddrawingdataset;


  //--利用mapcontrol加载cad层 


  this.axmc_main.map.addlayer(pcadlayer);


  this.axmc_main.activeview.**(); 


  方法四、


  iworkspacefactory pworkspacefactory = new cadworkspacefactoryclass();


  ifeatureworkspace pfeatureworkspace = pworkspacefactory.openfromfile(directorypath, 0) as ifeatureworkspace;


  ifeaturedataset pfeaturedataset = pfeatureworkspace.openfeaturedataset(filename);


  ifeatureclasscontainer pfeatureclasscontainer = (ifeatureclasscontainer)pfeaturedataset;


  for (int i = 0; i < pfeatureclasscontainer.classcount - 1; i++)


  {


  ifeatureclass pfeatureclass = pfeatureclasscontainer.get_class(i);


  ifeaturelayer pfeaturelayer = new featurelayerclass();


  pfeaturelayer.featureclass = pfeatureclass;


  //icadlayer pcadlayer = new cadlayerclass();


  //pcadlayer = pfeaturelayer as icadlayer;


  this.axmc_main.map.addlayer(pfeaturelayer);


  this.axmc_main.activeview.**();


  }


  方法五、


  //add passed file to mapcontrol


  icaddrawingdataset pcaddrawingdataset = getcaddrawingdataset(directorypath, filename);


  if (pcaddrawingdataset == null) return;


  icadlayer pcadlayer = new cadlayerclass();


  pcadlayer.caddrawingdataset = pcaddrawingdataset;


  pcadlayer.name = filename;


  this.axmc_main.addlayer(pcadlayer, 0);


  /// <summary>


  /// 获取记录集


  /// </summary>


  /// <param name="directorypath"></param>


  /// <param name="filename"></param>


  /// <returns></returns>


  private icaddrawingdataset getcaddrawingdataset(string directorypath, string filename)


  {


  //create a workspacename object


  iworkspacename pworkspacename = new workspacenameclass();


  pworkspacename.workspacefactoryprogid = "esridatasourcesfile.cadworkspacefactory";


  pworkspacename.pathname = directorypath;


  //create a caddrawingname object


  idatasetname pdatasetname = new caddrawingnameclass();


  pdatasetname.name = filename;


  pdatasetname.workspacename = pworkspacename;


  //open the cad drawing


  iname pname = (iname)pdatasetname;


  return (icaddrawingdataset)pname.open();


  }


  需要注意


  如果你的arcgis地理信息系统 版本是v9.2的话,可能是因为你的文件名中含有中文字符的原因.据我所知,在arcgis地理信息系统 9.2中无法显示文件名含有中文字符的cad文件.你可以在arcmap中直接打开试试,如果也无法显
此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com
示的话,可能是文件名的问题(注:路径中也不能含有中文字符).


  gis地理信息系统 for web应用开发之道


  插件式gis地理信息系统 应用框架的设计与实现


  public void esridatasourcesfile_icaddrawingdataset_example(string nameoffile, string nameofcaddrawing) 


  { 


  //set the workspace factory 


  iworkspacefactory workspacefactory = new esri.arcgis地理信息系统 .datasourcesfile.cadworkspacefactoryclass(); 


  //open the workspace 


  iworkspace workspace = workspacefactory.openfromfile(nameoffile, 0); 


  //set the caddrawingworkspace 


  esri.arcgis地理信息系统 .datasourcesfile.icaddrawingworkspace caddrawingworkspace = (esri.arcgis地理信息系统 .datasourcesfile.icaddrawingworkspace)workspace; 


  //open the caddrawingdataset 


  esri.arcgis地理信息系统 .datasourcesfile.icaddrawingdataset caddrawingdataset = caddrawingworkspace.opencaddrawngdataset(nameofcaddrawing); 


  //create the cadlayer 


  esri.arcgis地理信息系统 .carto.icadlayer cadlayer = new esri.arcgis地理信息系统 .carto.cadlayerclass(); 


  //set the cadlayer to the caddrawingdataset 


  cadlayer.caddrawingdataset = caddrawingdataset; 


  //list if the caddrawingdataset exists 


  console.writeline("does drawing exist: {0}" , cadlayer.caddrawingdataset.exists ); 


  //list the caddrawingdataset filepath 


  console.writeline("cad drawing path: {0}" , cadlayer.caddrawingdataset.filepath ); 


  //list if the caddrawingdataset is 2d 


  console.writeline("is drawing 2d?: {0}" , cadlayer.caddrawingdataset.is2d); 


  //list if the caddrawingdataset is 3d 


  console.writeline("is drawing 3d?: {0}" , cadlayer.caddrawingdataset.is3d ); 


  //list if the caddrawingdataset is an autocad drawing file 


  console.writeline("is drawing from autocad?: {0}" , cadlayer.caddrawingdataset.isautocad ); 


  //list if the caddrawingdataset is an microsation drawing file 


  console.writeline("is drawing from microstation?: {0}" , cadlayer.caddrawingdataset.isdgn); }


  中间过程实验代码:


  实验1


  public static string addcadlayer(map map1, toc toc)


  {


  // 得到服务器上下文对象


  mapfunctionality agsmapfunctionlity = map1.getfunctionality(1) as mapfunctionality;


  mapresourcelocal localmapresource = (mapresourcelocal)agsmapfunctionlity.resource;


  esri.arcgis地理信息系统 .server.iservercontext mapcontext = localmapresource.servercontextinfo.servercontext;


   增加图层


  //esri.arcgis地理信息系统 .carto.featurelayer pfeaturelayer = null;


  //ifeaturelayer pfeaturelayer;


  //打开cad数据集


  iworkspacefactory factory = (iworkspacefactory)mapcontext.createobject("esridatasourcesfile.cadworkspacefactory");


  //pworkspacefactory = new cadworkspacefactoryclass();


  //pworkspacefactory = new pworkspacefactory();


  esri.arcgis地理信息系统 .datasourcesfile.icaddrawingworkspace pfeatureworkspace = (esri.arcgis地理信息系统 .datasourcesfile.icaddrawingworkspace)factory.openfromfile(@"c:\inetpub\wwwroot\northamerica", 0);


  //ifeatureworkspace pfeatureworkspace = (ifeatureworkspace)factory.openfromfile(@"c:\inetpub\wwwroot\northamerica", 0);


  //打开一个要素集


  esri.arcgis地理信息系统 .datasourcesfile.icaddrawingdataset pfeaturedataset = (esri.arcgis地理信息系统 .datasourcesfile.icaddrawingdataset)pfeatureworkspace.opencaddrawingdataset("new_shapefile_exportcad.dwg");


  //ifeaturclasscontainer可以管理ifeaturedataset中的每个要素类


  esri.arcgis地理信息系统 .carto.icadlayer pfeatureclasscontainer = new esri.arcgis地理信息系统 .carto.cadlayerclass();


  pfeatureclasscontainer.caddrawingdataset = pfeaturedataset;


  //ifeatureclasscontainer pfeatureclasscontainer = (ifeatureclasscontainer)pfeaturedataset;


  //对cad文件中的要素进行遍历处理


  //for (int i = 0; i < pfeatureclasscontainer.classcount - 1; i++)


  //{


  // ifeatureclass pfeatureclass = pfeatureclasscontainer.get_class(i);


  // if (pfeatureclass.featuretype == esrifeaturetype.esriftannotation)


  // {


  // //如果是注记,则添加注记层


  // pfeaturelayer = (esri.arcgis地理信息系统 .carto.featurelayer)mapcontext.createobject("esricarto.cadannotationlayerclass");


  // }


  // else//如果是点、线、面,则添加要素层


  // {


  // pfeaturelayer = (esri.arcgis地理信息系统 .carto.featurelayer)mapcontext.createobject("esricarto.cadfeaturelayer");


  // pfeaturelayer.name = pfeatureclass.aliasname;


  // }


  //}


  esri.arcgis地理信息系统 .carto.imapserverobjects mapserverobjects = localmapresource.mapserver as esri.arcgis地理信息系统 .carto.imapserverobjects;


  esri.arcgis地理信息系统 .carto.imap map = mapserverobjects.get_map(localmapresource.dataframe) as esri.arcgis地理信息系统 .carto.imap;


  //if (pfeaturelayer != null)


  //{


  map.addlayer(pfeatureclasscontainer);


  // //map.movelayer(pfeaturelayer, map.layercount - 1);


  //}


  //刷新服务器对象,响应添加图层


  localmapresource.refreshserverobjects();


  //toc控件刷新


  toc.refresh();


  map1.callbackresults.copyfrom(toc.callbackresults);


  map1.refresh();


  return map1.callbackresults.tostring();


  }


  实验2


  public static string addcadlayer2(map map1, toc toc)


  {


  // 得到服务器上下文对象


  mapfunctionality agsmapfunctionlity = map1.getfunctionality(1) as mapfunctionality;


  mapresourcelocal localmapresource = (mapresourcelocal)agsmapfunctionlity.resource;


  esri.arcgis地理信息系统 .server.iservercontext mapcontext = localmapresource.servercontextinfo.servercontext;


  // 增加图层


  esri.arcgis地理信息系统 .carto.ifeaturelayer pfeaturelayer = null;


  //ifeaturelayer pfeaturelayer;


  //打开cad数据集


  iworkspacefactory factory = (iworkspacefactory)mapcontext.createobject("esridatasourcesfile.cadworkspacefactory");


  //pworkspacefactory = new cadworkspacefactoryclass();


  //pworkspacefactory = new pworkspacefactory();


  ifeatureworkspace pfeatureworkspace = (ifeatureworkspace)factory.openfromfile(@"c:\inetpub\wwwroot\northamerica", 0);


  //打开一个要素集


  ifeaturedataset pfeaturedataset = (ifeaturedataset)pfeatureworkspace.openfeaturedataset("new_shapefile_exportcad.dwg");


  //ifeaturclasscontainer可以管理ifeaturedataset中的每个要素类


  ifeatureclasscontainer pfeatureclasscontainer = (ifeatureclasscontainer)pfeaturedataset;


  //对cad文件中的要素进行遍历处理


  for (int i = 0; i < pfeatureclasscontainer.classcount - 3; i++)


  {


  ifeatureclass pfeatureclass = pfeatureclasscontainer.get_class(i);


  if (pfeatureclass.featuretype == esrifeaturetype.esriftannotation)


  {


  //如果是注记,则添加注记层


  pfeaturelayer = (esri.arcgis地理信息系统 .carto.ifeaturelayer)mapcontext.createobject("esricarto.cadannotationlayerclass");


  //pfeaturelayer = new cadannotationlayerclass();


  }


  else//如果是点、线、面,则添加要素层


  {


  pfeaturelayer = (esri.arcgis地理信息系统 .carto.ifeaturelayer)mapcontext.createobject("esricarto.cadfeaturelayer");


  pfeaturelayer.name = pfeatureclass.aliasname;


  pfeaturelayer.featureclass = pfeatureclass;


  esri.arcgis地理信息系统 .carto.igeofeaturelayer iglayer = (esri.arcgis地理信息系统 .carto.igeofeaturelayer)pfeaturelayer;


  esri.arcgis地理信息系统 .carto.isimplerenderer isr = (esri.arcgis地理信息系统 .carto.isimplerenderer)mapcontext.createobject("esricarto.simplerenderer");


  esri.arcgis地理信息系统 .display.irgbcolor irgbc = (esri.arcgis地理信息系统 .display.irgbcolor)mapcontext.createobject("esridisplay.rgbcolor");


  irgbc.red = 255;


  irgbc.green = 0;


  irgbc.blue = 0;


  esri.arcgis地理信息系统 .geometry.esrigeometrytype featype = pfeaturelayer.featureclass.shapetype;


  if (featype == esri.arcgis地理信息系统 .geometry.esrigeometrytype.esrigeometrypoint)


  {


  esri.arcgis地理信息系统 .display.isimplemarkersymbol ifs = (esri.arcgis地理信息系统 .display.isimplemarkersymbol)mapcontext.createobject("esridisplay.simplemarkersymbol");


  ifs.color = (esri.arcgis地理信息系统 .display.icolor)irgbc;


  isr.symbol = (esri.arcgis地理信息系统 .display.isymbol)ifs;


  }


  else if (featype == esri.arcgis地理信息系统 .geometry.esrigeometrytype.esrigeometrypolyline)


  {


  esri.arcgis地理信息系统 .display.isimplelinesymbol ifs = (esri.arcgis地理信息系统 .display.isimplelinesymbol)mapcontext.createobject("esridisplay.simplelinesymbol");


  ifs.color = (esri.arcgis地理信息系统 .display.icolor)irgbc;


  isr.symbol = (esri.arcgis地理信息系统 .display.isymbol)ifs;


  }


  else if (featype == esri.arcgis地理信息系统 .geometry.esrigeometrytype.esrigeometrypolygon)


  {


  esri.arcgis地理信息系统 .display.isimplefillsymbol ifs = (esri.arcgis地理信息系统 .display.isimplefillsymbol)mapcontext.createobject("esridisplay.simplefillsymbol");


  ifs.color = (esri.arcgis地理信息系统 .display.icolor)irgbc;


  isr.symbol = (esri.arcgis地理信息系统 .display.isymbol)ifs;


  }


  else


  {


  esri.arcgis地理信息系统 .display.isimplelinesymbol ifs = (esri.arcgis地理信息系统 .display.isimplelinesymbol)mapcontext.createobject("esridisplay.simplelinesymbol");


  ifs.color = (esri.arcgis地理信息系统 .display.icolor)irgbc;


  isr.symbol = (esri.arcgis地理信息系统 .display.isymbol)ifs;


  //throw new exception("图层类型不确定!");


  }


  iglayer.renderer = (esri.arcgis地理信息系统 .carto.ifeaturerenderer)isr;


  //imapserver ms = (imapserver)in_mapcontext.serverobject;


  //imapserverobjects2 mso = (imapserverobjects2)ms;


  //string mapname = ms.defaultmapname;


  //imap map = mso.get_map(mapname);


  //map.addlayer(pfeaturelayer);


  //mso.refreshserverobjects();


  }


  }


   从上下文对象中得到服务器对象


  //imapserver ms = (imapserver)mapcontext.serverobject;


  //imapserverinfo mapinfo = ms.getserverinfo(ms.defaultmapname);


  //imapdescription newmapdesc = mapinfo.defaultmapdescription;


   释放服务器上下文对象


  //mapcontext.releasecontext();


  esri.arcgis地理信息系统 .carto.imapserverobjects mapserverobjects = localmapresource.mapserver as esri.arcgis地理信息系统 .carto.imapserverobjects;


  esri.arcgis地理信息系统 .carto.imap map = mapserverobjects.get_map(localmapresource.dataframe) as esri.arcgis地理信息系统 .carto.imap;


  if (pfeaturelayer != null)


  {


  map.addlayer(pfeaturelayer);


  //移动层到底层


  //map.movelayer(pfeaturelayer, map.layercount - 1);


  }


  //刷新服务器对象,响应添加图层


  localmapresource.refreshserverobjects();


  //toc控件刷新


  toc.refresh();


  map1.callbackresults.copyfrom(toc.callbackresults);


  map1.refresh();


  return map1.callbackresults.tostring();


  }


  最终调试正确代码:


  public static string addcadlayer(map map1, toc toc)


  {


  // 得到服务器上下文对象


  mapfunctionality agsmapfunctionlity = map1.getfunctionality(1) as mapfunctionality;


  mapresourcelocal localmapresource = (mapresourcelocal)agsmapfunctionlity.resource;


  esri.arcgis地理信息系统 .server.iservercontext mapcontext = localmapresource.servercontextinfo.servercontext;


  // 增加图层


  esri.arcgis地理信息系统 .carto.ifeaturelayer pfeaturelayer = null;


  //打开cad数据集


  iworkspacefactory factory = (iworkspacefactory)mapcontext.createobject("esridatasourcesfile.cadworkspacefactory");


  ifeatureworkspace pfeatureworkspace = (ifeatureworkspace)factory.openfromfile(@"c:\inetpub\wwwroot\northamerica", 0);


  //打开一个要素集


  ifeaturedataset pfeaturedataset = (ifeaturedataset)pfeatureworkspace.openfeaturedataset("new_shapefile_exportcad.dwg");


  //ifeaturclasscontainer可以管理ifeaturedataset中的每个要素类


  ifeatureclasscontainer pfeatureclasscontainer = (ifeatureclasscontainer)pfeaturedataset;


  //对cad文件中的要素进行遍历处理


  for (int i = 0; i < pfeatureclasscontainer.classcount - 1; i++)


  {


  ifeatureclass pfeatureclass = pfeatureclasscontainer.get_class(i);


  if (pfeatureclass.featuretype == esrifeaturetype.esriftannotation)


  {


  //如果是注记,则添加注记层


  pfeaturelayer = (esri.arcgis地理信息系统 .carto.ifeaturelayer)mapcontext.createobject("esricarto.cadannotationlayerclass");


  }


  else//如果是点、线、面,则添加要素层


  {


  pfeaturelayer = (esri.arcgis地理信息系统 .carto.ifeaturelayer)mapcontext.createobject("esricarto.cadfeaturelayer");


  pfeaturelayer.name = pfeatureclass.aliasname;


  pfeaturelayer.featureclass = pfeatureclass;


  esri.arcgis地理信息系统 .carto.imapserverobjects mapserverobjects = localmapresource.mapserver as esri.arcgis地理信息系统 .carto.imapserverobjects;


  esri.arcgis地理信息系统 .carto.imap map = mapserverobjects.get_map(localmapresource.dataframe) as esri.arcgis地理信息系统 .carto.imap;


  map.addlayer(pfeaturelayer);


  //刷新服务器对象,响应添加图层


  localmapresource.refreshserverobjects();


  }


  }


  //toc控件刷新


  toc.refresh();


  map1.callbackresults.copyfrom(toc.callbackresults);


  map1.refresh();


  return map1.callbackresults.tostring();


  }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C# ArcObjects实现从一个GDB数据库中复制一个图层,然后粘贴到另一个GDB数据库的示例代码: ```csharp // 打开源GDB数据库 IWorkspaceFactory sourceWorkspaceFactory = new FileGDBWorkspaceFactory(); IWorkspace sourceWorkspace = sourceWorkspaceFactory.OpenFromFile("C:\path\to\source.gdb", 0); // 打开目标GDB数据库 IWorkspaceFactory targetWorkspaceFactory = new FileGDBWorkspaceFactory(); IWorkspace targetWorkspace = targetWorkspaceFactory.OpenFromFile("C:\path\to\target.gdb", 0); // 打开源图层 IFeatureWorkspace sourceFeatureWorkspace = (IFeatureWorkspace)sourceWorkspace; IFeatureClass sourceFeatureClass = sourceFeatureWorkspace.OpenFeatureClass("source_layer"); // 创建目标图层 IFeatureWorkspace targetFeatureWorkspace = (IFeatureWorkspace)targetWorkspace; IObjectCopy objectCopy = new ObjectCopyClass(); IFeatureClass targetFeatureClass = objectCopy.Copy(sourceFeatureClass, targetFeatureWorkspace); // 保存目标图层 IDataset targetDataset = (IDataset)targetFeatureClass; targetDataset.Workspace.ExecuteSQL("CREATE INDEX idx_" + targetFeatureClass.AliasName + "_Shape ON " + targetFeatureClass.AliasName + " USING GEOMETRY (Shape)"); targetDataset.Workspace.ExecuteSQL("ANALYZE " + targetFeatureClass.AliasName + " COMPUTE STATISTICS"); ``` 这段代码首先打开源GDB数据库和目标GDB数据库。然后,它打开源图层并将其复制到目标GDB数据库中。最后,它创建索引并统计目标图层以优化性能。注意,此代码假定源图层和目标图层都具有相同的结构和字段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值