User Tools

Site Tools


source_code_webedition_projecttemplates_usdemographicmap_cs.zip

Source Code WebEdition ProjectTemplates UsDemographicMap CS.zip

Default.aspx

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ThinkGeo.MapSuite.USDemographicMap._Default" %>  
 
 <%@ Register Assembly="WebEdition" Namespace="ThinkGeo.MapSuite.WebEdition" TagPrefix="cc1" %>  
 <!DOCTYPE html>  
 <html xml:en-us">  
 <head id="Head1" runat="server">  
     <title>US Demographic Map</title>  
     <meta charset="UTF-8">  
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />  
     <meta http-equiv="X-UA-Compatible" content="IE=Edge">  
     <link href="Images/MapSuite.ico" rel="shortcut icon" type="Images/x-icon" />  
     <link href="Styles/jquery-ui-1.10.4.custom.css" rel="stylesheet" type="text/css" />  
     <link href="Styles/bootstrap.min.css" rel="stylesheet" type="text/css" />  
     <link href="Styles/bootstrap-colorselector.css" rel="stylesheet" type="text/css" />  
     <link href="Styles/Site.css" rel="stylesheet" type="text/css" />  
     <script type="text/javascript" src="Scripts/modernizr-2.5.3.js"></script>  
     <script src="Scripts/jquery-1.10.2.js" type="text/javascript"></script>  
     <script src="Scripts/jquery-ui-1.10.4.custom.js" type="text/javascript"></script>  
 </head>  
 <body>  
     <form id="Form1" runat="server">  
     <asp:ScriptManager ID="ScriptManager1" runat="server">  
     </asp:ScriptManager>  
     <div id="container">  
         <div id="header">  
             <div id="left-header">  
                 <span id="header-mapsuite">Map Suite</span> <span id="header-title">US Demographic Map</span>  
             </div>  
         </div>  
         <div id="content-container">  
             <div id="leftContainer">  
                 <div id="leftContent">  
                     <h4>  
                         Select data for display:</h4>  
                     <div id="accordion">  
                         <asp:Repeater ID="rptCategoryList" runat="server" OnItemDataBound="rptCategoryList_ItemDataBound">  
                             <ItemTemplate>  
                                 <h3>  
                                     <img alt="Population" src='<%#Eval("CategoryImage") %>' />  
                                     <asp:Label ID="lbTitle" runat="server" CssClass="accordion-header" Text='<%#Eval("Title")%>'></asp:Label>  
                                     <input type="image" class="accordion-header-right" alt="Pie" title="Chart Map" src="Images/pie.png"  
                                         style="visibility: hidden;" />  
                                 </h3>  
                                 <div>  
                                     <ul>  
                                         <asp:Repeater ID="rptSubCategoryList" runat="server">  
                                             <ItemTemplate>  
                                                 <li><span class="accordion-content">  
                                                     <%#Eval("Alias") %></span>  
                                                     <input id="ckbSelected" class="accordion-content-right" type="checkbox" checked="checked"  
                                                         style="visibility: hidden; margin: 8px 10px 0 0;" />  
                                                     <img class="accordion-content-right" alt="DotDensity" title="Present the data with Dot Density." src="Images/DotDensity.png" />  
                                                     <img class="accordion-content-right" alt="Thematic" title="Present the data in Thematic Colors." src="Images/Thematic.png" />  
                                                     <img class="accordion-content-right" alt="ValueCircle" title="Present the data in Value Circles." src="Images/ValueCircle.png" />  
                                             </ItemTemplate>  
                                         </asp:Repeater>  
                                     </ul>  
                                 </div>  
                             </ItemTemplate>  
                         </asp:Repeater>  
                     </div>  
                     <div class="settings">  
                         <div class="settings">  
                             <span id="spanBaseColor" class="settingTitle">Display Start Color:</span>  
                             <select id="colorStartselector">  
                             </select>  
                         </div>  
                         <div id="divEndColor" class="settings">  
                             <span class="settingTitle">Display End Color:</span>  
                             <select id="colorEndselector">  
                             </select>  
                         </div>  
                         <div id="divColorWheel" class="settings">  
                             <span class="settingTitle">ColorWheelDirection:</span>  
                             <select id="slColorWheelDirection" class="settingItem">  
                                 <option value="Clockwise">Clockwise</option>  
                                 <option value="CounterClockwise" selected="selected">CounterClockwise</option>  
                             </select>  
                         </div>  
                     </div>  
                     <div id="divSlider" class="settings">  
                         <span id="spanSliderTitle" class="settingTitle"></span>  
                         <div id="slider" class="settingItem">  
                         </div>  
                     </div>  
                     <input type="hidden" id="clientStatusKeeper" value="" />  
                 </div>  
             </div>  
             <div id="toggle">  
                 <img alt="collapse" src="Images/collapse.gif" />  
             </div>  
             <div id="map-content">  
                 <cc1:Map ID="Map1" runat="server" Height="100%" Width="100%">  
                 </cc1:Map>  
             </div>  
         </div>  
         <div id="footer">  
             <span id="spanMouseCoordinate"></span>  
         </div>  
     </div>  
     <script type="text/javascript" src="Scripts/bootstrap.min.js"></script>  
     <script src="Scripts/bootstrap-colorselector.js" type="text/javascript"></script>  
     <script type="text/javascript" src="Scripts/ready-functions.js"></script>  
     </form>  
 </body>  
 </html>  
 
 

