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