• 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功能。


  • 相关阅读:
    洛谷 P2958 [USACO09OCT]木瓜的丛林Papaya Jungle
    洛谷 P1400 塔
    10-2 集合之List
    主从数据库
    【单元测试】
    Pen Editor
    appendGrid
    动画
    JavaScript框架设计 第14章 动画引擎
    >>>
  • 原文地址:https://www.cnblogs.com/dengshiwei/p/4258712.html
Copyright © 2020-2023  润新知