I want to build an IDictionary with the feature layers of my TOC in ArcObjects. So I need key value pairs. The value will be an attribute of the feature layer but I am wondering what to use as key. I can use the layer name but there can theoretically be duplicate layer names in the TOC. Any suggestions on how I can get a unique reference to a feature layer?
Background is that I need to store the layers and their querydefinitions in a custom application that runs in desktop and ArcEngine environment. I don't know the layers before. It could be that the user defines layer groups that have sublayers with the same name. This would lead to an error when storing it in the dictionary.
-
2This is a good starting point: gis.stackexchange.com/questions/7643/…steffan– steffan2014年12月04日 10:41:10 +00:00Commented Dec 4, 2014 at 10:41
-
1You do not say if this is a desktop or some sort of server side development. If it is a server side development have a look at the ILayerDescription interface as it has an ID property. I've never done any server side development so not sure if that is a red herring?Hornbydd– Hornbydd2014年12月04日 12:29:47 +00:00Commented Dec 4, 2014 at 12:29
-
Define "unique" in the question. What will you be needing the key for? Without knowing that its just a guessing game.Stefan– Stefan2014年12月04日 13:15:04 +00:00Commented Dec 4, 2014 at 13:15
-
unique so that is serves as a key in a dictionary. I added the info to my original post.Chris P– Chris P2014年12月04日 15:27:25 +00:00Commented Dec 4, 2014 at 15:27
1 Answer 1
IEnumLayer will build an index for you when you initialize it. It indexes all layers in the order that they appear in the TOC (the top layer will be index 0, the next down will be 1, etc). You can use this index as your key as it will always be unique to the layer.
Here's the code to initialize and access in ArcGIS Desktop:
ESRI.ArcGIS.ArcMapUI.IMxDocument pDoc;
pDoc = ArcMap.Document;//get current mxd and set it as pDoc
ESRI.ArcGIS.Carto.IActiveView activeView;
activeView = pDoc.ActiveView;
IMap pMap = pDoc.FocusMap; //set pMap as current document
ESRI.ArcGIS.Carto.IEnumLayer pEnumLayer;
pEnumLayer = pDoc.FocusMap.Layers; //get all layers in the map
ESRI.ArcGIS.Carto.ILayer pLayer;
pLayer = pEnumLayer.Next(); //grab the layer from enumerator
while (pLayer != null) //loop through all your layers
{
//build your dictionary here
pLayer = pEnumLayer.Next();
}
If the user will get the chance to add, remove or reorder layers in the course of your application you will of course need to re-initialize IEnumLayers and rebuild your dictionary accordingly as necessary.