Default.aspx.cs

 using System;  
 using System.Collections.Generic;  
 using System.Collections.ObjectModel;  
 using System.Configuration;  
 using System.Globalization;  
 using System.Linq;  
 using System.Text;  
 using System.Web.UI;  
 using System.Web.UI.WebControls;  
 using System.Xml.Linq;  
 using ThinkGeo.MapSuite.Core;  
 using ThinkGeo.MapSuite.WebEdition;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public partial class _Default : System.Web.UI.Page, ICallbackEventHandler  
     {  
         private static Dictionary<string, Category> categories;  
         private string callbackResult;  
 
         protected void Page_Load(object sender, EventArgs e)  
         {  
             if (!IsPostBack)  
             {  
                 InitializeMapControl();  
 
                 categories = LoadCategories();  
                 rptCategoryList.DataSource = categories.Values;  
                 rptCategoryList.DataBind();  
 
                 Page.ClientScript.GetCallbackEventReference(this, "", "", "");  
             }  
         }  
 
         public string GetCallbackResult()  
         {  
             return callbackResult;  
         }  
 
         public void RaiseCallbackEvent(string eventArgument)  
         {  
             // Replace the "$=" with ">=", because the ">=" is not allowed in AJAX Content  
             if (eventArgument.Contains("$"))  
             {  
                 eventArgument = eventArgument.Replace("$", ">=");  
             }  
 
             JsonCallbackRequest callbackRequest = JSONSerializer.Deserialize<JsonCallbackRequest>(eventArgument);  
 
             switch (callbackRequest.Request.ToLowerInvariant())  
             {  
                 case "applystyle":  
                     callbackResult = UpdateMapAndLegend(callbackRequest).ToString();  
                     break;  
                 case "identify":  
                     callbackResult = GetIdentifiedFeatureInfo(callbackRequest);  
                     break;  
                 default:  
                     break;  
             }  
         }  
 
         private string GetIdentifiedFeatureInfo(JsonCallbackRequest callbackRequest)  
         {  
             // Get the requested sub-categories  
             Category selectedCategory = null;  
             Collection<CategoryItem> selectedCategoryItems = new Collection<CategoryItem>();  
             if (callbackRequest.StyleBuildType == DemographicStyleBuilderType.PieChart)  
             {  
                 selectedCategoryItems = GetCategoryItemByAlias(callbackRequest.SelectedCategoryItems, ref selectedCategory);  
             }  
             else  
             {  
                 selectedCategoryItems = GetCategoryItemByAlias(new Collection<string>() { callbackRequest.RequestColumnAlias }, ref selectedCategory);  
             }  
 
             // Get the selected columns  
             Collection<string> selectedColumns = new Collection<string>();  
             foreach (CategoryItem categoryItem in selectedCategoryItems)  
             {  
                 selectedColumns.Add(categoryItem.ColumnName);  
             }  
             selectedColumns.Add("Name");  
 
             // Find the identified feature with specified columns  
             ShapeFileFeatureLayer statesLayer = Map1.DynamicOverlay.Layers["usStatesLayer"] as ShapeFileFeatureLayer;  
             statesLayer.Open();  
             Feature identifiedFeature = statesLayer.FeatureSource.GetFeatureById(callbackRequest.SelectedFeatureId, selectedColumns);  
 
             // Format the inner-html of the popup  
             StringBuilder popupHtml = new StringBuilder("<table>");  
             popupHtml.Append(string.Format("<tr><td class='popupTitle'>{0}</td></tr>", identifiedFeature.ColumnValues["Name"]));  
             popupHtml.Append("<tr><td><div class='hrLine'></div></td></tr>");  
             for (int i = 0; i < selectedColumns.Count - 1; i++)  
             {  
                 string formatedString = DemographicStyleTextFormatter.GetFormatedString(selectedColumns[i], double.Parse(identifiedFeature.ColumnValues[selectedColumns[i]));  
                 popupHtml.Append(string.Format("<tr class='popupText'><td>{0}</td></tr>", formatedString));  
             }  
             popupHtml.Append("</table>");  
 
             return popupHtml.ToString();  
         }  
 
         private bool UpdateMapAndLegend(JsonCallbackRequest callbackRequest)  
         {  
             // Get the requested sub-categories  
             Category selectedCategory = null;  
             Collection<CategoryItem> selectedCategoryItems = new Collection<CategoryItem>();  
             if (callbackRequest.StyleBuildType == DemographicStyleBuilderType.PieChart)  
             {  
                 selectedCategoryItems = GetCategoryItemByAlias(callbackRequest.SelectedCategoryItems, ref selectedCategory);  
             }  
             else  
             {  
                 selectedCategoryItems = GetCategoryItemByAlias(new Collection<string>() { callbackRequest.RequestColumnAlias }, ref selectedCategory);  
             }  
 
             DemographicStyleBuilder demographicStyle = null;  
             switch (callbackRequest.StyleBuildType)  
             {  
                 case DemographicStyleBuilderType.PieChart:  
                     demographicStyle = new PieChartDemographicStyleBuilder();  
                     foreach (CategoryItem categoryItem in selectedCategoryItems)  
                     {  
                         ((PieChartDemographicStyleBuilder)demographicStyle).SelectedColumnAliases.Add(categoryItem.Alias);  
                     }  
                     if (!string.IsNullOrEmpty(callbackRequest.StartColor))  
                     {  
                         ((PieChartDemographicStyleBuilder)demographicStyle).Color = GeoColor.FromHtml(callbackRequest.StartColor);  
                     }  
                     break;  
                 case DemographicStyleBuilderType.Thematic:  
                     demographicStyle = new ThematicDemographicStyleBuilder();  
                     if (!string.IsNullOrEmpty(callbackRequest.StartColor))  
                     {  
                         ((ThematicDemographicStyleBuilder)demographicStyle).StartColor = GeoColor.FromHtml(callbackRequest.StartColor);  
                     }  
                     if (!string.IsNullOrEmpty(callbackRequest.EndColor))  
                     {  
                         ((ThematicDemographicStyleBuilder)demographicStyle).EndColor = GeoColor.FromHtml(callbackRequest.EndColor);  
                     }  
                     if (!string.IsNullOrEmpty(callbackRequest.ColorWheelDirection))  
                     {  
                         ((ThematicDemographicStyleBuilder)demographicStyle).ColorWheelDirection = callbackRequest.ColorWheelDirection.Equals("Clockwise") ? ColorWheelDirection.Clockwise : ColorWheelDirection.CounterClockwise;  
                     }  
                     break;  
                 case DemographicStyleBuilderType.DotDensity:  
                     demographicStyle = new DotDensityDemographicStyleBuilder();  
                     if (!string.IsNullOrEmpty(callbackRequest.StartColor))  
                     {  
                         ((DotDensityDemographicStyleBuilder)demographicStyle).Color = GeoColor.FromHtml(callbackRequest.StartColor);  
                     }  
                     if (callbackRequest.SliderValue > 0)  
                     {  
                         ((DotDensityDemographicStyleBuilder)demographicStyle).DotDensityValue = 50 * (callbackRequest.SliderValue / 3.0);  
                     }  
                     break;  
                 case DemographicStyleBuilderType.ValueCircle:  
                     demographicStyle = new ValueCircleDemographicStyleBuilder();  
                     if (!string.IsNullOrEmpty(callbackRequest.StartColor))  
                     {  
                         ((ValueCircleDemographicStyleBuilder)demographicStyle).Color = GeoColor.FromHtml(callbackRequest.StartColor);  
                     }  
                     if (callbackRequest.SliderValue > 0)  
                     {  
                         ((ValueCircleDemographicStyleBuilder)demographicStyle).RadiusRatio = callbackRequest.SliderValue / 3.0;  
                     }  
                     break;  
                 default:  
                     break;  
             }  
 
             foreach (CategoryItem categoryItem in selectedCategoryItems)  
             {  
                 demographicStyle.SelectedColumns.Add(categoryItem.ColumnName);  
             }  
 
             ShapeFileFeatureLayer statesLayer = Map1.DynamicOverlay.Layers["usStatesLayer"] as ShapeFileFeatureLayer;  
             statesLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Clear();  
             ThinkGeo.MapSuite.Core.Style selectedStyle = demographicStyle.GetStyle(statesLayer.FeatureSource);  
             statesLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(selectedStyle);  
             statesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;  
 
             Map1.DynamicOverlay.Redraw();  
 
             // update the legend based on the selected style  
             UpdateLegend(demographicStyle);  
 
             return true;  
         }  
 
         protected void rptCategoryList_ItemDataBound(object sender, RepeaterItemEventArgs e)  
         {  
             if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)  
             {  
                 Label categoryTitle = e.Item.FindControl("lbTitle") as Label;  
                 Category bindingCategory = categories[categoryTitle.Text];  
                 if (bindingCategory != null && bindingCategory.Items.Count > 0)  
                 {  
                     Repeater childRepeater = (Repeater)e.Item.FindControl("rptSubCategoryList");  
                     childRepeater.DataSource = bindingCategory.Items;  
                     childRepeater.DataBind();  
                 }  
                 else if (categoryTitle.Text.Equals("Custom Data", StringComparison.OrdinalIgnoreCase))  
                 {  
                     TextBox txtSelectedFile = e.Item.FindControl("txtSelectedFilePath") as TextBox;  
                     Button btnBrowse = e.Item.FindControl("btnBrowse") as Button;  
 
                     txtSelectedFile.Visible = true;  
                     btnBrowse.Visible = true;  
                 }  
             }  
         }  
 
         private Collection<CategoryItem> GetCategoryItemByAlias(Collection<string> requestAliases, ref Category queriedCategory)  
         {  
             Collection<CategoryItem> queriedItems = new Collection<CategoryItem>();  
             foreach (var category in categories)  
             {  
                 foreach (var item in category.Value.Items)  
                 {  
                     if (requestAliases.Contains(item.Alias))  
                     {  
                         queriedCategory = category.Value;  
                         queriedItems.Add(item);  
                     }  
                 }  
             }  
 
             return queriedItems;  
         }  
 
         private void UpdateLegend(DemographicStyleBuilder styleBuilder)  
         {  
             LegendAdornmentLayer legendAdornmentLayer = Map1.AdornmentOverlay.Layers[0] as LegendAdornmentLayer;  
             legendAdornmentLayer.LegendItems.Clear();  
 
             if (styleBuilder is ThematicDemographicStyleBuilder)  
             {  
                 AddThematicLegendItems(styleBuilder, legendAdornmentLayer);  
             }  
             else if (styleBuilder is DotDensityDemographicStyleBuilder)  
             {  
                 AddDotDensityLegendItems(styleBuilder, legendAdornmentLayer);  
             }  
             else if (styleBuilder is ValueCircleDemographicStyleBuilder)  
             {  
                 AddValueCircleLegendItems(styleBuilder, legendAdornmentLayer);  
             }  
             else if (styleBuilder is PieChartDemographicStyleBuilder)  
             {  
                 AddPieGraphLegendItems(styleBuilder, legendAdornmentLayer);  
             }  
 
             legendAdornmentLayer.ContentResizeMode = LegendContentResizeMode.Fixed;  
             legendAdornmentLayer.Height = GetLegendHeight(legendAdornmentLayer);  
             legendAdornmentLayer.Width = GetLegendWidth(legendAdornmentLayer);  
         }  
 
         private void AddPieGraphLegendItems(DemographicStyleBuilder styleBuilder, LegendAdornmentLayer legendAdornmentLayer)  
         {  
             ShapeFileFeatureLayer statesLayer = Map1.DynamicOverlay.Layers["usStatesLayer"] as ShapeFileFeatureLayer;  
             PieZedGraphStyle zedGraphStyle = (PieZedGraphStyle)styleBuilder.GetStyle(statesLayer.FeatureSource);  
 
             foreach (KeyValuePair<string, GeoColor> item in zedGraphStyle.PieSlices)  
             {  
                 LegendItem legendItem = new LegendItem();  
                 legendItem.ImageWidth = 20;  
                 legendItem.TextRightPadding = 5;  
                 legendItem.RightPadding = 5;  
                 legendItem.ImageStyle = new AreaStyle(new GeoSolidBrush(item.Value));  
                 legendItem.TextStyle = new TextStyle(item.Key, new GeoFont("Segoe UI", 10), new GeoSolidBrush(GeoColor.SimpleColors.Black));  
                 legendAdornmentLayer.LegendItems.Add(legendItem);  
             }  
         }  
 
         private void AddValueCircleLegendItems(DemographicStyleBuilder styleBuilder, LegendAdornmentLayer legendAdornmentLayer)  
         {  
             ShapeFileFeatureLayer statesLayer = Map1.DynamicOverlay.Layers["usStatesLayer"] as ShapeFileFeatureLayer;  
             ValueCircleStyle valueCircleStyle = (ValueCircleStyle)styleBuilder.GetStyle(statesLayer.FeatureSource);  
 
             int[] circleAreas = new int[] { 160, 320, 640, 1280 };  
             foreach (int circleArea in circleAreas)  
             {  
                 LegendItem legendItem = new LegendItem();  
                 double radius = Math.Sqrt(circleArea / Math.PI);  
                 legendItem.ImageStyle = new PointStyle(PointSymbolType.Circle, new GeoSolidBrush(valueCircleStyle.InnerColor), new GeoPen(new GeoSolidBrush(valueCircleStyle.OuterColor)), (int)(radius * 2));  
                 AreaStyle maskStyle = new AreaStyle(new GeoPen(GeoColor.StandardColors.LightGray, 1), new GeoSolidBrush(GeoColor.SimpleColors.Transparent));  
                 legendItem.ImageMask = maskStyle;  
                 legendItem.ImageWidth = 48;  
                 legendItem.TextTopPadding = 16;  
                 legendItem.TextRightPadding = 5;  
                 legendItem.BottomPadding = 16;  
                 legendItem.TopPadding = 16;  
                 legendItem.RightPadding = 5;  
 
                 double drawingRadius = circleArea / valueCircleStyle.DrawingRadiusRatio * valueCircleStyle.BasedScale / valueCircleStyle.DefaultZoomLevel.Scale;  
                 double ratio = (valueCircleStyle.MaxValidValue - valueCircleStyle.MinValidValue) / (valueCircleStyle.MaxCircleAreaInDefaultZoomLevel - valueCircleStyle.MinCircleAreaInDefaultZoomLevel);  
                 double resultValue = (drawingRadius - valueCircleStyle.MinCircleAreaInDefaultZoomLevel) * ratio + valueCircleStyle.MinValidValue;  
 
                 string text = DemographicStyleTextFormatter.GetFormatedStringForLegendItem(valueCircleStyle.ColumnName, resultValue);  
                 legendItem.TextStyle = new TextStyle(text, new GeoFont("Segoe UI", 10), new GeoSolidBrush(GeoColor.SimpleColors.Black));  
 
                 legendAdornmentLayer.LegendItems.Add(legendItem);  
             }  
         }  
 
         private void AddDotDensityLegendItems(DemographicStyleBuilder styleBuilder, LegendAdornmentLayer legendAdornmentLayer)  
         {  
             ShapeFileFeatureLayer statesLayer = Map1.DynamicOverlay.Layers["usStatesLayer"] as ShapeFileFeatureLayer;  
             CustomDotDensityStyle dotDensityStyle = (CustomDotDensityStyle)styleBuilder.GetStyle(statesLayer.FeatureSource);  
 
             int[] pointCounts = new int[] { 5, 10, 20, 50 };  
             foreach (int pointCount in pointCounts)  
             {  
                 LegendItem legendItem = new LegendItem();  
                 legendItem.ImageMask = new AreaStyle(new GeoPen(GeoColor.StandardColors.LightGray, 1), new GeoSolidBrush(GeoColor.SimpleColors.Transparent));  
                 legendItem.ImageWidth = 48;  
                 legendItem.TextTopPadding = 16;  
                 legendItem.TextRightPadding = 5;  
                 legendItem.BottomPadding = 16;  
                 legendItem.TopPadding = 16;  
                 legendItem.RightPadding = 5;  
                 CustomDotDensityStyle legendDotDensityStyle = (CustomDotDensityStyle)dotDensityStyle.CloneDeep();  
                 legendDotDensityStyle.DrawingPointsNumber = pointCount;  
                 legendItem.ImageStyle = legendDotDensityStyle;  
 
                 string text = string.Format(CultureInfo.InvariantCulture, "{0:0.####}", DemographicStyleTextFormatter.GetFormatedStringForLegendItem(dotDensityStyle.ColumnName, (pointCount / dotDensityStyle.PointToValueRatio)));  
                 legendItem.TextStyle = new TextStyle(text, new GeoFont("Segoe UI", 10), new GeoSolidBrush(GeoColor.SimpleColors.Black));  
 
                 legendAdornmentLayer.LegendItems.Add(legendItem);  
             }  
         }  
 
         private void AddThematicLegendItems(DemographicStyleBuilder styleBuilder, LegendAdornmentLayer legendAdornmentLayer)  
         {  
             ShapeFileFeatureLayer statesLayer = Map1.DynamicOverlay.Layers["usStatesLayer"] as ShapeFileFeatureLayer;  
             ClassBreakStyle thematicStyle = (ClassBreakStyle)styleBuilder.GetStyle(statesLayer.FeatureSource);  
 
             for (int i = 0; i < thematicStyle.ClassBreaks.Count; i++)  
             {  
                 LegendItem legendItem = new LegendItem();  
 
                 if (i < thematicStyle.ClassBreaks.Count)  
                 {  
                     legendItem.ImageStyle = thematicStyle.ClassBreaks[i].DefaultAreaStyle;  
                     legendItem.ImageWidth = 20;  
                     legendItem.TextRightPadding = 5;  
                     legendItem.RightPadding = 5;  
 
                     string text = string.Empty;  
                     if (i != thematicStyle.ClassBreaks.Count - 1)  
                     {  
                         text = string.Format("{0:#,0.####} ~ {1:#,0.####}",  
                             DemographicStyleTextFormatter.GetFormatedStringForLegendItem(thematicStyle.ColumnName, thematicStyle.ClassBreaks[i].Value),  
                             DemographicStyleTextFormatter.GetFormatedStringForLegendItem(thematicStyle.ColumnName, thematicStyle.ClassBreaks[i|+ 1].Value));  
                     }  
                     else  
                     {  
                         text = string.Format("> {0:#,0.####}",  
                             DemographicStyleTextFormatter.GetFormatedStringForLegendItem(thematicStyle.ColumnName, thematicStyle.ClassBreaks[i].Value));  
                     }  
                     legendItem.TextStyle = new TextStyle(text, new GeoFont("Segoe UI", 10), new GeoSolidBrush(GeoColor.SimpleColors.Black));  
                 }  
                 legendAdornmentLayer.LegendItems.Add(legendItem);  
             }  
         }  
 
         public float GetLegendWidth(LegendAdornmentLayer legendAdornmentLayer)  
         {  
             GdiPlusGeoCanvas gdiPlusGeoCanvas = new GdiPlusGeoCanvas();  
             LegendItem title = legendAdornmentLayer.Title;  
             float width = gdiPlusGeoCanvas.MeasureText(title.TextStyle.TextColumnName, new GeoFont("Segoe UI", 12)).Width  
                + title.ImageWidth + title.ImageRightPadding + title.ImageLeftPadding + title.TextRightPadding + title.TextLeftPadding + title.LeftPadding + title.RightPadding;  
 
             foreach (LegendItem legendItem in legendAdornmentLayer.LegendItems)  
             {  
                 float legendItemWidth = gdiPlusGeoCanvas.MeasureText(legendItem.TextStyle.TextColumnName, new GeoFont("Segoe UI", 10)).Width  
                     + legendItem.ImageWidth + legendItem.ImageRightPadding + legendItem.ImageLeftPadding + legendItem.TextRightPadding + legendItem.TextLeftPadding + legendItem.LeftPadding + legendItem.RightPadding;  
                 if (width < legendItemWidth)  
                 {  
                     width = legendItemWidth;  
                 }  
             }  
             return width;  
         }  
 
         public float GetLegendHeight(LegendAdornmentLayer legendAdornmentLayer)  
         {  
             GdiPlusGeoCanvas gdiPlusGeoCanvas = new GdiPlusGeoCanvas();  
             LegendItem title = legendAdornmentLayer.Title;  
             float legendHeight = Math.Max(gdiPlusGeoCanvas.MeasureText(title.TextStyle.TextColumnName, new GeoFont("Segoe UI", 12)).Height, title.ImageHeight);  
             legendHeight = Math.Max(legendHeight, title.Height);  
             float height = legendHeight + Math.Max(title.ImageTopPadding, title.TextTopPadding) + title.TopPadding + Math.Max(title.ImageBottomPadding, title.TextBottomPadding) + title.BottomPadding;  
 
             foreach (LegendItem legendItem in legendAdornmentLayer.LegendItems)  
             {  
                 float itemLegendHeight = Math.Max(gdiPlusGeoCanvas.MeasureText(legendItem.TextStyle.TextColumnName, new GeoFont("Segoe UI", 10)).Height, legendItem.ImageHeight);  
                 float itemHeight = itemLegendHeight + Math.Max(legendItem.ImageTopPadding, legendItem.TextTopPadding) + legendItem.TopPadding + Math.Max(legendItem.ImageBottomPadding, legendItem.TextBottomPadding) + legendItem.BottomPadding;  
 
                 height += itemHeight;  
             }  
             return height;  
         }  
 
         private void InitializeMapControl()  
         {  
             Map1.MapUnit = GeographyUnit.DecimalDegree;  
             Map1.MapTools.Logo.Enabled = true;  
             Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));  
             Map1.CurrentExtent = new RectangleShape(-128.17864375, 56.9286546875, -69.11614375, 20.1903734375);  
 
             // base map layers  
             WorldMapKitWmsWebOverlay worldMapKitOverlay = new WorldMapKitWmsWebOverlay();  
             Map1.CustomOverlays.Add(worldMapKitOverlay);  
 
             // us states layer  
             ShapeFileFeatureLayer statesLayer = new ShapeFileFeatureLayer(Server.MapPath(ConfigurationManager.AppSettings["UsShapefilePath"]));  
             ThematicDemographicStyleBuilder selectedStyle = new ThematicDemographicStyleBuilder(new Collection<string>() { "Population" });  
             statesLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(selectedStyle.GetStyle(statesLayer.FeatureSource));  
             statesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;  
             Map1.DynamicOverlay.Layers.Add("usStatesLayer", statesLayer);  
 
             // highlight layers  
             Map1.HighlightOverlay.HighlightStyle = new FeatureOverlayStyle(GeoColor.FromArgb(150, GeoColor.FromHtml("#449FBC")), GeoColor.FromHtml("#014576"), 1);  
             Map1.HighlightOverlay.Style = new FeatureOverlayStyle(GeoColor.SimpleColors.Transparent, GeoColor.SimpleColors.Transparent, 0);  
             statesLayer.Open();  
             foreach (Feature feature in statesLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.NoColumns))  
             {  
                 Map1.HighlightOverlay.Features.Add(feature.Id, feature);  
             }  
             statesLayer.Close();  
 
             // Add hover-popup  
             CloudPopup featureinfoPopup = new CloudPopup("featureInfoPopup", new PointShape(-300, -200), "State Info"); // make the popup out of map view temporarily  
             featureinfoPopup.AutoSize = true;  
             Map1.Popups.Add(featureinfoPopup);  
 
             // Add Legend adorment overlay  
             LegendAdornmentLayer legendAdornmentLayer = new LegendAdornmentLayer();  
             legendAdornmentLayer.Location = AdornmentLocation.LowerLeft;  
             legendAdornmentLayer.XOffsetInPixel = 15;  
             legendAdornmentLayer.Title = new LegendItem();  
             legendAdornmentLayer.Title.ImageJustificationMode = LegendImageJustificationMode.JustifyImageRight;  
             legendAdornmentLayer.Title.TopPadding = 10;  
             legendAdornmentLayer.Title.BottomPadding = 10;  
             legendAdornmentLayer.Title.TextStyle = new TextStyle("Population", new GeoFont("Segoe UI", 12), new GeoSolidBrush(GeoColor.SimpleColors.Black));  
             Map1.AdornmentOverlay.Layers.Add(legendAdornmentLayer);  
 
             ThematicDemographicStyleBuilder initDemographicStyle = new ThematicDemographicStyleBuilder(new Collection<string>() { "Population" });  
             UpdateLegend(initDemographicStyle);  
         }  
 
         private Dictionary<string, Category> LoadCategories()  
         {  
             var xDoc = XDocument.Load(Server.MapPath(ConfigurationManager.AppSettings["CategoryFilePath"]));  
             var elements = from category in xDoc.Element("DemographicMap").Elements("Category")  
                            select category;  
 
             Dictionary<string, Category> categories = new Dictionary<string, Category>();  
             foreach (var element in elements)  
             {  
                 Category category = new Category();  
                 category.Title = element.Attribute("name").Value;  
                 category.CategoryImage = element.Attribute("icon").Value;  
 
                 foreach (var item in element.Elements("item"))  
                 {  
                     CategoryItem categoryItem = new CategoryItem();  
                     categoryItem.ColumnName = item.Element("columnName").Value;  
                     categoryItem.Alias = item.Element("alias").Value;  
                     category.Items.Add(categoryItem);  
                 }  
 
                 categories.Add(category.Title, category);  
             }  
 
             return categories;  
         }  
     }  
 }  
 
 

