MXD文档操作(二)-修改MXD文档数据源

1 总述

本文是在上文的基础上继续进行,给shp文件图层、raster图层、dwg文件(CAD)图层重设数据源。

IMapDocument mapDoc = new MapDocumentClass();
mapDoc.Open(mxdPath);
IMap pMap = mapDoc.get_Map(0);
List<string> list = GetMxdLayerInfo(mxdPath);//获取所有图层的数据源信息
string extention = System.IO.Path.GetExtension(item);
IDataSourceHelperMapDocument repairment = new DataSourceHelperClass();

2 SHP文件

//if(extention.Equals(".shp"))

string layerName = System.IO.Path.GetFileNameWithoutExtension(item);//item为list中的一项
ILayer pLayer = GetLayerByName(layerName, pMap);
if (pLayer != null)
{
   IDataLayer dataLayer = (IDataLayer)pLayer;
   IDatasetName pDsName = (IDatasetName)(dataLayer.DataSourceName);
   IWorkspaceName ws = pDsName.WorkspaceName;
   ws.PathName = newPath;
   bool result = dataLayer.Connect(pDsName as IName);//连接到数据源
   if (result && !mapDoc.get_IsReadOnly(mapDoc.DocumentFilename))
   {
       mapDoc.Save();
   }
}

/// <summary>
/// 通过图层名从IMap中获取指定图层ILayer
/// </summary>
/// <param name="layerName">图层名</param>
/// <param name="pMap"></param>
/// <returns></returns>
private ILayer GetLayerByName(string layerName, IMap pMap) {
    ILayer layer = null;
    for (int i = 0; i < pMap.LayerCount; i++) {
        ILayer pLayer = pMap.get_Layer(i);
        if (pLayer is IGroupLayer || pLayer is ICompositeLayer) {
            layer = GetSubLayer(layerName, pLayer as ICompositeLayer);
            if (layer != null) {
                break;
            }
        } else if (pLayer.Name == layerName) {
            layer = pLayer;
            break;
        }
    }
    return layer;
}
/// <summary>
/// 从图层组中获取指定图层名的图层
/// </summary>
/// <param name="layerName">图层名</param>
/// <param name="compositeLayer">图层组</param>
/// <returns></returns>
private ILayer GetSubLayer(string layerName, ICompositeLayer compositeLayer) {
    ILayer mLayer = null;
    for (int i = 0; i < compositeLayer.Count; i++) {
        ILayer pLayer2 = compositeLayer.get_Layer(i);
        if (pLayer2 is IGroupLayer || pLayer2 is ICompositeLayer) {
            mLayer = GetSubLayer(layerName, pLayer2 as ICompositeLayer);
            if (mLayer != null) {
                break;
            }
        } else if (pLayer2.Name.Equals(layerName)) {
            mLayer = pLayer2;
            break;
        }
    }
    return mLayer;
}

3 Raster图层

string layerName = System.IO.Path.GetFileName(item);
ILayer pLayer = GetLayerByName(layerName, pMap);
if (pLayer != null)
{
    IDataLayer dataLayer = (IDataLayer)pLayer;
    IDatasetName pDsName = (IDatasetName)(dataLayer.DataSourceName);
    IWorkspaceName oldWorkspaceName = pDsName.WorkspaceName;
    IWorkspaceName newWorkspaceName = new WorkspaceNameClass();
    newWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesRaster.RasterWorkspaceFactory";
    newWorkspaceName.PathName = System.IO.Path.Combine(newPath, fileName);                            
    repairment.ReplaceWorkspaceName(mapDoc, oldWorkspaceName, newWorkspaceName, true);
    mapDoc.Save();
}

4 DWG文件

ICompositeLayer pLayer = GetGroupLayerByName(fileName, pMap);
if (pLayer != null)
{
     ILayer subLayer = pLayer.get_Layer(0);
     IDataLayer dataLayer = (IDataLayer)subLayer;
     IDatasetName pDsName = (IDatasetName)(dataLayer.DataSourceName);
     IWorkspaceName oldWorkspaceName = pDsName.WorkspaceName;
     IWorkspaceName newWorkspaceName = new WorkspaceNameClass();

     newWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.CadWorkspaceFactory";
     newWorkspaceName.PathName = System.IO.Path.Combine(newPath, fileName);
     repairment.ReplaceWorkspaceName(mapDoc, oldWorkspaceName, newWorkspaceName, true);
     mapDoc.Save();
}

/// <summary>
/// 根据图层名获取指定图层组
/// </summary>
/// <param name="layerName">图层名</param>
/// <param name="pMap"></param>
/// <returns></returns>
private ICompositeLayer GetGroupLayerByName(string layerName, IMap pMap) {
    ICompositeLayer compLayer = null;
    string groupLayerUID = "{EDAD6644-1810-11D1-86AE-0000F8751720}";
    IEnumLayer pEnumLayer = GetLayers(groupLayerUID, pMap);
    ILayer mLayer = pEnumLayer.Next();
    while (mLayer != null) {
        if (mLayer.Name.StartsWith(layerName)) {
            compLayer = mLayer as ICompositeLayer;
            if (compLayer.Count == 0) {
                compLayer = null;
            } else {
                break;
            }
        }
        mLayer = pEnumLayer.Next();
    }
    return compLayer;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值