在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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:是否有password保护 (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的帮助文档 需求实现代码:
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功能。 |
请发表评论