码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-01-30 09:37:00      阅读:745      评论:0      收藏:0      [点我收藏+]

标签:

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)、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功能。


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

标签:

原文地址:http://www.cnblogs.com/mengfanrong/p/5170471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!