ready-functions.js

 $(document).ready(function () {  
     initializePageElements();  
 
     // apply the selected style to server side  
     var applyStyleToServer = function (args) {  
         var argsInString = JSON.stringify(args);  
         $("#clientStatusKeeper").text(argsInString); // keep last request status  
         // Remove the not supported charactor in URL  
         if (argsInString.indexOf('>=') >= 0) {  
             argsInString = argsInString.replace('>=', '$');  
         }  
         $DoCallback(argsInString, function (result, context) {  
             MapHelper.getDynamicOverlay().redraw(true);  
             MapHelper.getAdormentOverlay().redraw(true);  
         }, this);  
     };  
 
     // Apply events to color picker  
     var updateMapColorSystem = function (sliderVal) {  
         var requestArgs = $("#clientStatusKeeper").text();  
         if ($.trim(requestArgs) != //) {  
             var args = $.parseJSON(requestArgs);  
             args["request"] = "applyStyle";  
             args["startColor"] = $('#colorStartselector').val();  
             args["endColor"] = $('#colorEndselector').val();  
             args["colorDirection"] = $('#slColorWheelDirection').val();  
             if (arguments.length > 0 && !isNaN(parseInt(sliderVal)))  
                 args["sliderValue"] = sliderVal;  
 
             applyStyleToServer(args);  
         }  
     }  
     $("#slColorWheelDirection").change(updateMapColorSystem);  
     $('#colorStartselector').colorselector({ callback: updateMapColorSystem });  
 
     // show pie button after actived  
     var refreshPieButton = function () {  
         var activeIndex = parseInt($("#accordion").accordion("option", "active"));  
         var accordionHeaders = $("#accordion h3");  
         var accordionContents = $('#accordion ul');  
         for (var i = 0; i < accordionHeaders.length; i++) {  
             var pieButton = $(accordionHeaders[i]).find("input")[0];  
             var categoryItems = $(accordionContents[i]).find("Span");  
             if (activeIndex == i && categoryItems.length > 1) {  
                 $(pieButton).css('visibility', 'visible');  
             } else {  
                 $(pieButton).css('visibility', 'hidden');  
             }  
         }  
     }  
     $("#accordion h3").click(refreshPieButton);  
     refreshPieButton();  
 
     // Change style and do redraw map  
     $("img[class='accordion-content-right']").click(function () {  
         var alias = $.trim($(this).parent().find(".accordion-content").text());  
         applyStyleToServer({ "request": "applyStyle", "style": this.alt, "alias": alias });  
         resetConfigurations(this.alt);  
 
         return false;  
     });  
 
     // attach checkbox changed event and redraw map  
     getActivePieButton = function () {  
         var activeIndex = parseInt($("#accordion").accordion("option", "active"));  
         return $("input[class='accordion-header-right'][type='image']")[activeIndex];  
     };  
     $("#accordion ul [type='checkbox']").change(function () {  
         var activeIndex = parseInt($("#accordion").accordion("option", "active"));  
         // get all the seleceted category items  
         var activeContent = $('#accordion ul')[activeIndex];  
         var checkboxes = $(activeContent).find("[type='checkbox']");  
         var selectedItems = new Array();  
         for (var i = 0; i < checkboxes.length; i++) {  
             if (checkboxes[i].checked) {  
                 var itemAlias = $(checkboxes[i]).parent().find("Span").text();  
                 selectedItems.push($.trim(itemAlias));  
             }  
         }  
 
         var pieButton = getActivePieButton();  
         if (selectedItems.length > 1) {  
             applyStyleToServer({ "request": "applyStyle", "style": "Pie", "selectedItems": selectedItems, "startColor": $('#colorStartselector').val() });  
             resetConfigurations("Pie");  
 
             $(pieButton).css('visibility', 'visible');  
         } else {  
             $(pieButton).css('visibility', 'hidden');  
         }  
         return false;  
     });  
 
     // Deal with pie button click event  
     $("input[class='accordion-header-right'][type='image']").click(function () {  
         // get all the seleceted category items  
         var activeIndex = parseInt($("#accordion").accordion("option", "active"));  
         var activeContent = $('#accordion ul')[activeIndex];  
         var checkboxes = $(activeContent).find("[type='checkbox']");  
         var selectedItems = new Array();  
         for (var i = 0; i < checkboxes.length; i++) {  
             if (checkboxes[i].checked) {  
                 var itemAlias = $(checkboxes[i]).parent().find("Span").text();  
                 selectedItems.push($.trim(itemAlias));  
                 $(checkboxes[i]).css("visibility", "visible");  
             }  
         }  
 
         applyStyleToServer({ "request": "applyStyle", "style": this.alt, "selectedItems": selectedItems, "startColor": $('#colorStartselector').val() });  
         resetConfigurations(this.alt);  
 
         return false;  
     });  
 
     // set default style as Population thematic  
     var activeContent = $('#accordion ul')[0];  
     var themeticButton = $(activeContent).find("img")[1];  
     $(themeticButton).trigger("click");  
 
     // Init slider bar  
     $("#slider").slider({  
         min: 1,  
         max: 5,  
         range: "min",  
         value: 3,  
         slide: function (event, ui) {  
             updateMapColorSystem(ui.value);  
         }  
     });  
 });  
 
 var MapHelper = {  
     getDynamicOverlay: function () {  
         var map = Map1.GetOpenLayersMap();  
         return map.getLayer("DynamicOverlay");  
     },  
     getAdormentOverlay: function () {  
         var adornmentOverlay = Map1.GetOpenLayersMap().getLayersByName("AdornmentOverlay");  
         return adornmentOverlay[0];  
     },  
     getPopup: function () {  
         var map = Map1.GetOpenLayersMap();  
         return map.getPopup("featureInfoPopup");  
     }  
 }  
 
 // All the codes before  creating map  
 var OnMapCreating = function (map) {  
     OpenLayers.Map.prototype.getPopup = function (id) {  
         var searched = null;  
         for (var i = 0; i < map.popups.length; i++) {  
             if (map.popups[i].id == id) {  
                 searched = map.popups[i];  
                 break;  
             }  
         }  
 
         return searched;  
     }  
 }  
 
 var popupDisplayTimer;  
 var OnMapCreated = function (map) {  
     // Show mouse coordinates on the page bottom  
     map.events.register("mousemove", map, function (e) {  
         var mouseCoordinate = this.getLonLatFromPixel(new OpenLayers.Pixel(e.clientX, e.clientY));  
         $("#spanMouseCoordinate").text("X:" + mouseCoordinate.lon.toFixed(6) + "  Y: " + mouseCoordinate.lat.toFixed(6));  
     })  
 
     // Initialize the hover-popup  
     var hightlightLayer = map.getLayer("HighlightOverlay");  
     hightlightLayer.events.register("mouseout", hightlightLayer, function (e) {  
         // Clear timer at first  
         window.clearTimeout(popupDisplayTimer);  
         MapHelper.getPopup().hide();  
     });  
     hightlightLayer.events.register("mouseover", hightlightLayer, function (e) {  
         var map = Map1.GetOpenLayersMap();  
         var lonlat = map.getLonLatFromPixel(new OpenLayers.Pixel(e.offsetX, e.offsetY));  
         var mouseCoordinate = new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat);  
         var selectedFeature = null;  
         for (var i = 0; i < hightlightLayer.features.length; i++) {  
             if (hightlightLayer.features[i].geometry.intersects(mouseCoordinate)) {  
                 selectedFeature = hightlightLayer.features[i];  
                 break;  
             }  
         }  
         // Clear timer at first  
         window.clearTimeout(popupDisplayTimer);  
 
         if (selectedFeature != null) {  
             var requestArgs = $("#clientStatusKeeper").text();  
             if ($.trim(requestArgs) != //) {  
                 var args = $.parseJSON(requestArgs);  
                 args["selectedFeatureId"] = selectedFeature.id;  
                 args['request'] = "identify";  
                 popupDisplayTimer = window.setTimeout(function () {  
                     $DoCallback(JSON.stringify(args), function (result, context) {  
                         var featureInfoPopup = MapHelper.getPopup();  
                         featureInfoPopup.setContentHTML(result);  
                         featureInfoPopup.lonlat = context;  
                         featureInfoPopup.updatePosition();  
                         featureInfoPopup.show();  
                     }, lonlat);  
                 }, 1000);  
             }  
         }  
     });  
 }  
 
 function initializePageElements() {  
     var resizeElementHeight = function () {  
         var documentheight = $(window).height();  
         var mapDivH = (documentheight - $("#header").height() - $("#footer").height() - 1) + "px";  
         $("#map-content").height(mapDivH);  
         $("#leftContainer").height(mapDivH);  
         $("#toggle").height(mapDivH);  
         $("#toggle").css("line-height", mapDivH);  
 
         // refresh the map.  
         Map1.GetOpenLayersMap().updateSize();  
     }  
 
     window.onload = resizeElementHeight();  
     $(window).resize(resizeElementHeight);  
 
     // init accordion tree  
     $("#accordion").accordion({  
         icons: null,  
         heightStyle: "content"  
     });  
     $("#accordion").accordion("option", "active", 0);  
 
     // init color picker and color direction  
     var initColorPicker = function (select) {  
         var colors = getHtmlKnownColors();  
         for (var item in colors) {  
             var option = new Option(item, colors[item]);  
             $(option).attr("data-color", colors[item]);  
             $(select).append(option);  
         }  
     }  
     initColorPicker($("#colorStartselector"));  
     initColorPicker($("#colorEndselector"));  
 
     // Bind toggle button events  
     $("#toggle img").bind("click", function () {  
         if ($("#leftContainer").is(':visible')) {  
             $(this).attr("src", "Images/expand.gif");  
             $("#map-content").css("width", "100%");  
             $("#toggle").css("left", "0%");  
             $("#leftContainer").hide();  
         }  
         else {  
             $("#leftContainer").show();  
             $(this).attr("src", "Images/collapse.gif")  
             $("#map-content").css("width", "80%");  
             $("#toggle").css("left", "20%");  
         }  
         resizeElementHeight();  
     });  
 }  
 
 function resetConfigurations(style) {  
     switch (style) {  
         case "Thematic":  
             $('#colorStartselector').colorselector("setColor", "#74a0ff");  
             $('#colorEndselector').colorselector("setColor", "#dc3438");  
             $("#spanBaseColor").text("Display Start Color:");  
             $("#divEndColor").show();  
             $("#divColorWheel").show();  
             $("#divSlider").hide();  
             break;  
         case "DotDensity":  
             $('#colorStartselector').colorselector("setColor", "#8B0000");  
             $("#spanBaseColor").text("Display Color:");  
             $("#divEndColor").hide();  
             $("#divColorWheel").hide();  
             $("#divSlider").show();  
             $("#spanSliderTitle").text("DotDensity Unit:");  
             break;  
         case "ValueCircle":  
             $('#colorStartselector').colorselector("setColor", "#ff7f00");  
             $("#spanBaseColor").text("Display Color:");  
             $("#divEndColor").hide();  
             $("#divColorWheel").hide();  
             $("#divSlider").show();  
             $("#spanSliderTitle").text("MAGNIFICATION:");  
             break;  
         default:  
             $("#divSlider").hide();  
             $("#divEndColor").hide();  
             $("#divColorWheel").hide();  
             $("#spanBaseColor").text("Display Color:");  
             $('#colorStartselector').colorselector("setColor", "#74a0ff");  
             break;  
     }  
 }  
 
 function $DoCallback(arg, callbackEvent, context) {  
     WebForm_DoCallback("__Page", arg, callbackEvent, context, null, false);  
 }  
 
 function getHtmlKnownColors() {  
     var colors = { "Balck": "#000000", "White": "#FFFFFF", "Aqua": "#00FFFF", "MidnightBlue": "#191970",  
         "DodgerBlue": "#1E90FF", "LightSeaGreen": "#20B2AA", "ForestGreen": "#228B22", "SeaGreen": "#2E8B57",  
         "DarkSlateGray": "#2F4F4F", "LimeGreen": "#32CD32", "MediumSeaGreen": "#3CB371", "Turquoise": "#40E0D0",  
         "SteelBlue": "#4682B4", "DarkSlateBlue": "#483D8B", "MediumTurquoise": "#48D1CC", "DarkOliveGreen": "#556B2F",  
         "CadetBlue": "#5F9EA0", "MediumAquaMarine": "#66CDAA", "DimGray": "#696969", "SlateBlue": "#6A5ACD",  
         "OliveDrab": "#6B8E23", "SlateGray": "#708090", "LightSlateGray": "#778899", "MediumSlateBlue": "#7B68EE",  
         "Aquamarine": "#7FFFD4", "Maroon": "#800000", "Olive": "#808000", "Gray": "#808080",  
         "SkyBlue": "#87CEEB", "BlueViolet": "#8A2BE2", "DarkRed": "#8B0000", "SaddleBrown": "#8B4513",  
         "DarkSeaGreen": "#8FBC8F", "LightGreen": "#90EE90", "MediumPurple": "#9370DB", "PaleGreen": "#98FB98",  
         "YellowGreen": "#9ACD32", "Sienna": "#A0522D", "DarkGray": "#A9A9A9", "LightBlue": "#74a0ff",  
         "GreenYellow": "#ADFF2F", "Yellow ": "#FFFF00", "PaleTurquoise": "#AFEEEE", "LightSteelBlue": "#B0C4DE",  
         "PowderBlue": "#B0E0E6", "FireBrick": "#B22222", "DarkGoldenRod": "#B8860B", "MediumOrchid": "#BA55D3",  
         "RosyBrown": "#BC8F8F", "DarkKhaki": "#BDB76B", "Silver": "#C0C0C0", "MediumVioletRed": "#C71585",  
         "IndianRed ": "#CD5C5C", "Peru": "#CD853F", "Chocolate": "#D2691E", "Tan": "#D2B48C", "LightGray": "#D3D3D3",  
         "Thistle": "#D8BFD8", "Orchid": "#DA70D6", "GoldenRod": "#DAA520", "PaleVioletRed": "#DB7093", "Red": "#FF0000",  
         "LightRed": "#dc3438", "Orange": "#ff7f00"  
     };  
     return colors;  
 }  
 

