方法一:根據mxd文件路徑進行遍歷
同理可以根據其他條件獲取指定的圖層,此處圖層名稱只是一個例子。
//mxdPath 文件路徑"C:\\test.mxd",layername圖層名稱
public IFeatureLayer LoadMxd(string mxdPath, string layername)
{
if (!File.Exists(mxdPath))
{
MessageBox.Show("不存在該文件!");
return null;
}
IFeatureLayer pFlayer;
IMapDocument pMapdocument = new MapDocumentClass();
pMapdocument.Open(mxdPath, "");
IMap Pmap = pMapdocument.ActiveView.FocusMap;
Pmap.MapUnits = ESRI.ArcGIS.esriSystem.esriUnits.esriMeters;
if (Pmap.LayerCount != 0)
{
UID puid = new UIDClass();
puid.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}"; //只讀取IFeaturelayer
IEnumLayer pEnumLayer = Pmap.get_Layers(puid, true);
pEnumLayer.Reset();
pFlayer = (IFeatureLayer)pEnumLayer.Next();
while (pFlayer != null)
{
if (pFlayer.Name == layername)
{ return pFlayer; }
pFlayer = (IFeatureLayer)pEnumLayer.Next();
}
}
return null;
}
方法二:根據當前已經打開的mxd地圖窗口進行遍歷
遍歷圖層主要使用 ICompositeLayer 類,可以理解爲圖層集合。主要思想就是獲取當前地圖的最上層圖層列表,循環判斷是圖層集合還是圖層,若是圖層集合則繼續向下遍歷,若是圖層則判斷圖層名稱,直到找到指定的圖層。
同理可以根據其他條件獲取指定的圖層,此處名稱只是一個例子。
private ILayer relayer;//存儲最終獲取的圖層
private void test()
{
//axMapControl1當前地圖窗口控件
IMapControlDefault pMapcontrol = (axMapControl1.Object as IMapControl2) as IMapControlDefault;
ILayer testlayer = GetLayer(pMapcontrol,"地圖名稱");
}
//根據圖層名稱獲取圖層
private ILayer GetLayer(IMapControlDefault mapcontrol,string LayerName)
{
relayer = null;
ICompositeLayer pCompositeLayer;
for (int i = 0; i < mapcontrol.LayerCount; i++)//遍歷所有圖層
{
if (mapcontrol.get_Layer(i) is ICompositeLayer)
{
string test = mapcontrol.get_Layer(i).Name;
pCompositeLayer = mapcontrol.get_Layer(i) as ICompositeLayer;
Togetlayer(pCompositeLayer, LayerName);
if (relayer != null)
{
return relayer;
}
}
else if (mapcontrol.get_Layer(i).Name == LayerName)
{
return mapcontrol.get_Layer(i);
}
}
return null;
}
//遍歷要素集下的所有圖層
private void Togetlayer(ICompositeLayer pCompositeLayer, string name)
{
ICompositeLayer icolayer;
for (int i = 0; i < pCompositeLayer.Count; i++)
{
string test = pCompositeLayer.get_Layer(i).Name;
if (pCompositeLayer.get_Layer(i) is ICompositeLayer)
{
icolayer = pCompositeLayer.get_Layer(i) as ICompositeLayer;
Togetlayer(icolayer, name);
}
if (pCompositeLayer.get_Layer(i).Name == name)
{
relayer = pCompositeLayer.get_Layer(i);
}
}
}