C#语言实现ArcGIS数据源重置之Set Data Source功能

 

C#语言实现ArcGIS数据源重置之Set Data Source功能

标签: ArcGIS数据源重置Set Data Source功能IMapDocumentWorkspaceArcEngine接口
http://blog.csdn.net/anlidengshiwei/article/details/40428233
 分类:
 
 

1、需要:根据选择的Mxd路径和目标数据源路径进行重置数据源。此处以(.Mdb为例);

主要利用到的接口:

(1)IMapDocument    (2)IMapControl2     (3)IWorkspaceFactory        (4)IWorkspace  (5)IEnumDataset

(6)IDataset               (7)ISpatialReference   (8)UID        (9)IEnumLayer           (10)IFeatureWorkspace

现在简要介绍下以上10个接口的常用方法:

1、IMapDocument

(1)、ActiveView,地图文档的视图;

(2)、Close,关闭地图文档;

(3)、DocumentFilename,地图文档的文件名;

(4)、DocumentType,地图文档的类型,有

(5)、IsMapDocument,判断是否为地图文档;IsPasswordProtected:是否有密码保护

(6)、IsPresent,是否存在,IsReadOnly是否只读。(只读的文档无法进行保存)

(7)、Layer,获取地图文档中的图层。返回ILayer类型,参数get_Layer (intmapIndex,intlayerIndex)

(8)、Map,用来获取IMap对象,   MapCount:包含几个Map对象

(9)、New,创建一个MapDocument,

(10)、Open,打开一个地图文档,根据路径打开。public void Open (string sDocument,string bsPassword);

(11)、Save,用于保存MapDocument,public void Save (bool bUseRelativePaths,bool bCreateThumnbail);

(12)、UsesRelativePaths,用于指定MapDocument的路径

 

2、IMapControl2     的方法比较多,功能比较明白,这里只是罗列一下;

(1)、ActiveView、AddLayer、AddLayerFromFile、CenterAt(用于定位)、CheckMxFile(检查某个MXD路径)

(2)、ClearLayers(清楚Map中所有图层)、CurrentTool(此时Map上的工具)、DeleteLayer(删除图层)

(3)、DrawShape(在Map上绘制一个Geometry)、DrawText(在Geometry绘制文字)、FlashShape(闪烁)

(4)、FromMapPoint(将地图上的点转换)、ToMapPoint(转换为地图上的点)、FullExtent(全屏)

(5)、hWnd:句柄、LayerCount(图层的个数)、LoadMxFile(根据路径加载一个Mxd)、MapScale:比例尺

(6)、MapUnits(地图单位)、MouseIcon(鼠标的形状)、MoveLayerTo(移动Layer的位置)、Refresh(刷新)

(7)SpatialReference(空间参考)、TrackCircle(画圆)、TrackLine(线)、TrackPolygon(多边形)

 

3、IWorkspaceFactory        工作空间工厂,用于创造工作空间的接口,IWorkspace继承于它

(1)、Copy,赋值一个工作空间

(2)、Create,通过路径、文件名、数据库连接创建一个新的工作空间

(3)、GetClassID,工厂的ID

(4)、GetWorkspaceName,获取工作空间的名字

(5)、IsWorkspace,是否为工作空间

(6)、Move,将一个工作空间移动到一个指定的文件夹

public bool Move ( IWorkspaceName WorkspaceName,string destinationFolder);

(7)、Open,打开一个工作空间public IWorkspace Open (IPropertySet ConnectionProperties,int hWnd);

(8)、OpenFromFile,通过给定的文件名打开一个工作空间

public IWorkspace OpenFromFile ( string fileName,int hWnd);

(9)ReadConnectionPropertiesFromFile,根据文件名读取连接属性

public IPropertySet ReadConnectionPropertiesFromFile (string fileName);

(10)WorkspaceType,工作空间的类型,

 

4、IWorkspace   工作空间,用于对数据进行操作

(1)、ConnectionProperties,连接属性,返回一个IPropertySet类型

(2)、DatasetNames,工作空间中DataSet的名称

(3)、Datasets,工作空间中的要素集合          ExecuteSQL:执行一个SQL语句      Exists:是否存在

(4)、IsDirectory,是否为系统路径            PathName:工作空间路径的全名称      Type:类型

 