JsonCallbackRequest.cs

 using System.Collections.ObjectModel;  
 using System.Runtime.Serialization;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     [DataContract]  
     public class JsonCallbackRequest  
     {  
         private string request;  
         private string requestStyle;  
         private string requestColumnAlias;  
         private Collection<string> selectedCategoryItems;  
         private string startColor;  
         private string endColor;  
         private string colorWheelDirection;  
         private int sliderValue;  
         private string selectedFeatureId;  
 
         public JsonCallbackRequest()  
         {  
         }  
 
         [DataMember(Name|= "request")]  
         public string Request  
         {  
             get { return request; }  
             set { request = value; }  
         }  
 
         public DemographicStyleBuilderType StyleBuildType  
         {  
             get  
             {  
                 DemographicStyleBuilderType type = DemographicStyleBuilderType.Thematic;  
                 switch (requestStyle.ToLowerInvariant())  
                 {  
                     case "pie":  
                         type = DemographicStyleBuilderType.PieChart;  
                         break;  
                     case "thematic":  
                         type = DemographicStyleBuilderType.Thematic;  
                         break;  
                     case "dotdensity":  
                         type = DemographicStyleBuilderType.DotDensity;  
                         break;  
                     case "valuecircle":  
                         type = DemographicStyleBuilderType.ValueCircle;  
                         break;  
                 }  
                 return type;  
             }  
         }  
 
         [DataMember(Name|= "style")]  
         private string RequestStyle  
         {  
             get { return requestStyle; }  
             set { requestStyle = value; }  
         }  
 
         [DataMember(Name|= "alias")]  
         public string RequestColumnAlias  
         {  
             get { return requestColumnAlias; }  
             set { requestColumnAlias = value; }  
         }  
 
         [DataMember(Name|= "selectedItems")]  
         public Collection<string> SelectedCategoryItems  
         {  
             get { return selectedCategoryItems; }  
             internal set { selectedCategoryItems = value; }  
         }  
 
         [DataMember(Name|= "startColor")]  
         public string StartColor  
         {  
             get { return startColor; }  
             set { startColor = value; }  
         }  
 
         [DataMember(Name|= "endColor")]  
         public string EndColor  
         {  
             get { return endColor; }  
             set { endColor = value; }  
         }  
 
         [DataMember(Name|= "colorDirection")]  
         public string ColorWheelDirection  
         {  
             get { return colorWheelDirection; }  
             set { colorWheelDirection = value; }  
         }  
 
         [DataMember(Name|= "sliderValue")]  
         public int SliderValue  
         {  
             get { return sliderValue; }  
             set { sliderValue = value; }  
         }  
 
         [DataMember(Name|= "selectedFeatureId")]  
         public string SelectedFeatureId  
         {  
             get { return selectedFeatureId; }  
             set { selectedFeatureId = value; }  
         }  
     }  
 }  
 

