MXD文档操作(一)-获取所有图层数据源信息

来源:互联网 发布:徐州淘宝网店培训 编辑:程序博客网 时间:2024/05/29 09:12

  • 打开mxd文档
    • 1 在后台打开
    • 2 在arcgis中打开
  • 获取mxd文档中所有图层的数据源信息
    • 1 根据类型获取Layer
    • 2 IFeatureLayer
    • 3 IRasterLayer
    • 4 IGroupLayer

1 打开mxd文档

1.1 在后台打开

using ESRI.ArcGIS.Carto;IMapDocument mapDoc = new MapDocumentClass();  mapDoc.Open(mxdPath);

1.2 在arcgis中打开

ArcMap.Application.OpenDocument(mxdPath);

2 获取mxd文档中所有图层的数据源信息

在ArcGIS中,图层(ILayer)可以分为不同的类别,比较常见的有:IFeatureLayer、IRasterLayer、IGroupLayer等,并且mxd中还会包含数据表(如DBF表)。不同类别图层的数据源文件类型各异,获取方式也各不相同。下面分类获取各图层的数据源信息。

2.1 根据类型获取Layer

首先对所有图层进行分类,不同的图层具有唯一的一个UID编码,可以根据UID码分类获取图层。其对应关系见下表,更多详见帮助。

类型 UID值 IFeatureLayer “{40A9E885-5533-11D0-98BE-00805F7CED21}” IRasterLayer “{D02371C7-35F7-11D2-B1F2-00C04F8EDEFF}” IGroupLayer “{EDAD6644-1810-11D1-86AE-0000F8751720}”

分类获取函数

/// <summary>/// 根据UID获取指定类型的图层/// </summary>/// <param name="uidValue">UID值</param>/// <param name="pMap"></param>/// <returns></returns>private IEnumLayer GetLayers(string uidValue, IMap pMap){    UID uid = new UIDClass();    uid.Value = uidValue;//    IEnumLayer layers = pMap.get_Layers(uid, true);    return layers;}

2.2 IFeatureLayer

IFeatureLayer继承自ILayer,是MXD中的矢量数据层,是要素类的表现形式,图层的数据类型可以是geodatabase、shapefile、coverage等。

IMapDocument mapDoc = new MapDocumentClass();string mxdPath = mxdFullPathName;mapDoc.Open(mxdPath);IMap pMap = mapDoc.get_Map(0);IEnumLayer pEnumLayer;ILayer mLayer;List<string> list=new List<string>();//保存所有信息string extention="" //文件后缀;string uid1 = "{40A9E885-5533-11d0-98BE-00805F7CED21}";//FeatureLayer//获取mxd文档中所有的IFeatureLayerpEnumLayer = GetLayers(uid1, pMap);pEnumLayer.Reset();mLayer = pEnumLayer.Next();while (mLayer != null){    IFeatureLayer pFeatureLayer = mLayer as IFeatureLayer;    IDataLayer dataLayer = mLayer as IDataLayer;    IDatasetName pDsName = (IDatasetName)(dataLayer.DataSourceName);    IWorkspaceName ws = pDsName.WorkspaceName;    if (pFeatureLayer.DataSourceType.ToLower().Contains("shapefile"))    {       extention = ".shp";       string pathStr = ws.PathName;       string fileName = pDsName.Name;       if (!System.IO.Path.GetExtension(fileName).Equals(extention))       {          fileName += extention;       }       string fullName = System.IO.Path.Combine(pathStr, fileName);       if (!list.Contains(fullName))       {          list.Add(fullName);       }    }    mLayer = pEnumLayer.Next();}

2.3 IRasterLayer

string uid3 = "{D02371C7-35F7-11D2-B1F2-00C04F8EDEFF}"; //IRasterLayerpEnumLayer = GetLayers(uid3, pMap);pEnumLayer.Reset();mLayer = pEnumLayer.Next();while (mLayer != null){    IRasterLayer pRasterLayer = mLayer as IRasterLayer;    string fullName = pRasterLayer.FilePath;    if (!list.Contains(fullName))    {       list.Add(fullName);    }    mLayer = pEnumLayer.Next();}

2.4 IGroupLayer

string uid2 = "{EDAD6644-1810-11D1-86AE-0000F8751720}";//group layerpEnumLayer = GetLayers(uid2, pMap);pEnumLayer.Reset();mLayer = pEnumLayer.Next();while (mLayer != null){    IGroupLayer pGroupLayer = mLayer as IGroupLayer;    List<string> list2 = getGroupLayerInfo(pGroupLayer);    foreach (string item in list2)    {       if (!list.Contains(item))       {           list.Add(item);       }    }  mLayer = pEnumLayer.Next();}/// <summary>/// 获取图层组中所有图层的数据源信息(数据源的全路径)/// </summary>/// <param name="groupLayer">图层组</param>/// <returns>图层组中所有图层的数据源信息组成的List</returns>private List < string > getGroupLayerInfo(IGroupLayer groupLayer) {    List < string > list = new List < string > ();    string extention = "";    ICompositeLayer pCompositeLayer = groupLayer as ICompositeLayer;    for (int i = 0; i < pCompositeLayer.Count; i++) {        ILayer tLayer = pCompositeLayer.Layer[i];        //raster                           if (tLayer is IRasterLayer) {            IRasterLayer tLayer1 = tLayer as IRasterLayer;            string fullName = tLayer1.FilePath;            if (!list.Contains(fullName)) {                list.Add(fullName);            }        }        //IGroupLayer        else if (tLayer is IGroupLayer || tLayer is ICompositeLayer) {            List < string > list2 = getGroupLayerInfo(tLayer as IGroupLayer);            foreach(string item in list2) {                if (!list.Contains(item)) {                    list.Add(item);                }            }        }        //矢量图层        else {            IFeatureLayer pFeatureLayer = tLayer as IFeatureLayer;            IDataLayer dataLayer = tLayer as IDataLayer;            IDatasetName pDsName = (IDatasetName)(dataLayer.DataSourceName);            IWorkspaceName ws = pDsName.WorkspaceName;            string pathStr = ws.PathName;            string fileName = "";            if (pFeatureLayer.DataSourceType.ToLower().Contains("cad")) {                extention = ".dwg";                fileName = groupLayer.Name.Split(' ')[0];                if (!System.IO.Path.GetExtension(fileName).Equals(extention)) {                    fileName += extention;                }                string fullName = System.IO.Path.Combine(pathStr, fileName);                if (!list.Contains(fullName)) {                    list.Add(fullName);                }                break;            }            else if (pFeatureLayer.DataSourceType.ToLower().Contains("shapefile")) {                extention = ".shp";                fileName = pDsName.Name;                if (!System.IO.Path.GetExtension(fileName).Equals(extention)) {                    fileName += extention;                }                string fullName = System.IO.Path.Combine(pathStr, fileName);                if (!list.Contains(fullName)) {                    list.Add(fullName);                }            }        }    }    return list;}
原创粉丝点击