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;
}