UsDemographicMap.cs

 using System.Collections.ObjectModel;  
 using System.Web.UI;  
 using ThinkGeo.MapSuite.Core;  
 using ThinkGeo.MapSuite.WebEdition;  
 using System.Configuration;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public class UsDemographicMap  
     {  
         private Map mapControl;  
         private Page mainPage;  
         private ShapeFileFeatureLayer statesLayer;  
         private ThematicDemographicStyle selectedStyle;  
 
         private UsDemographicMap()  
         { }  
 
         public UsDemographicMap(Map map, Page page)  
         {  
             this.mapControl = map;  
             this.mainPage = page;  
         }  
 
         public Map MapControl  
         {  
             get { return mapControl; }  
         }  
 
         public Page MainPage  
         {  
             get { return mainPage; }  
         }  
 
         public ShapeFileFeatureLayer StatesLayer  
         {  
             get { return statesLayer; }  
         }  
 
         public ThematicDemographicStyle SelectedStyle  
         {  
             get { return selectedStyle; }  
             set { selectedStyle = value; }  
         }  
 
         public void Initialize()  
         {  
             MapControl.MapUnit = GeographyUnit.DecimalDegree;  
             MapControl.MapTools.Logo.Enabled = true;  
             MapControl.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));  
             MapControl.CurrentExtent = new RectangleShape(-128.17864375, 56.9286546875, -69.11614375, 20.1903734375);  
 
             // Display base-map  
             WorldMapKitWmsWebOverlay worldMapKitOverlay = new WorldMapKitWmsWebOverlay();  
             MapControl.CustomOverlays.Add(worldMapKitOverlay);  
 
             // Display US states with selected style  
             statesLayer = new ShapeFileFeatureLayer(MainPage.Server.MapPath(ConfigurationManager.AppSettings["UsShapefilePath"]));  
 
             statesLayer.Open();  
             Collection<string> basedColumns = new Collection<string>() { "Pop" };  
             SelectedStyle = new ThematicDemographicStyle(basedColumns);  
 
             statesLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(SelectedStyle.GetStyle(statesLayer.FeatureSource));  
             statesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;  
             MapControl.DynamicOverlay.Layers.Add("usStatesLayer", statesLayer);  
 
             // Display highlight overlay  
             statesLayer.Open();  
             MapControl.HighlightOverlay.HighlightStyle = new FeatureOverlayStyle(GeoColor.FromArgb(100, GeoColor.StandardColors.LightBlue), GeoColor.StandardColors.White, 1);  
             MapControl.HighlightOverlay.Style = new FeatureOverlayStyle(GeoColor.SimpleColors.Transparent, GeoColor.SimpleColors.Transparent, 0);  
             foreach (Feature feature in statesLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.NoColumns))  
             {  
                 MapControl.HighlightOverlay.Features.Add(feature.Id, feature);  
             }  
             statesLayer.Close();  
         }  
     }  
 }  
 

