zoukankan      html  css  js  c++  java
  • 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功能。


  • 相关阅读:
    PointToPointNetDevice doesn't support TapBridgeHelper
    NS3系列—10———NS3 NodeContainer
    NS3系列—9———NS3 IP首部校验和
    NS3系列—8———NS3编译运行
    【习题 7-6 UVA
    【Good Bye 2017 C】 New Year and Curling
    【Good Bye 2017 B】 New Year and Buggy Bot
    【Good Bye 2017 A】New Year and Counting Cards
    【Educational Codeforces Round 35 D】Inversion Counting
    【Educational Codeforces Round 35 C】Two Cakes
  • 原文地址:https://www.cnblogs.com/dengshiwei/p/4258712.html
Copyright © 2011-2022 走看看