博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#语言实现ArcGIS数据源重置之Set Data Source功能
阅读量:6290 次
发布时间:2019-06-22

本文共 4279 字,大约阅读时间需要 14 分钟。

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)、,地图文档的视图。

(2)、,关闭地图文档;

(3)、,地图文档的文件名称;

(4)、,地图文档的类型,有

(5)、。推断是否为地图文档;:是否有password保护

(6)、。是否存在。是否仅仅读。

(仅仅读的文档无法进行保存)

(7)、,获取地图文档中的图层。

返回ILayer类型。參数get_Layer (mapIndex,layerIndex)

(8)、Map,用来获取IMap对象。   :包括几个Map对象

(9)、,创建一个MapDocument,

(10)、,打开一个地图文档,依据路径打开。public void Open (string sDocument,string bsPassword);

(11)、,用于保存MapDocument,public void Save (bool bUseRelativePaths,bool bCreateThumnbail);

(12)、。用于指定MapDocument的路径

2、IMapControl2     的方法比較多,功能比較明确,这里仅仅是罗列一下;

(1)、、、、(用于定位)、(检查某个MXD路径)

(2)、(清楚Map中全部图层)、(此时Map上的工具)、(删除图层)

(3)、(在Map上绘制一个Geometry)、(在Geometry绘制文字)、(闪烁)

(4)、(将地图上的点转换)、(转换为地图上的点)、(全屏)

(5)、:句柄、(图层的个数)、(依据路径载入一个Mxd)、:比例尺

(6)、(地图单位)、(鼠标的形状)、(移动Layer的位置)、(刷新)

(7)(空间參考)、(画圆)、(线)、(多边形)

3、IWorkspaceFactory        工作空间工厂,用于创造工作空间的接口,IWorkspace继承于它

(1)、,赋值一个工作空间

(2)、,通过路径、文件名称、数据库连接创建一个新的工作空间

(3)、,工厂的ID

(4)、,获取工作空间的名字

(5)、,是否为工作空间

(6)、。将一个工作空间移动到一个指定的目录

public bool Move ( IWorkspaceName WorkspaceName,string destinationFolder);

(7)、,打开一个工作空间public IWorkspace Open (IPropertySet ConnectionProperties,int hWnd);

(8)、,通过给定的文件名称打开一个工作空间

public IWorkspace OpenFromFile ( string fileName,int hWnd);

(9),依据文件名称读取连接属性

public IPropertySet ReadConnectionPropertiesFromFile (string fileName);

(10)。工作空间的类型,

4、IWorkspace   工作空间。用于对数据进行操作

(1)、,连接属性,返回一个

(2)、,工作空间中DataSet的名称

(3)、。工作空间中的要素集合          :运行一个SQL语句      :是否存在

(4)、,是否为系统路径            :工作空间路径的全名称      :类型

5、IEnumDataset

(1)next。下一个          ReSet:重置DataSet

类如:IEnumDataset pEnumDataSet = pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);

6、IFeatureWorkspace

(1)、,创建一个FeatureClass

(2)、,创建一个DATAset

public IFeatureDataset CreateFeatureDataset ( string Name, ISpatialReference SpatialReference);

(3)、,打开一个存在的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功能。

你可能感兴趣的文章
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>
hadoop、hbase、zookeeper集群搭建
查看>>
python中一切皆对象------类的基础(五)
查看>>
modprobe
查看>>
android中用ExpandableListView实现三级扩展列表
查看>>
%Error opening tftp://255.255.255.255/cisconet.cfg
查看>>
java读取excel、txt 文件内容,传到、显示到另一个页面的文本框里面。
查看>>
《从零开始学Swift》学习笔记(Day 51)——扩展构造函数
查看>>
python多线程队列安全
查看>>