CustomDotDensityStyle.cs

 using System;  
 using System.Collections.ObjectModel;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     [Serializable]  
     class CustomDotDensityStyle : DotDensityStyle  
     {  
         private int drawingPointsNumber;  
 
         public CustomDotDensityStyle()  
             : base()  
         { }  
 
         public int DrawingPointsNumber  
         {  
             get { return drawingPointsNumber; }  
             set { drawingPointsNumber = value; }  
         }  
 
         protected override void DrawSampleCore(GeoCanvas canvas, DrawingRectangleF drawingExtent)  
         {  
             base.DrawSampleCore(canvas, drawingExtent);  
             PointShape upperLeftPoint = ExtentHelper.ToWorldCoordinate(canvas.CurrentWorldExtent, drawingExtent.CenterX - drawingExtent.Width / 2, drawingExtent.CenterY - drawingExtent.Height / 2, canvas.Width, canvas.Height);  
             PointShape lowerRightPoint = ExtentHelper.ToWorldCoordinate(canvas.CurrentWorldExtent, drawingExtent.CenterX + drawingExtent.Width / 2, drawingExtent.CenterY + drawingExtent.Height / 2, canvas.Width, canvas.Height);  
             RectangleShape rectangle = new RectangleShape(upperLeftPoint, lowerRightPoint);  
             rectangle.ScaleDown(10);  
 
             // Here draw the points on Legend Image  
             Random random = new Random(DateTime.Now.Millisecond);  
             Collection<BaseShape> drawingPoints = new Collection<BaseShape>();  
             for (int i = 0; i < DrawingPointsNumber; i++)  
             {  
                 double x = rectangle.LowerLeftPoint.X + random.NextDouble() * (rectangle.Width);  
                 double y = rectangle.LowerLeftPoint.Y + random.NextDouble() * (rectangle.Height);  
                 drawingPoints.Add(new PointShape(x, y));  
             }  
             TextStyle textStyle = new TextStyle(DrawingPointsNumber.ToString(), new GeoFont("Arial", 20, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.FromArgb(180, GeoColor.FromHtml("#d3d3d3"))));  
             textStyle.DrawSample(canvas, drawingExtent);  
             CustomPointStyle.Draw(drawingPoints, canvas, new Collection<SimpleCandidate>(), new Collection<SimpleCandidate>());  
         }  
     }  
 }  
 

DemographicStyleBuilder.cs

 using System.Collections.Generic;  
 using System.Collections.ObjectModel;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public abstract class DemographicStyleBuilder  
     {  
         private GeoColor color;  
         private int opacity;  
         private Collection<string> selectedColumns;  
 
         protected DemographicStyleBuilder()  
             : this(new Collection<string>())  
         { }  
 
         protected DemographicStyleBuilder(IEnumerable<string> selectedColumns)  
         {  
             this.Opacity = 100;  
             this.color = GeoColor.FromHtml("#f1f369");  
             this.selectedColumns = new Collection<string>(new List<string>(selectedColumns));  
         }  
 
         public Collection<string> SelectedColumns  
         {  
             get { return selectedColumns; }  
         }  
 
         public GeoColor Color  
         {  
             get { return color; }  
             set { color = value; }  
         }  
 
         public int Opacity  
         {  
             get { return opacity; }  
             set { opacity = value; }  
         }  
 
         public Style GetStyle(FeatureSource featureSource)  
         {  
             return GetStyleCore(featureSource);  
         }  
 
         protected abstract Style GetStyleCore(FeatureSource featureSource);  
     }  
 }  
 

DemographicStyleBuilderType.cs

 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public enum DemographicStyleBuilderType  
     {  
         Thematic = 0,  
         ValueCircle = 1,  
         DotDensity = 2,  
         PieChart = 3  
     }  
 }  
 

