"layers" : [ { "MaxScale" : 0, "MinScale" : 0, "defaultVisibility" : true, "geometryType" : null, "id" : 0, "name" : "Name", "parentLayerId" : -1, "subLayerIds" : [ 1, 2 ] }, { "MaxScale" : 0, "MinScale" : 0, "defaultVisibility" : false, "geometryType" : "esriGeometryPoint", "id" : 1, "name" : "NAME Offices", "parentLayerId" : 0, "subLayerIds" : null } ...
private XxxLayerInfo[] GetLayerInfos() { IMapServer3 mapServer = _serverObjectHelper.ServerObject as IMapServer3; if (mapServer == null) throw new Exception("Unable to access XXX map server."); IMapServerInfo msInfo = mapServer.GetServerInfo(mapServer.DefaultMapName); IMapLayerInfos layerInfos = msInfo.MapLayerInfos; int length = layerInfos.Count; XxxLayerInfo[] xxxLayerInfos = new XxxLayerInfo; for(int i = 0; i < length; i++) { IMapLayerInfo layerInfo = layerInfos.get_Element(i); xxxLayerInfos = XxxLayerInfo.CreateXxxLayerInfo(layerInfo); } return xxxLayerInfos; } public static XxxLayerInfo CreateXxxLayerInfo(IMapLayerInfo mapLayerInfo) { var layer = new XxxLayerInfo(); layer.Id = mapLayerInfo.ID; layer.Name = mapLayerInfo.Name; layer.GeometryType = null; //mapLayerInfo.GeometryType - HOW TO GET this?; layer.DefaultVisibility = false; //mapLayerInfo.DefaultVisibility - HOW TO GET this?; layer.MinScale = mapLayerInfo.MinScale; layer.MaxScale = mapLayerInfo.MaxScale; layer.ParentLayerId = mapLayerInfo.ParentLayerID; layer.SubLayers = mapLayerInfo.SubLayers; return layer; }
// get map info public static MapInfo ConstructFrom(IMapServer3 mapServer3) { // IMapServerInfo3 contains CopyrightText prop, 1 & 2 does not var mapServerInfo = (IMapServerInfo3)mapServer3.GetServerInfo(mapServer3.DefaultMapName); var mapInfo = new MapInfo { Description = mapServerInfo.Description, MapName = mapServerInfo.Name, CopyrightText = mapServerInfo.CopyrightText }; IMapLayerInfos layerInfos = mapServerInfo.MapLayerInfos; for (int i = 0; i < layerInfos.Count; i++) { var layerInfo = layerInfos.Element; mapInfo.Layers.Add( LayerInfo.ConstructFrom( layerInfo, LayerInfo.IsLayerVisible(mapServerInfo, layerInfo.ID) )); } return mapInfo; } // get layer info private static readonly int[] AvaliableReports = new[] {17,18,19,20}; public static LayerInfo ConstructFrom(IMapLayerInfo mapLayerInfo, bool visible) { var layerInfo = new LayerInfo { Id = mapLayerInfo.ID, DisplayField = mapLayerInfo.DisplayField, ScaleUpper = (int)mapLayerInfo.MaxScale, ScaleLower = (int)mapLayerInfo.MinScale, Name = mapLayerInfo.Name, Description = mapLayerInfo.Description, DefaultVisibility = visible, ParentLayerId = mapLayerInfo.ParentLayerID, }; IFields fields = mapLayerInfo.Fields; bool addFields = false; if (fields != null) { for (int j = 0; j < fields.FieldCount; j++) { IField field = fields.Field; if (field.Type == esriFieldType.esriFieldTypeString) { layerInfo.DictFields[field.Name] = field.AliasName; continue; } if(field.Type != esriFieldType.esriFieldTypeGeometry) { continue; } IGeometryDef geometryDef = field.GeometryDef; layerInfo.GeometryType = Enum.GetName(typeof(esriGeometryType), geometryDef.GeometryType); switch (geometryDef.GeometryType) { case esriGeometryType.esriGeometryNull: layerInfo.GeometryType = null; break; case esriGeometryType.esriGeometryPoint: addFields = true; break; } } } // hack: this should be done in a proper way... but for now is enough layerInfo.ContainsReport = AvaliableReports.Contains(layerInfo.Id); if(!addFields) { layerInfo.DictFields = new Dictionary<string, string>(); } if (mapLayerInfo.SubLayers == null) { return layerInfo; } for (int i = 0; i < mapLayerInfo.SubLayers.Count; i++) { layerInfo.SubLayerIds.Add(mapLayerInfo.SubLayers.Element); } return layerInfo; } // get default visibility public static bool IsLayerVisible(IMapServerInfo3 mapServerInfo, int layerId) { ILayerDescriptions layerDescs = mapServerInfo.DefaultMapDescription.LayerDescriptions; long c = layerDescs.Count; for (long i = 0; i < c; i++) { var layerDesc = (ILayerDescription3)layerDescs.Element; if (layerDesc.ID == layerId) { return layerDesc.Visible; } } return false; }