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


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文档中所有的IFeatureLayer
pEnumLayer = 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}"; //IRasterLayer
pEnumLayer = 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 layer
pEnumLayer = 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;
}

转载自:https://blog.csdn.net/csu2015/article/details/77336869

You may also like...