ThematicLayerControl.xaml.cs
上传用户:huazai0421
上传日期:2008-05-30
资源大小:405k
文件大小:9k
源码类别:

SilverLight

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Media;
  7. using ESRI.ArcGIS.Client;
  8. using ESRI.ArcGIS.Client.Symbols;
  9. using ESRI.ArcGIS.Client.Tasks;
  10. namespace ESRI.ArcGIS.Samples
  11. {
  12. public partial class ThematicLayerControl : UserControl
  13. {
  14. public GraphicsLayer Layer
  15. {
  16. get { return (GraphicsLayer)GetValue(LayerProperty); }
  17. set { SetValue(LayerProperty, value); }
  18. }
  19. public static readonly DependencyProperty LayerProperty =
  20. DependencyProperty.Register("Layer", typeof(GraphicsLayer), typeof(ThematicLayerControl), null);
  21. List<ThematicItem> ThematicItemList = new List<ThematicItem>();
  22. List<List<SolidColorBrush>> ColorList = new List<List<SolidColorBrush>>();
  23. FeatureSet _featureSet = null;
  24. int _lastGeneratedClassCount = 0;
  25. public struct ThematicItem
  26. {
  27. public string Name { get; set; }
  28. public string Description { get; set; }
  29. public double Min { get; set; }
  30. public double Max { get; set; }
  31. public List<double> RangeStarts { get; set; }
  32. }
  33. public class ThemeColor
  34. {
  35. public ThemeColor(string name, Color color)
  36. {
  37. Name = name; Background = new SolidColorBrush(color);
  38. }
  39. public string Name { get; set; }
  40. public Brush Background { get; set; }
  41. }
  42. public ThematicLayerControl()
  43. {
  44. InitializeComponent();
  45. this.Loaded += new RoutedEventHandler(ThematicLayerControl_Loaded);
  46. }
  47. void ThematicLayerControl_Loaded(object sender, RoutedEventArgs e)
  48. {
  49. ClassCountCombo.ItemsSource = new int[] { 3, 4, 5, 6 };
  50. ClassTypeCombo.ItemsSource = new string[] { "Quantile", "Equal Interval" };
  51. ColorBlendCombo.SelectedIndex = ClassTypeCombo.SelectedIndex = ClassCountCombo.SelectedIndex = 0;
  52. // Get start value for number of classifications in XAML.
  53. _lastGeneratedClassCount = 3;
  54. // Set query where clause to include features with an area greater than 70 square miles.  This 
  55. // will effectively exclude the District of Columbia from attributes to avoid skewing classifications.
  56. ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query()
  57. {
  58. Where = "SQMI > 70"
  59. };
  60. query.OutFields.Add("*");
  61. QueryTask queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/" +
  62. "Demographics/ESRI_Census_USA/MapServer/5");
  63. queryTask.ExecuteCompleted += (evtsender, args) =>
  64. {
  65. if (args.FeatureSet == null)
  66. return;
  67. _featureSet = args.FeatureSet;
  68. if (_featureSet != null && _featureSet.Features.Count > 0)
  69. {
  70. // Clear previous graphic features
  71. Layer.ClearGraphics();
  72. for (int i = 0; i < _featureSet.Features.Count; i++)
  73. {
  74. Layer.Graphics.Add(_featureSet.Features[i]);
  75. }
  76. SetRangeValues();
  77. // RenderButton.IsEnabled = true;
  78. }
  79. };
  80. queryTask.ExecuteAsync(query);
  81. CreateColorList();
  82. CreateThematicList();
  83. }
  84. private void CreateColorList()
  85. {
  86. ColorList = new List<List<SolidColorBrush>>();
  87. List<SolidColorBrush> BlueShades = new List<SolidColorBrush>();
  88. List<SolidColorBrush> RedShades = new List<SolidColorBrush>();
  89. List<SolidColorBrush> GreenShades = new List<SolidColorBrush>();
  90. List<SolidColorBrush> YellowShades = new List<SolidColorBrush>();
  91. List<SolidColorBrush> MagentaShades = new List<SolidColorBrush>();
  92. List<SolidColorBrush> CyanShades = new List<SolidColorBrush>();
  93. int _classCount = (int)ClassCountCombo.SelectedItem;
  94. int rgbFactor = 255 / _classCount;
  95. for (int j = 0; j < 256; j = j + rgbFactor)
  96. {
  97. BlueShades.Add(new SolidColorBrush(Color.FromArgb(255, (byte)j, (byte)j, 255)));
  98. RedShades.Add(new SolidColorBrush(Color.FromArgb(255, 255, (byte)j, (byte)j)));
  99. GreenShades.Add(new SolidColorBrush(Color.FromArgb(255, (byte)j, 255, (byte)j)));
  100. YellowShades.Add(new SolidColorBrush(Color.FromArgb(255, 255, 255, (byte)j)));
  101. MagentaShades.Add(new SolidColorBrush(Color.FromArgb(255, 255, (byte)j, 255)));
  102. CyanShades.Add(new SolidColorBrush(Color.FromArgb(255, (byte)j, 255, 255)));
  103. }
  104. ColorList.Add(BlueShades);
  105. ColorList.Add(RedShades);
  106. ColorList.Add(GreenShades);
  107. ColorList.Add(YellowShades);
  108. ColorList.Add(MagentaShades);
  109. ColorList.Add(CyanShades);
  110. foreach (List<SolidColorBrush> brushList in ColorList)
  111. {
  112. brushList.Reverse();
  113. }
  114. List<SolidColorBrush> MixedShades = new List<SolidColorBrush>();
  115. if (_classCount > 5) MixedShades.Add(new SolidColorBrush(Color.FromArgb(192, 0, 255, 255)));
  116. if (_classCount > 4) MixedShades.Add(new SolidColorBrush(Color.FromArgb(192, 255, 0, 255)));
  117. if (_classCount > 3) MixedShades.Add(new SolidColorBrush(Color.FromArgb(192, 255, 255, 0)));
  118. MixedShades.Add(new SolidColorBrush(Color.FromArgb(192, 0, 255, 0)));
  119. MixedShades.Add(new SolidColorBrush(Color.FromArgb(192, 0, 0, 255)));
  120. MixedShades.Add(new SolidColorBrush(Color.FromArgb(192, 255, 0, 0)));
  121. ColorList.Add(MixedShades);
  122. _lastGeneratedClassCount = _classCount;
  123. }
  124. private void CreateThematicList()
  125. {
  126. ThematicItemList.Add(new ThematicItem() { Name = "POP2007", Description = "2007 Population " });
  127. ThematicItemList.Add(new ThematicItem() { Name = "POP07_SQMI", Description = "2007 Pop per Sq Mi" });
  128. ThematicItemList.Add(new ThematicItem() { Name = "MED_AGE", Description = "Median age" });
  129. ThematicItemList.Add(new ThematicItem() { Name = "SQMI", Description = "Total SqMi" });
  130. FieldCombo.ItemsSource = ThematicItemList;
  131. FieldCombo.SelectedIndex = 0;
  132. }
  133. private void SetRangeValues()
  134. {
  135. if (this.Layer == null) return;
  136. // if necessary, update ColorList based on current number of classes.
  137. int _classCount = (int)ClassCountCombo.SelectedItem;
  138. if (_lastGeneratedClassCount != _classCount) CreateColorList();
  139. // Field on which to generate a classification scheme.  
  140. ThematicItem thematicItem = ThematicItemList[FieldCombo.SelectedIndex];
  141. // Store a list of values to classify
  142. List<double> valueList = new List<double>();
  143. // Get range, min, max, etc. from features
  144. for (int i = 0; i < _featureSet.Features.Count; i++)
  145. {
  146. Graphic graphicFeature = _featureSet.Features[i];
  147. double graphicValue = Convert.ToDouble(graphicFeature.Attributes[thematicItem.Name]);
  148. if (i == 0)
  149. {
  150. thematicItem.Min = graphicValue;
  151. thematicItem.Max = graphicValue;
  152. }
  153. else
  154. {
  155. if (graphicValue < thematicItem.Min) { thematicItem.Min = graphicValue; }
  156. if (graphicValue > thematicItem.Max) { thematicItem.Max = graphicValue; }
  157. }
  158. valueList.Add(graphicValue);
  159. }
  160. // Set up range start values
  161. thematicItem.RangeStarts = new List<double>();
  162. double totalRange = thematicItem.Max - thematicItem.Min;
  163. double portion = totalRange / _classCount;
  164. thematicItem.RangeStarts.Add(thematicItem.Min);
  165. double startRangeValue = thematicItem.Min;
  166. // Equal Interval
  167. if (ClassTypeCombo.SelectedIndex == 1)
  168. {
  169. for (int i = 1; i < _classCount; i++)
  170. {
  171. startRangeValue += portion;
  172. thematicItem.RangeStarts.Add(startRangeValue);
  173. }
  174. }
  175. // Quantile
  176. else
  177. {
  178. // Enumerator of all values in ascending order
  179. IEnumerable<double> valueEnumerator =
  180. from aValue in valueList
  181. orderby aValue //"ascending" is default
  182. select aValue;
  183. int increment = Convert.ToInt32(Math.Ceiling(_featureSet.Features.Count / _classCount));
  184. for (int i = increment; i < valueList.Count; i += increment)
  185. {
  186. double value = valueEnumerator.ElementAt(i);
  187. thematicItem.RangeStarts.Add(value);
  188. }
  189. }
  190. // Create graphic features and set symbol using the class range which contains the value 
  191. List<SolidColorBrush> brushList = ColorList[ColorBlendCombo.SelectedIndex];
  192. if (_featureSet != null && _featureSet.Features.Count > 0)
  193. {
  194. ClassBreaksRenderer renderer = new ClassBreaksRenderer()
  195. {
  196. Attribute = thematicItem.Name
  197. };
  198. for (int i = 1; i < thematicItem.RangeStarts.Count; i++)
  199. {
  200. renderer.Classes.Add(new ClassBreakInfo()
  201. {
  202. MinimumValue = thematicItem.RangeStarts[i - 1],
  203. MaximumValue = thematicItem.RangeStarts[i],
  204. Symbol = new SimpleFillSymbol()
  205. {
  206. Fill = brushList[i],
  207. BorderThickness = 0
  208. }
  209. });
  210. }
  211. renderer.Classes[0].MinimumValue = double.MinValue;
  212. renderer.Classes[renderer.Classes.Count - 1].MaximumValue = double.MaxValue;
  213. Layer.Renderer = renderer;
  214. Layer.Refresh();
  215. }
  216. }
  217. private void OnComboBoxChanged_Render(object sender, SelectionChangedEventArgs e)
  218. {
  219. SetRangeValues();
  220. }
  221. }
  222. }