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)、,地图文档的视图。
(2)、,关闭地图文档;
(3)、,地图文档的文件名称;
(4)、,地图文档的类型,有
(5)、。推断是否为地图文档;:是否有password保护
(6)、。是否存在。是否仅仅读。
(仅仅读的文档无法进行保存)
(7)、,获取地图文档中的图层。
返回ILayer类型。參数get_Layer (mapIndex,layerIndex)
(8)、Map,用来获取IMap对象。 :包括几个Map对象
(9)、,创建一个MapDocument,
(10)、,打开一个地图文档,依据路径打开。public void Open (string sDocument,string bsPassword);
(11)、,用于保存MapDocument,public void Save (bool bUseRelativePaths,bool bCreateThumnbail);
(12)、。用于指定MapDocument的路径
2、IMapControl2 的方法比較多,功能比較明确,这里仅仅是罗列一下;
(1)、、、、(用于定位)、(检查某个MXD路径)
(2)、(清楚Map中全部图层)、(此时Map上的工具)、(删除图层)
(3)、(在Map上绘制一个Geometry)、(在Geometry绘制文字)、(闪烁)
(4)、(将地图上的点转换)、(转换为地图上的点)、(全屏)
(5)、:句柄、(图层的个数)、(依据路径载入一个Mxd)、:比例尺
(6)、(地图单位)、(鼠标的形状)、(移动Layer的位置)、(刷新)
(7)(空间參考)、(画圆)、(线)、(多边形)
3、IWorkspaceFactory 工作空间工厂,用于创造工作空间的接口,IWorkspace继承于它
(1)、,赋值一个工作空间
(2)、,通过路径、文件名称、数据库连接创建一个新的工作空间
(3)、,工厂的ID
(4)、,获取工作空间的名字
(5)、,是否为工作空间
(6)、。将一个工作空间移动到一个指定的目录
public bool Move ( IWorkspaceName WorkspaceName,string destinationFolder);
(7)、,打开一个工作空间public IWorkspace Open (IPropertySet ConnectionProperties,int hWnd);
(8)、,通过给定的文件名称打开一个工作空间
public IWorkspace OpenFromFile ( string fileName,int hWnd);
(9),依据文件名称读取连接属性
public IPropertySet ReadConnectionPropertiesFromFile (string fileName);
(10)。工作空间的类型,
4、IWorkspace 工作空间。用于对数据进行操作
(1)、,连接属性,返回一个
(2)、,工作空间中DataSet的名称
(3)、。工作空间中的要素集合 :运行一个SQL语句 :是否存在
(4)、,是否为系统路径 :工作空间路径的全名称 :类型
5、IEnumDataset
(1)next。下一个 ReSet:重置DataSet
类如:IEnumDataset pEnumDataSet = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
6、IFeatureWorkspace
(1)、,创建一个FeatureClass
(2)、,创建一个DATAset
public IFeatureDataset CreateFeatureDataset ( string Name, ISpatialReference SpatialReference);
(3)、,打开一个存在的FeatureClass
public IFeatureClass OpenFeatureClass (string Name);
注意:其它接口在别的文章中有,或者查看ArcEngine的帮助文档
需求实现代码:
private void SetDataSource(string sMxdPath, string sTargetPath) { 获取MapDocment IMapDocument pMapDocument = new MapDocumentClass(); pMapDocument.Open(sMxdPath, ""); 创建一个MapControl IMapControl2 pMapControl = new MapControlClass(); string sFileName = sMxdPath; pMapControl.LoadMxFile(sFileName, null, null); 创建一个工作空间 IWorkspaceFactory pWorkFactory = new AccessWorkspaceFactoryClass(); IWorkspace pWorkspace = pWorkFactory.OpenFromFile(sTargetPath, 0); 获取工作空间中的全部Dataset IEnumDataset pEnumDataSet = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); IDataset pDataSet = pEnumDataSet.Next(); ISpatialReference pRef = (pDataSet as IGeoDataset).SpatialReference; string sDistrictCode = string.Empty; string sScale = string.Empty; if (pDataSet != null) { UID uid = new UIDClass(); uid.Value = "{" + typeof(IFeatureLayer).GUID.ToString() + "}"; IEnumLayer pEnumLayer = pMapControl.Map.get_Layers(uid, true); IFeatureLayer pFeaLyr = pEnumLayer.Next() as IFeatureLayer; IFeatureWorkspace pFeaClsWks = pWorkspace as IFeatureWorkspace; while (pFeaLyr != null) { string sDsName = ((pFeaLyr as IDataLayer).DataSourceName as IDatasetName).Name; if ((pWorkspace as IWorkspace2).get_NameExists(esriDatasetType.esriDTFeatureClass, sDsName)) { pFeaLyr.FeatureClass = pFeaClsWks.OpenFeatureClass(sDsName); pFeaLyr.Name = pFeaLyr.Name; } pFeaLyr = pEnumLayer.Next() as IFeatureLayer; } //释放资源,防止出现Ox80040228,出现资源锁定错误
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pWorkspace);
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pFeaClsWks);
pMapControl.Map.SpatialReference = pRef;
IMxdContents pMxdC;
pMxdC = pMapControl.Map as IMxdContents;
pMapDocument.Open((pMapControl as IMapControl3).DocumentFilename, "");
pMapDocument.ReplaceContents(pMxdC);
pMapDocument.Save(true, true);
}
}至此,就实现ArcMap中的Set Data Source功能。