ArcGIS Engine遍歷圖層,獲取指定的圖層

方法一:根據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);
                }
            }
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章