通过IMap中的get_layers()可以遍历MapControl中当前的图层。此方法可以通过指定UID对图层进行过滤或者分类。
1. 遍历矢量图层
public IEnumLayer GetFeatureLayers()
{
UID uid = new UIDClass();
uid.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}";//FeatureLayer
IEnumLayer layers = frmMap.m_mapCtrl.Map.get_Layers(uid, true);
return layers;
}
2. 遍历栅格图层
publicIEnumLayerGetRasterLayers()
{
UIDuid=newUIDClass();
uid.Value="{D02371C7-35F7-11D2-B1F2-00C04F8EDEFF}";//RasterLayer
IEnumLayerlayers=frmMap.m_mapCtrl.Map.get_Layers(uid,true);
returnlayers;
}
3.遍历其它图层
{6CA416B1-E160-11D2-9F4E-00C04F6BC78E} IDataLayer (包括所有类型的图层)
{40A9E885-5533-11d0-98BE-00805F7CED21} IFeatureLayer
{E156D7E5-22AF-11D3-9F99-00C04F6BC78E} IGeoFeatureLayer
{34B2EF81-F4AC-11D1-A245-080009B6F22B} IGraphicsLayer
{5CEAE408-4C0A-437F-9DB3-054D83919850} IFDOGraphicsLayer
{0C22A4C7-DAFD-11D2-9F46-00C04F6BC78E} ICoverageAnnotationLayer
{EDAD6644-1810-11D1-86AE-0000F8751720} IGroupLayer
4. 通过图层名获取图层接口
在AE开发中,这是常用到的功能,配合上面的方法,很容易实现。
//获取矢量图层接口
public IFeatureLayer GetFeatureLayer(string layerName)
{
//get the layers from the maps
IEnumLayer layers = GetFeatureLayers();
layers.Reset();
ILayer layer = null;
while ((layer = layers.Next()) != null)
{
if (layer.Name == layerName)
return layer as IFeatureLayer;
}
return null;
}
//获取栅格图层接口
public IRasterLayer GetRasterLayer(string layerName)
{
//get the layers from the maps
IEnumLayer layers = GetRasterLayers();
layers.Reset();
ILayer layer = null;
while ((layer = layers.Next()) != null)
{
if (layer.Name == layerName)
return layer as IRasterLayer;
}
return null;
}
/// <summary>
/// 获得要素图层
/// </summary>
/// <param name="pMap"></param>
/// <returns></returns>
public static IFeatureLayer[] GetFeatureLayers(IMap pMap)
{
IFeatureLayer pFeatLayer;
ICompositeLayer pCompLayer;
List<IFeatureLayer> pList = new List<IFeatureLayer>();
//遍历地图
for (int i = 0; i < pMap.LayerCount; i++)
{
if (pMap.get_Layer(i) is IFeatureLayer)
{
//获得图层要素
pFeatLayer = pMap.get_Layer(i) as IFeatureLayer;
pList.Add(pFeatLayer);
}
else if (pMap.get_Layer(i) is IGroupLayer)
{
//遍历图层组
pCompLayer = pMap.get_Layer(i) as ICompositeLayer;
for (int j = 0; j < pCompLayer.Count; j++)
{
if (pCompLayer.get_Layer(j) is IFeatureLayer)
{
pFeatLayer = pCompLayer.get_Layer(j) as IFeatureLayer;
pList.Add(pFeatLayer);
}
}
}
}
return pList.ToArray();
}