使用ArcEngine实现ArcMap的Set datasource 功能,修复mxd中的图层位置

Posted 杨千羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ArcEngine实现ArcMap的Set datasource 功能,修复mxd中的图层位置相关的知识,希望对你有一定的参考价值。

在ArcMap中打开一个mxd文件时,有可能其关联的shp文件路径被改动了,导致找不到该图层,这时,就可以右键选择Properties,在弹出对话框中选择source选项卡,
点set data source按钮,如下图

然后选择该图层的位置,即可。

图层的配置息都是存放在mxd中的,若是将图层数据导入到sde中保存的话,再进行加载的时候,这些配置信息都是找不到的,要想按照mxd的样式从数据库加载图层,
就得把每个图层的配置信息提取出来,放到数据库中,这样就要考虑标注、图层渲染、图层顺序、图层组、图层的可视范围、图层是否可选、图层是否可见、
地图的投影系等等。这就引入了更多的复杂性,
其实可以这样,把mxd也单独的保存一份,在每次连接到数据库时,先将此mxd文件中的各个图层的指向到sde中的对应图层,然后再打开此mxd,即可省去很多麻烦。

讲讲实现思路:
首先遍历mxd的各个图层,使用IMapDocument接口打开mxd文件,使用IMap接口的get_Layers方法,按各类图层的UID来搜索,一般分为三类,矢量图层(IGeoFeatureLayer),
注记图层(IFDOGraphicsLayer),遥感影像图层(IRasterLayer),前两类都可转换成IFeatureLayer接口类型,然后可将其FeatureClass指向SDE中对应的FeatureClass,
使用IFeatureWorkspace的OpenFeatureClass方法,
获取FeatureClass后,将此对象赋给IFeatureLayer即可,

[c-sharp]  view plain copy
  1. pFeatureLayer.FeatureClass = pNewFC;  

影像图层可使用IRasterWorkspaceEx的OpenRasterDataset方法获取其对应的Dataset,然后使用IRasterLayer的CreateFromDataset方法。

[c-sharp]  view plain copy
  1. pRasterlyr.CreateFromDataset(pRasterDataset);  

在使用OpenFeatureClass或OpenRasterDataset时,使用的参数中的图层名称,都是在导入SDE时的名称,也就是图层的真实文件名,而在mxd中,一般图层的名称与其真实的
shp或影像文件名称不相同(注记图层一般放在mdb或gdb中,其在mxd中显示时的名称与其本身一样,直接使用lyr.name即可),使用ILayer的name属性,只能获取此图层在mxd中的别名,获取文件名称,需要将图层先转换成IDataLayer,将此对象的DatasourceName属性
转换成IDatasetName类型,然后获取IDatasetName的Name属性,此即为图层的真实文件名称,示例代码如下:

 

[c-sharp]  view plain copy
  1. IDataLayer2 pFd = pFeatureLayer as IDataLayer2;  
  2.                     if (pFd != null)  
  3.                       
  4.                         if (pFd.DataSourceName is IDatasetName)  
  5.                           
  6.                             //获取原始名称  
  7.                             IDatasetName pDN = pFd.DataSourceName as IDatasetName;  
  8.                             lyrFeatureClassName = pDN.Name;  
  9.                           
  10.                       

 

附:各图层类型对应的UID

 

[c-sharp]  view plain copy
  1. //6CA416B1-E160-11D2-9F4E-00C04F6BC78E IDataLayer  
  2.       //40A9E885-5533-11d0-98BE-00805F7CED21 IFeatureLayer  
  3.       //E156D7E5-22AF-11D3-9F99-00C04F6BC78E IGeoFeatureLayer  
  4.       //34B2EF81-F4AC-11D1-A245-080009B6F22B IGraphicsLayer  
  5.       //5CEAE408-4C0A-437F-9DB3-054D83919850 IFDOGraphicsLayer  
  6.       //0C22A4C7-DAFD-11D2-9F46-00C04F6BC78E ICoverageAnnotationLayer  
  7.       //EDAD6644-1810-11D1-86AE-0000F8751720 IGroupLayer  
  8.       //D02371C7-35F7-11D2-B1F2-00C04F8EDEFF IRasterLayer  

转载链接:http://blog.csdn.net/NickWar/article/details/4855684

相关链接:http://www.360doc.com/content/13/0220/09/3046928_266687835.shtml

以上是关于使用ArcEngine实现ArcMap的Set datasource 功能,修复mxd中的图层位置的主要内容,如果未能解决你的问题,请参考以下文章

ArcEngine应用程序中无法实现TOC图层多选

arcengine 怎么给图层的一个字段 重新赋值

arcengine用c#开发怎么实现选择属性表中的一项属性平移至地图显示?

arcEngine开发之IMapILayerIFeatureLayer和IFeatureClass关系

ArcEngine环境下合并断开的线要素(根据属性)

ArcEngine 拓扑检查 总结