5、IEnumDataset

(1)next,下一个          ReSet:重置DataSet

类如:IEnumDataset pEnumDataSet = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);

 

6、IFeatureWorkspace

(1)、CreateFeatureClass,创建一个FeatureClass

(2)、CreateFeatureDataset,创建一个DATAset

public IFeatureDataset CreateFeatureDataset ( string Name, ISpatialReference SpatialReference);

(3)、OpenFeatureClass,打开一个存在的FeatureClass

public IFeatureClass OpenFeatureClass (string Name);

 

注意:其他接口在别的文章中有,或者查看ArcEngine的帮助文档

需求实现代码:

 

[csharp] view plain copy
 
 print?
  1. private void SetDataSource(string sMxdPath, string sTargetPath)  
  2.        {  
  3.            ////获取MapDocment  
  4.            IMapDocument pMapDocument = new MapDocumentClass();  
  5.            pMapDocument.Open(sMxdPath, "");  
  6.   
  7.            ////创建一个MapControl  
  8.            IMapControl2 pMapControl = new MapControlClass();  
  9.            string sFileName = sMxdPath;  
  10.            pMapControl.LoadMxFile(sFileName, null, null);  
  11.   
  12.            ////创建一个工作空间  
  13.            IWorkspaceFactory pWorkFactory = new AccessWorkspaceFactoryClass();  
  14.            IWorkspace pWorkspace = pWorkFactory.OpenFromFile(sTargetPath, 0);  
  15.   
  16.            ////获取工作空间中的所有Dataset  
  17.            IEnumDataset pEnumDataSet = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);  
  18.            IDataset pDataSet = pEnumDataSet.Next();  
  19.            ISpatialReference pRef = (pDataSet as IGeoDataset).SpatialReference;  
  20.   
  21.            string sDistrictCode = string.Empty;  
  22.            string sScale = string.Empty;  
  23.   
  24.            if (pDataSet != null)  
  25.            {  
  26.                UID uid = new UIDClass();  
  27.                uid.Value = "{" + typeof(IFeatureLayer).GUID.ToString() + "}";  
  28.                IEnumLayer pEnumLayer = pMapControl.Map.get_Layers(uid, true);  
  29.                IFeatureLayer pFeaLyr = pEnumLayer.Next() as IFeatureLayer;  
  30.                IFeatureWorkspace pFeaClsWks = pWorkspace as IFeatureWorkspace;  
  31.                while (pFeaLyr != null)  
  32.                {  
  33.                    string sDsName = ((pFeaLyr as IDataLayer).DataSourceName as IDatasetName).Name;  
  34.                    if ((pWorkspace as IWorkspace2).get_NameExists(esriDatasetType.esriDTFeatureClass, sDsName))  
  35.                    {  
  36.                        pFeaLyr.FeatureClass = pFeaClsWks.OpenFeatureClass(sDsName);  
  37.                        pFeaLyr.Name = pFeaLyr.Name;  
  38.                    }  
  39.   
  40.                    pFeaLyr = pEnumLayer.Next() as IFeatureLayer;  
  41.                }  
  42.                //释放资源,防止出现Ox80040228,出现资源锁定错误  
[csharp] view plain copy
 
 print?
  1. ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pWorkspace);   
[csharp] view plain copy
 
 print?
  1. ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pFeaClsWks);   
[csharp] view plain copy
 
 print?
  1. pMapControl.Map.SpatialReference = pRef;   
[csharp] view plain copy
 
 print?
  1. IMxdContents pMxdC;   
[csharp] view plain copy
 
 print?
  1. pMxdC = pMapControl.Map as IMxdContents;  
[csharp] view plain copy
 
 print?
  1. pMapDocument.Open((pMapControl as IMapControl3).DocumentFilename, "");   
[csharp] view plain copy
 
 print?
  1. pMapDocument.ReplaceContents(pMxdC);   
[csharp] view plain copy
 
 print?
  1. pMapDocument.Save(true, true);   
[csharp] view plain copy
 
 print?
  1. }   
[csharp] view plain copy
 
 print?
  1. }  
[csharp] view plain copy
 
 print?
  1.   

 



至此,就实现ArcMap中的Set Data Source功能。
posted @ 2016-06-01 15:40  波澜涌动  阅读(226)  评论(0)    收藏  举报