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

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)、ActiveViewAddLayerAddLayerFromFileCenterAt(用于定位)、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功能。


posted @ 2014-10-24 15:30  静以养身 俭以养德  阅读(273)  评论(0编辑  收藏  举报