DemographicStyleTextFormatter.cs

 using System;  
 using System.Globalization;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public static class DemographicStyleTextFormatter  
     {  
         public static string GetFormatedStringForLegendItem(string columnName, double value)  
         {  
             string aliasUnitString = GetFormatedString(columnName, value);  
             string[] subStrings = aliasUnitString.Split(new string[] { ": " }, StringSplitOptions.None);  
 
             if (subStrings[subStrings.Length|- 1].Contains("%"))  
             {  
                 aliasUnitString = subStrings[subStrings.Length|- 1];  
             }  
             else  
             {  
                 aliasUnitString = value.ToString("N0", CultureInfo.InvariantCulture);  
             }  
 
             return aliasUnitString;  
         }  
 
         public static string GetFormatedString(string columnName, double value)  
         {  
             string result = string.Empty;  
             switch (columnName)  
             {  
                 case "Population":  
                     result = string.Format("Population : {0} People", value.ToString("N0", CultureInfo.InvariantCulture));  
                     break;  
                 case "PopDensity":  
                     result = string.Format("Population Density : {0} People/sq.mi.", value.ToString("N0", CultureInfo.InvariantCulture));  
                     break;  
                 case "Female":  
                     result = string.Format("Female : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "Male":  
                     result = string.Format("Male : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "AREALAND":  
                     result = string.Format("Land Area : {0} sq.mi.", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "AREAWATR":  
                     result = string.Format("Water Area : {0} sq.mi.", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "White":  
                     result = string.Format("White : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "Black":  
                     result = string.Format("Black : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "Indian":  
                     result = string.Format("American Indian : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "Islander":  
                     result = string.Format("Native Pacific Islander : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "Asian":  
                     result = string.Format("Asian : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "Other":  
                     result = string.Format("Other : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "MultiRace":  
                     result = string.Format("Multiracial : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "Under5":  
                     result = string.Format("<= 5 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "5to9":  
                     result = string.Format("5 ~ 10 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "10to14":  
                     result = string.Format("10 ~ 15 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "15to17":  
                     result = string.Format("15 ~ 18 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "18to24":  
                     result = string.Format("18 ~ 25 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "25to34":  
                     result = string.Format("25 ~ 35 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "35to44":  
                     result = string.Format("35 ~ 45 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "45to54":  
                     result = string.Format("45 ~ 55 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "55to64":  
                     result = string.Format("55 ~ 65 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "65to74":  
                     result = string.Format("65 ~ 75 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "75to84":  
                     result = string.Format("75 ~ 85 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 case "over85":  
                     result = string.Format(">= 85 : {0}%", value.ToString("N2", CultureInfo.InvariantCulture));  
                     break;  
                 default:  
                     result = columnName + " : " + value.ToString("N0", CultureInfo.InvariantCulture);  
                     break;  
             }  
 
             return result;  
         }  
     }  
 }  
 

DotDensityDemographicStyleBuilder.cs

 using System.Collections.Generic;  
 using System.Globalization;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public class DotDensityDemographicStyleBuilder : DemographicStyleBuilder  
     {  
         private double dotDensityValue;  
 
         public DotDensityDemographicStyleBuilder()  
             : this(new string[] { })  
         { }  
 
         public DotDensityDemographicStyleBuilder(IEnumerable<string> selectedColumns)  
             : base(selectedColumns)  
         {  
             this.Opacity = 255;  
             this.DotDensityValue = 50;  
             this.Color = GeoColor.SimpleColors.DarkRed;  
         }  
 
         public double DotDensityValue  
         {  
             get { return dotDensityValue; }  
             set { dotDensityValue = value; }  
         }  
 
         protected override Style GetStyleCore(FeatureSource featureSource)  
         {  
             double totalValue = 0;  
             featureSource.Open();  
             int featureCount = featureSource.GetCount();  
             for (int i = 0; i < featureCount; i++)  
             {  
                 Feature feature = featureSource.GetFeatureById((i + 1).ToString(CultureInfo.InvariantCulture), SelectedColumns);  
                 double columnValue;  
                 double.TryParse(feature.ColumnValues[SelectedColumns[0], out columnValue);  
                 totalValue += columnValue;  
             }  
             featureSource.Close();  
             double pointToValueRatio = DotDensityValue / (totalValue / featureCount);  
 
             CustomDotDensityStyle dotDensityStyle = new CustomDotDensityStyle();  
             dotDensityStyle.ColumnName = SelectedColumns[0];  
             dotDensityStyle.PointToValueRatio = pointToValueRatio;  
             dotDensityStyle.CustomPointStyle = new PointStyle(PointSymbolType.Circle, new GeoSolidBrush(GeoColor.FromArgb(Opacity, Color)), 4);  
 
             return dotDensityStyle;  
         }  
     }  
 }  
 

PieChartDemographicStyleBuilder.cs

 using System;  
 using System.Collections.Generic;  
 using System.Collections.ObjectModel;  
 using System.Drawing;  
 using ThinkGeo.MapSuite.Core;  
 using ZedGraph;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public class PieChartDemographicStyleBuilder : DemographicStyleBuilder  
     {  
         private Collection<string> selectedColumnAliases;  
         private Collection<GeoColor> pieColors;  
 
         public PieChartDemographicStyleBuilder()  
             : base()  
         { }  
 
         public PieChartDemographicStyleBuilder(IEnumerable<string> selectedColumns)  
             : base(selectedColumns)  
         {  
             this.Opacity = 200;  
             this.Color = GeoColor.SimpleColors.LightBlue;  
         }  
 
         public Collection<string> SelectedColumnAliases  
         {  
             get  
             {  
                 if (selectedColumnAliases == null)  
                 {  
                     selectedColumnAliases = new Collection<string>();  
                 }  
                 return selectedColumnAliases;  
             }  
         }  
 
         protected override Style GetStyleCore(FeatureSource featureSource)  
         {  
             PieZedGraphStyle zedGraphStyle = new PieZedGraphStyle();  
             zedGraphStyle.ZedGraphDrawing += new EventHandler<ZedGraphDrawingEventArgs>(zedGraphStyle_ZedGraphDrawing);  
             pieColors = GeoColor.GetColorsInQualityFamily(GeoColor.FromArgb(Opacity, Color), SelectedColumns.Count);  
             for (int i = 0; i < SelectedColumns.Count; i++)  
             {  
                 zedGraphStyle.RequiredColumnNames.Add(SelectedColumns[i]);  
                 zedGraphStyle.PieSlices.Add(SelectedColumnAliases[i], pieColors[i]);  
             }  
 
             return zedGraphStyle;  
         }  
 
         void zedGraphStyle_ZedGraphDrawing(object sender, ZedGraphDrawingEventArgs e)  
         {  
             ZedGraphControl zedGraph = new ZedGraphControl();  
             zedGraph.Size = new Size(100, 100);  
 
             zedGraph.GraphPane.Fill.Type = FillType.None;  
             zedGraph.GraphPane.Chart.Fill.Type = FillType.None;  
 
             zedGraph.GraphPane.Border.IsVisible = false;  
             zedGraph.GraphPane.Chart.Border.IsVisible = false;  
             zedGraph.GraphPane.XAxis.IsVisible = false;  
             zedGraph.GraphPane.YAxis.IsVisible = false;  
             zedGraph.GraphPane.Legend.IsVisible = false;  
             zedGraph.GraphPane.Title.IsVisible = false;  
 
             for (int i = 0; i < SelectedColumns.Count; i++)  
             {  
                 Color color = System.Drawing.Color.FromArgb(pieColors[i].AlphaComponent, pieColors[i].RedComponent, pieColors[i].GreenComponent, pieColors[i].BlueComponent);  
                 PieItem pieItem = zedGraph.GraphPane.AddPieSlice(Convert.ToDouble(e.Feature.ColumnValues[SelectedColumns[i]), color, 0.08, "");  
                 pieItem.LabelDetail.IsVisible = false;  
             }  
             zedGraph.AxisChange();  
 
             e.Bitmap = zedGraph.GraphPane.GetImage();  
         }  
     }  
 }  
 

PieZedGraphStyle.cs

 using System.Collections.Generic;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public class PieZedGraphStyle : ZedGraphStyle  
     {  
         private Dictionary<string, GeoColor> pieSlices;  
 
         public PieZedGraphStyle()  
             : base()  
         { }  
 
         public Dictionary<string, GeoColor> PieSlices  
         {  
             get  
             {  
                 if (pieSlices == null)  
                 {  
                     pieSlices = new Dictionary<string, GeoColor>();  
                 }  
                 return pieSlices;  
             }  
         }  
     }  
 }  
 

ThematicDemographicStyleBuilder.cs

 using System.Collections.Generic;  
 using System.Collections.ObjectModel;  
 using System.Globalization;  
 using System.Linq;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public class ThematicDemographicStyleBuilder : DemographicStyleBuilder  
     {  
         private int classBreakCount;  
         private GeoColor endColor;  
         private ColorWheelDirection colorWheelDirection;  
 
         public ThematicDemographicStyleBuilder()  
             : this(new string[] { })  
         { }  
 
         public ThematicDemographicStyleBuilder(IEnumerable<string> selectedColumns)  
             : base(selectedColumns)  
         {  
             this.ClassBreaksCount = 10;  
             this.Color = GeoColor.SimpleColors.LightBlue;  
             this.EndColor = GeoColor.SimpleColors.LightRed;  
             this.ColorWheelDirection = ColorWheelDirection.CounterClockwise;  
             this.Opacity = 200;  
         }  
 
         public int ClassBreaksCount  
         {  
             get { return classBreakCount; }  
             set { classBreakCount = value; }  
         }  
 
         public ColorWheelDirection ColorWheelDirection  
         {  
             get { return colorWheelDirection; }  
             set { colorWheelDirection = value; }  
         }  
 
         public GeoColor StartColor  
         {  
             get { return Color; }  
             set { Color = value; }  
         }  
 
         public GeoColor EndColor  
         {  
             get { return endColor; }  
             set { endColor = value; }  
         }  
 
         protected override Style GetStyleCore(FeatureSource featureSource)  
         {  
             Collection<GeoColor> familyColors = GeoColor.GetColorsInQualityFamily(Color, EndColor, classBreakCount, ColorWheelDirection);  
 
             featureSource.Open();  
             int featureCount = featureSource.GetCount();  
             double[] values = new double[featureCount];  
             for (int i = 0; i < featureCount; i++)  
             {  
                 Feature feature = featureSource.GetFeatureById((i + 1).ToString(CultureInfo.InvariantCulture), SelectedColumns);  
                 double columnValue;  
                 double.TryParse(feature.ColumnValues[SelectedColumns[0], out columnValue);  
                 values[i] = columnValue;  
             }  
             featureSource.Close();  
 
             ClassBreakStyle classBreakStyle = new ClassBreakStyle(SelectedColumns[0]) { BreakValueInclusion = BreakValueInclusion.IncludeValue };  
             double[] classBreakValues = GetClusterClassBreaks(values, ClassBreaksCount - 1);  
             for (int i = 0; i < classBreakValues.Length; i++)  
             {  
                 ClassBreak classBreak = new ClassBreak(classBreakValues[i], AreaStyles.CreateSimpleAreaStyle(new GeoColor(this.Opacity, familyColors[i]), GeoColor.FromHtml("#f05133"), 1));  
                 classBreakStyle.ClassBreaks.Add(classBreak);  
             }  
 
             return classBreakStyle;  
         }  
 
         private double[] GetClusterClassBreaks(double[] values, int count)  
         {  
             var result = new List<double>();  
 
             var orderedValues = values.OrderBy(v => v).ToArray();  
             var min = orderedValues[0];  
             var max = orderedValues[orderedValues.Length|- 1];  
 
             var classesCount = (int)(orderedValues.Length / count);  
             var breakValue = min;  
 
             for (var i = 1; i < count; i++)  
             {  
                 breakValue = orderedValues[i|* classesCount];  
                 if (!result.Contains(breakValue))  
                 {  
                     result.Add(breakValue);  
                 }  
             }  
             result.Insert(0, 0);  
 
             return result.ToArray();  
         }  
     }  
 }  
 

ValueCircleDemographicStyleBuilder.cs

 using System.Collections.Generic;  
 using System.Globalization;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public class ValueCircleDemographicStyleBuilder : DemographicStyleBuilder  
     {  
         private double radiusRatio;  
 
         public ValueCircleDemographicStyleBuilder()  
             : this(new string[] { })  
         { }  
 
         public ValueCircleDemographicStyleBuilder(IEnumerable<string> selectedColumns)  
             : base(selectedColumns)  
         {  
             this.radiusRatio = 1;  
             this.Color = GeoColor.SimpleColors.BrightOrange;  
             this.Opacity = 160;  
         }  
 
         public double RadiusRatio  
         {  
             get { return radiusRatio; }  
             set { radiusRatio = value; }  
         }  
 
         protected override Style GetStyleCore(FeatureSource featureSource)  
         {  
             double minValue = double.MaxValue;  
             double maxValue = double.MinValue;  
 
             featureSource.Open();  
             for (int i = 0; i < featureSource.GetCount(); i++)  
             {  
                 Feature feature = featureSource.GetFeatureById((i + 1).ToString(CultureInfo.InvariantCulture), SelectedColumns);  
                 double columnValue;  
                 if (double.TryParse(feature.ColumnValues[SelectedColumns[0], out columnValue))  
                 {  
                     if (columnValue < minValue)  
                     {  
                         minValue = columnValue;  
                     }  
                     else if (columnValue > maxValue)  
                     {  
                         maxValue = columnValue;  
                     }  
                 }  
             }  
             featureSource.Close();  
 
             ValueCircleStyle valueCircleStyle = new ValueCircleStyle();  
             valueCircleStyle.ColumnName = SelectedColumns[0];  
             valueCircleStyle.DrawingRadiusRatio = radiusRatio;  
             valueCircleStyle.MinValidValue = minValue;  
             valueCircleStyle.MaxValidValue = maxValue;  
             valueCircleStyle.MinCircleAreaInDefaultZoomLevel = 80;  
             valueCircleStyle.MaxCircleAreaInDefaultZoomLevel = 10000;  
             valueCircleStyle.InnerColor = GeoColor.FromArgb(this.Opacity, Color);  
             valueCircleStyle.OuterColor = GeoColor.SimpleColors.White;  
 
             return valueCircleStyle;  
         }  
     }  
 }  
 

ValueCircleStyle.cs

 using System;  
 using System.Collections.Generic;  
 using System.Collections.ObjectModel;  
 using ThinkGeo.MapSuite.Core;  
 
 namespace ThinkGeo.MapSuite.USDemographicMap  
 {  
     public class ValueCircleStyle : Style  
     {  
         private string columnName;  
         private ZoomLevel defaultZoomLevel;  
         private double drawingRadiusRatio;  
         private GeoColor innerColor;  
         private double maxCircleRadiusInDefaultZoomLevel;  
         private double maxValidValue;  
         private double minCircleRadiusInDefaultZoomLevel;  
         private double minValidValue;  
         private GeoColor outerColor;  
 
         private double basedScale;  
 
         public ValueCircleStyle()  
             : base()  
         {  
             defaultZoomLevel = (new ZoomLevelSet()).ZoomLevel04;  
             drawingRadiusRatio = 1;  
             outerColor = GeoColor.FromArgb(255, 10, 20, 255);  
             innerColor = GeoColor.FromArgb(100, 10, 20, 255);  
             minCircleRadiusInDefaultZoomLevel = 10;  
             maxCircleRadiusInDefaultZoomLevel = 100;  
             basedScale = (new ZoomLevelSet()).ZoomLevel05.Scale;  
         }  
 
         public string ColumnName  
         {  
             get { return columnName; }  
             set { columnName = value; }  
         }  
 
         public ZoomLevel DefaultZoomLevel  
         {  
             get { return defaultZoomLevel; }  
             set { defaultZoomLevel = value; }  
         }  
 
         public double DrawingRadiusRatio  
         {  
             get { return drawingRadiusRatio; }  
             set { drawingRadiusRatio = value; }  
         }  
 
         public GeoColor InnerColor  
         {  
             get { return innerColor; }  
             set { innerColor = value; }  
         }  
 
         public double MaxCircleAreaInDefaultZoomLevel  
         {  
             get { return maxCircleRadiusInDefaultZoomLevel; }  
             set { maxCircleRadiusInDefaultZoomLevel = value; }  
         }  
 
         public double MaxValidValue  
         {  
             get { return maxValidValue; }  
             set { maxValidValue = value; }  
         }  
 
         public double MinCircleAreaInDefaultZoomLevel  
         {  
             get { return minCircleRadiusInDefaultZoomLevel; }  
             set { minCircleRadiusInDefaultZoomLevel = value; }  
         }  
 
         public double MinValidValue  
         {  
             get { return minValidValue; }  
             set { minValidValue = value; }  
         }  
 
         public GeoColor OuterColor  
         {  
             get { return outerColor; }  
             set { outerColor = value; }  
         }  
 
         public double BasedScale  
         {  
             get { return basedScale; }  
         }  
 
         protected override void DrawCore(IEnumerable<Feature> features, GeoCanvas canvas, Collection<SimpleCandidate> labelsInThisLayer, Collection<SimpleCandidate> labelsInAllLayers)  
         {  
             double dCircleArea = maxCircleRadiusInDefaultZoomLevel - MinCircleAreaInDefaultZoomLevel;  
             double dValue = maxValidValue - minValidValue;  
             double ratio = dValue / dCircleArea;  
 
             foreach (Feature f in features)  
             {  
                 PointShape center = f.GetShape().GetCenterPoint();  
                 double value = 0;  
                 if (!double.TryParse(f.ColumnValues[columnName], out value))  
                 {  
                     continue;  
                 }  
 
                 if (value > maxValidValue || value < minValidValue)  
                 {  
                     continue;  
                 }  
 
                 double drawingDefaultCircleArea = (value - minValidValue) / ratio + minCircleRadiusInDefaultZoomLevel;  
 
                 double defaultScale = defaultZoomLevel.Scale;  
                 double scale = canvas.CurrentScale;  
                 double graphArea = 0, graphHeght = 0;  
                 graphArea = drawingDefaultCircleArea * defaultScale / basedScale * drawingRadiusRatio;  
 
                 graphHeght = Math.Sqrt(graphArea / Math.PI);  
 
                 canvas.DrawEllipse(center, (float)(graphHeght * 2), (float)(graphHeght * 2), new GeoPen(outerColor, 1), new GeoSolidBrush(innerColor), DrawingLevel.LevelOne);  
             }  
         }  
 
         protected override Collection<string> GetRequiredColumnNamesCore()  
         {  
             Collection<string> requiredFieldNames = new Collection<string>();  
             requiredFieldNames.Add(columnName);  
 
             return requiredFieldNames;  
         }  
     }  
 }  
 
source_code_webedition_projecttemplates_usdemographicmap_cs.zip.txt · Last modified: 2015/09/08 10:25 by admin