public MapImageData GetImage() { StringCollection visibleLayers = null; if (_appState.VisibleLayers.ContainsKey(_appState.MapTab)) { visibleLayers = _appState.VisibleLayers[_appState.MapTab]; } string keyExtent = _appState.Extent.ToDelimitedString(); string keySize = _width.ToString() + "," + _height.ToString(); string keyLayers = visibleLayers != null?visibleLayers.ToString('|') : ""; string key = String.Format("{0}|{1}|{2}|{3}|{4}|{5}", _appState.MapTab, _appState.Level, keyExtent, keySize, _resolution, keyLayers); CommonImageType imageType = CommonImageType.Png; byte[] image = null; MapImageData mapImageData = AppContext.ServerImageCache.Retrieve(key); if (mapImageData != null) { imageType = mapImageData.Type; image = mapImageData.Image; } Configuration config = AppContext.GetConfiguration(); Configuration.MapTabRow mapTab = config.MapTab.FindByMapTabID(_appState.MapTab); CommonDataFrame dataFrame = AppContext.GetDataFrame(mapTab); bool isInteractive = !mapTab.IsInteractiveLegendNull() && mapTab.InteractiveLegend == 1; // create the base image if not found in the cache if (image == null) { CommonMap map = dataFrame.GetMap(_width, _height, _extent); map.Resolution = _resolution; map.ImageType = CommonImageType.Png; double pixelSize = map.Extent.Width / _width; Dictionary <int, CommonLayer> layerList = new Dictionary <int, CommonLayer>(); Dictionary <int, String> definitionList = new Dictionary <int, String>(); List <String> mapTabLayerIds = new List <String>(); foreach (Configuration.MapTabLayerRow mapTabLayer in mapTab.GetMapTabLayerRows()) { Configuration.LayerRow layer = mapTabLayer.LayerRow; mapTabLayerIds.Add(layer.LayerID); CommonLayer commonLayer = dataFrame.Layers.FirstOrDefault(lyr => String.Compare(lyr.Name, layer.LayerName, true) == 0); int index = dataFrame.Layers.IndexOf(commonLayer); bool visibleAtScale = commonLayer.IsWithinScaleThresholds(pixelSize); bool shownInLegend = !mapTabLayer.IsShowInLegendNull() && mapTabLayer.ShowInLegend == 1; bool checkedInLegend = !isInteractive || mapTabLayer.IsCheckInLegendNull() || mapTabLayer.CheckInLegend < 0 || (visibleLayers != null && visibleLayers.Contains(layer.LayerID)); bool validLevel = layer.IsLevelFieldNull() || !String.IsNullOrEmpty(_appState.Level); if (!layerList.ContainsKey(index) && visibleAtScale && (!shownInLegend || checkedInLegend) && validLevel) { if (commonLayer.Type == CommonLayerType.Image) { map.ImageType = CommonImageType.Jpg; } layerList.Add(index, commonLayer); definitionList.Add(index, layer.GetLevelQuery(commonLayer, _appState.Level)); } } if (!mapTab.IsBaseMapIDNull()) { foreach (Configuration.LayerRow layer in config.Layer.Where(o => !o.IsBaseMapIDNull() && o.BaseMapID == mapTab.BaseMapID)) { if (!mapTabLayerIds.Contains(layer.LayerID)) { CommonLayer commonLayer = dataFrame.Layers.FirstOrDefault(o => String.Compare(o.Name, layer.LayerName, true) == 0); int index = dataFrame.Layers.IndexOf(commonLayer); bool visibleAtScale = commonLayer.IsWithinScaleThresholds(pixelSize); if (!layerList.ContainsKey(index) && visibleAtScale) { if (commonLayer.Type == CommonLayerType.Image) { map.ImageType = CommonImageType.Jpg; } layerList.Add(index, commonLayer); definitionList.Add(index, layer.GetLevelQuery(commonLayer, _appState.Level)); } } } } int[] indexes = new int[layerList.Keys.Count]; layerList.Keys.CopyTo(indexes, 0); List <int> indexList = new List <int>(indexes); indexList.Sort(); for (int i = 0; i < indexList.Count; ++i) { map.AddLayer(layerList[indexList[i]], definitionList[indexList[i]]); } imageType = map.ImageType; image = map.GetImageBytes(); AppContext.ServerImageCache.Store(key, new MapImageData(imageType, image)); } // draw the selected feature graphics and markup if (_appState.TargetIds.Count > 0 || _appState.SelectionIds.Count > 0 || _appState.MarkupGroups.Count > 0 || _appState.Markup.Count > 0) { Bitmap bitmap = new Bitmap(new MemoryStream(image)); bitmap.SetResolution(dataFrame.Dpi, dataFrame.Dpi); Graphics graphics = Graphics.FromImage(bitmap); if (_appState.TargetIds.Count > 0 || _appState.SelectionIds.Count > 0) { StringCollection targetIds; StringCollection filteredIds; StringCollection selectionIds; PrepareIds(out targetIds, out filteredIds, out selectionIds); DrawFeatures(graphics, _appState.TargetLayer, filteredIds, AppSettings.FilteredColor, AppSettings.FilteredOpacity, AppSettings.FilteredPolygonMode, AppSettings.FilteredPenWidth, AppSettings.FilteredDotSize); DrawFeatures(graphics, _appState.SelectionLayer, selectionIds, AppSettings.SelectionColor, AppSettings.SelectionOpacity, AppSettings.SelectionPolygonMode, AppSettings.SelectionPenWidth, AppSettings.SelectionDotSize); DrawFeatures(graphics, _appState.TargetLayer, targetIds, AppSettings.TargetColor, AppSettings.TargetOpacity, AppSettings.TargetPolygonMode, AppSettings.TargetPenWidth, AppSettings.TargetDotSize); DrawFeatures(graphics, _appState.TargetLayer, _appState.ActiveMapId, AppSettings.ActiveColor, AppSettings.ActiveOpacity, AppSettings.ActivePolygonMode, AppSettings.ActivePenWidth, AppSettings.ActiveDotSize); IGeometry selectionBuffer = _appState.SelectionManager.GetSelectionBuffer(); if (selectionBuffer != null) { Brush bufferBrush = new SolidBrush(Color.FromArgb(Convert.ToInt32(255 * AppSettings.BufferOpacity), AppSettings.BufferColor)); Pen bufferPen = AppSettings.BufferOutlineOpacity > 0 ? new Pen(new SolidBrush(Color.FromArgb(Convert.ToInt32(255 * AppSettings.BufferOutlineOpacity), AppSettings.BufferOutlineColor)), AppSettings.BufferOutlinePenWidth) : null; switch (selectionBuffer.OgcGeometryType) { case OgcGeometryType.Polygon: DrawPolygon(graphics, (IPolygon)selectionBuffer, bufferBrush, null, bufferPen); break; case OgcGeometryType.MultiPolygon: DrawMultiPolygon(graphics, (IMultiPolygon)selectionBuffer, bufferBrush, null, bufferPen); break; } } } graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; DrawMarkup(graphics); MemoryStream memoryStream = new MemoryStream(); if (imageType == CommonImageType.Jpg) { ImageCodecInfo imageCodecInfo = GetEncoderInfo("image/jpeg"); EncoderParameters encoderParameters = new EncoderParameters(1); encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 85L); bitmap.Save(memoryStream, imageCodecInfo, encoderParameters); } else { bitmap.Save(memoryStream, bitmap.RawFormat); } image = memoryStream.ToArray(); } return(new MapImageData(imageType, image)); }
private List <CommonLayer> GetLegendLayers() { StringCollection visibleLayers = null; if (_pixelSize > 0 && _appState.VisibleLayers.ContainsKey(_appState.MapTab)) { visibleLayers = _appState.VisibleLayers[_appState.MapTab]; } Configuration config = AppContext.GetConfiguration(); Configuration.MapTabRow mapTab = config.MapTab.FindByMapTabID(_appState.MapTab); CommonDataFrame dataFrame = AppContext.GetDataFrame(mapTab); List <CommonLayer> layerList = new List <CommonLayer>(); List <String> mapTabLayerIds = new List <String>(); foreach (Configuration.MapTabLayerRow mapTabLayer in mapTab.GetMapTabLayerRows()) { Configuration.LayerRow layer = mapTabLayer.LayerRow; mapTabLayerIds.Add(layer.LayerID); CommonLayer commonLayer = dataFrame.Layers.FirstOrDefault(lyr => String.Compare(lyr.Name, layer.LayerName, true) == 0); if (commonLayer.Type == CommonLayerType.Feature && !layerList.Contains(commonLayer)) { bool hasClasses = GetNumClasses(commonLayer) > 0; bool visibleAtScale = _pixelSize <= 0 || commonLayer.IsWithinScaleThresholds(_pixelSize); bool shownInLegend = !mapTabLayer.IsShowInLegendNull() && mapTabLayer.ShowInLegend == 1; bool checkedInLegend = mapTabLayer.IsCheckInLegendNull() || mapTabLayer.CheckInLegend < 0 || visibleLayers == null || visibleLayers.Contains(layer.LayerID); bool shownInPrintLegend = !(!mapTabLayer.IsShowInPrintLegendNull() && mapTabLayer.ShowInPrintLegend == 0); if (hasClasses && visibleAtScale && shownInLegend && checkedInLegend && shownInPrintLegend) { layerList.Add(commonLayer); while (commonLayer.Parent != null) { commonLayer = commonLayer.Parent; if (!layerList.Contains(commonLayer)) { layerList.Add(commonLayer); } } } } } if (!mapTab.IsBaseMapIDNull() && !mapTab.IsShowBaseMapInLegendNull() && mapTab.ShowBaseMapInLegend == 1) { foreach (Configuration.LayerRow layer in config.Layer.Where(o => !o.IsBaseMapIDNull() && o.BaseMapID == mapTab.BaseMapID)) { if (!mapTabLayerIds.Contains(layer.LayerID)) { CommonLayer commonLayer = dataFrame.Layers.FirstOrDefault(o => String.Compare(o.Name, layer.LayerName, true) == 0); if (commonLayer.Type == CommonLayerType.Feature && !layerList.Contains(commonLayer)) { bool hasClasses = GetNumClasses(commonLayer) > 0; bool visibleAtScale = _pixelSize <= 0 || commonLayer.IsWithinScaleThresholds(_pixelSize); if (hasClasses && visibleAtScale) { layerList.Add(commonLayer); while (commonLayer.Parent != null) { commonLayer = commonLayer.Parent; if (!layerList.Contains(commonLayer)) { layerList.Add(commonLayer); } } } } } } } return(layerList); }
public void Initialize(Configuration config, AppState appState, Configuration.ApplicationRow application) { foreach (Configuration.ApplicationMapTabRow appMapTabRow in application.GetApplicationMapTabRows()) { Configuration.MapTabRow mapTabRow = appMapTabRow.MapTabRow; CommonDataFrame dataFrame = AppContext.GetDataFrame(mapTabRow); bool isInteractive = !mapTabRow.IsInteractiveLegendNull() && mapTabRow.InteractiveLegend == 1; CheckMode checkMode = CheckMode.None; List <CommonLayer> configuredLayers = new List <CommonLayer>(); List <LayerProperties> layerProperties = new List <LayerProperties>(); List <String> mapTabLayerIds = new List <String>(); string name = null; string metaDataUrl = null; StringCollection visibleLayers = isInteractive ? appState.VisibleLayers[mapTabRow.MapTabID] : null; // find layers attached via MapTabLayer foreach (Configuration.MapTabLayerRow mapTabLayerRow in mapTabRow.GetMapTabLayerRows()) { if (!mapTabLayerRow.IsShowInLegendNull() && mapTabLayerRow.ShowInLegend == 1) { CommonLayer layer = dataFrame.Layers.FirstOrDefault(lyr => String.Compare(lyr.Name, mapTabLayerRow.LayerRow.LayerName, true) == 0); name = mapTabLayerRow.LayerRow.IsDisplayNameNull() ? mapTabLayerRow.LayerRow.LayerName : mapTabLayerRow.LayerRow.DisplayName; metaDataUrl = mapTabLayerRow.LayerRow.IsMetaDataURLNull() ? null : mapTabLayerRow.LayerRow.MetaDataURL; bool isExclusive = mapTabLayerRow.IsIsExclusiveNull() ? false : mapTabLayerRow.IsExclusive == 1; string tag = mapTabLayerRow.LayerID; mapTabLayerIds.Add(tag); if (isInteractive) { bool layerVisible = visibleLayers != null && visibleLayers.Contains(mapTabLayerRow.LayerID); checkMode = mapTabLayerRow.IsCheckInLegendNull() || mapTabLayerRow.CheckInLegend < 0 ? CheckMode.Empty : layerVisible ? CheckMode.Checked : CheckMode.Unchecked; } configuredLayers.Add(layer); layerProperties.Add(new LayerProperties(name, tag, checkMode, isExclusive, metaDataUrl)); } } // find layers attached via BaseMapID if (!mapTabRow.IsBaseMapIDNull() && !mapTabRow.IsShowBaseMapInLegendNull() && mapTabRow.ShowBaseMapInLegend == 1) { if (checkMode != CheckMode.None) { checkMode = CheckMode.Empty; } foreach (DataRow row in config.Layer.Select("BaseMapID = '" + mapTabRow.BaseMapID + "'")) { Configuration.LayerRow layerRow = (Configuration.LayerRow)row; if (!mapTabLayerIds.Contains(layerRow.LayerID)) { CommonLayer layer = dataFrame.Layers.FirstOrDefault(lyr => String.Compare(lyr.Name, layerRow.LayerName, true) == 0); metaDataUrl = layerRow.IsMetaDataURLNull() ? null : layerRow.MetaDataURL; configuredLayers.Add(layer); layerProperties.Add(new LayerProperties(layerRow.Name, null, checkMode, false, metaDataUrl)); } } } // add group layers as necessary for (int i = 0; i < configuredLayers.Count; ++i) { checkMode = !isInteractive ? CheckMode.None : layerProperties[i].CheckMode == CheckMode.Checked ? CheckMode.Checked : CheckMode.Unchecked; CommonLayer parent = configuredLayers[i].Parent; while (parent != null) { int index = configuredLayers.IndexOf(parent); if (index < 0) { configuredLayers.Add(parent); layerProperties.Add(new LayerProperties(parent.Name, null, checkMode, false, null)); } else { if (checkMode == CheckMode.Checked && layerProperties[index].CheckMode == CheckMode.Unchecked) { layerProperties[index].CheckMode = CheckMode.Checked; } } parent = parent.Parent; } } // create the top level legend control for this map tab HtmlGenericControl parentLegend = new HtmlGenericControl("div"); pnlLegendScroll.Controls.Add(parentLegend); parentLegend.Attributes["data-maptab"] = appMapTabRow.MapTabID; parentLegend.Attributes["class"] = "LegendTop"; parentLegend.Style["display"] = appMapTabRow.MapTabID == appState.MapTab ? "block" : "none"; // add the Legend controls for the configured layers foreach (CommonLayer layer in dataFrame.TopLevelLayers) { AddLayerToLegend(mapTabRow.MapTabID, configuredLayers, layerProperties, parentLegend, layer); } } }