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

SilverLight

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Controls.Primitives;
  6. using System.Windows.Input;
  7. using ESRI.ArcGIS.Client;
  8. using ESRI.ArcGIS.Client.Tasks;
  9. using ESRI.ArcGIS.Samples.Extensions;
  10. namespace ESRI.ArcGIS.Samples.SilverMapDemo
  11. {
  12. public partial class Page : UserControl
  13. {
  14. private const int SRID = 4326; //Spatial ref ID of the map. Note that several controls and layers in this application requires 4326 to work as is.
  15. private double columnWidth = 150; //Width of layer configuration panel
  16. private GeodeticDistance geoMeasure;
  17. private Draw draw;
  18. private Editor editor;
  19.         private Measure measure;
  20. public Page()
  21. {
  22. InitializeComponent();
  23. }
  24. private void UserControl_Loaded(object sender, RoutedEventArgs e)
  25. {
  26. geoMeasure = new GeodeticDistance() { Map = Map }; //Radius tool
  27. measure = new Measure() { Map = Map, LineSymbol = shadowLine, FillSymbol = shadowFill }; //Measure tool
  28. draw = new Draw(Map) //Draw tool
  29. {
  30. FillSymbol = shadowFill,
  31. LineSymbol = shadowLine
  32. };
  33. draw.DrawComplete += new EventHandler<DrawEventArgs>(draw_DrawComplete);
  34. editor = new Editor(Map, Map.Layers["Annotations"] as GraphicsLayer); //Editor tool
  35. //Load points for the heatmap
  36. ESRI.ArcGIS.Samples.GeoRss.GeoRssLoader loader = new ESRI.ArcGIS.Samples.GeoRss.GeoRssLoader();
  37. loader.LoadCompleted += heatmap_LoadCompleted;
  38. loader.LoadRss((layerFeeds1.Layer as GeoRssLayer).Source, null);
  39. this.Map.Layers.CollectionChanged += Layers_CollectionChanged;
  40. //Load the US states for the pie markers layers
  41. ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query()
  42. {
  43. Geometry = new ESRI.ArcGIS.Client.Geometry.Envelope(-180, 0, 0, 90)
  44. };
  45. query.OutFields.Add("*");
  46. QueryTask queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5");
  47. queryTask.ExecuteCompleted += new EventHandler<QueryEventArgs>(MarkerSymbols_QueryTask_ExecuteCompleted);
  48. queryTask.ExecuteAsync(query);
  49. }
  50. private void MarkerSymbols_QueryTask_ExecuteCompleted(object sender, QueryEventArgs e)
  51. {
  52. //Create centroid for all US States
  53. FeatureSet featureSet = e.FeatureSet;
  54. GraphicsLayer graphicsLayer = layerDemo6.Layer as GraphicsLayer;
  55. if (featureSet != null && featureSet.Features.Count > 0)
  56. {
  57. foreach (Graphic feature in featureSet.Features)
  58. {
  59. ESRI.ArcGIS.Client.Geometry.Polygon polygon = feature.Geometry as ESRI.ArcGIS.Client.Geometry.Polygon;
  60. polygon.SpatialReference = new ESRI.ArcGIS.Client.Geometry.SpatialReference(4326);
  61. Graphic graphic;
  62. //Getting the center point of the polygon MBR:
  63. ESRI.ArcGIS.Client.Geometry.MapPoint featureCentroid = feature.Geometry.Extent.GetCenter();
  64. bool pointInPolygon = featureCentroid.IsWithin(polygon);
  65. if (pointInPolygon)
  66. {
  67. graphic = new Graphic()
  68. {
  69. Geometry = featureCentroid,
  70. Symbol = pieChartMarkerSymbol
  71. };
  72. }
  73. else
  74. {
  75. graphic = new Graphic()
  76. {
  77. Geometry = polygon,
  78. Symbol = null
  79. };
  80. }
  81. //Assigning attributes from the feature to the graphic:
  82. foreach (string key in feature.Attributes.Keys)
  83. {
  84. for (int i = 0; i < pieChartMarkerSymbol.Fields.Count; i++)
  85. {
  86. if (pieChartMarkerSymbol.Fields[i].FieldName == key)
  87. graphic.Attributes.Add(key, feature.Attributes[key]);
  88. }
  89. }
  90. graphicsLayer.Graphics.Add(graphic);
  91. //Using the geometry service to find a new centroid in the case the
  92. //calculated centroid is not inside of the polygon:
  93. if (!pointInPolygon)
  94. {
  95. GeometryService geometryService = new GeometryService("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
  96. List<Graphic> graphicsList = new List<Graphic>();
  97. graphicsList.Add(graphic);
  98. geometryService.LabelPointsCompleted += MarkerSymbols_GeometryService_LabelPointsCompleted;
  99. geometryService.LabelPointsAsync(graphicsList);
  100. }
  101. }
  102. }
  103. }
  104. private void MarkerSymbols_GeometryService_LabelPointsCompleted(object sender, GraphicsEventArgs args)
  105. {
  106. GraphicsLayer graphicsLayer = layerDemo6.Layer as GraphicsLayer;
  107. int idx = 0;
  108. foreach (Graphic graphic in args.Results)
  109. {
  110. graphic.Symbol = pieChartMarkerSymbol;
  111. ESRI.ArcGIS.Client.Geometry.MapPoint mapPoint = graphic.Geometry as ESRI.ArcGIS.Client.Geometry.MapPoint;
  112. graphic.Attributes.Add("X", mapPoint.X);
  113. graphic.Attributes.Add("Y", mapPoint.Y);
  114. foreach (string key in graphicsLayer.Graphics[idx].Attributes.Keys)
  115. {
  116. graphic.Attributes.Add(key, graphicsLayer.Graphics[idx].Attributes[key]);
  117. }
  118. graphicsLayer.Graphics.Add(graphic);
  119. idx++;
  120. }
  121. }
  122. /// <summary>
  123. /// Show an initalizing layer message when a layer is added and hasn't been initialized yet
  124. /// </summary>
  125. private void Layers_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  126. {
  127. if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
  128. {
  129. Layer l = e.NewItems[0] as Layer;
  130. if (!l.IsInitialized)
  131. {
  132. l.Initialized += layer_Initialized;
  133. l.InitializationFailed += layer_InitializationFailed;
  134. InitializeLayer.Visibility = Visibility.Visible;
  135. }
  136. }
  137. }
  138. /// <summary>
  139. /// Hide "Initializing layer" message when adding a layer
  140. /// </summary>
  141. private void layer_Initialized(object sender, EventArgs e)
  142. {
  143. Layer l = sender as Layer;
  144. l.Initialized -= layer_Initialized;
  145. InitializeLayer.Visibility = Visibility.Collapsed;
  146. }
  147. /// <summary>
  148. /// If layer failed to initialize, show a message in the browser status bar
  149. /// </summary>
  150. private void layer_InitializationFailed(object sender, EventArgs e)
  151. {
  152. System.Windows.Browser.HtmlPage.Window.SetProperty("status",
  153. "Layer failed to initialize: " + (sender as Layer).InitializationFailure.Message);
  154. }
  155. /// <summary>
  156. /// This is called when the earthquake georss feed has loaded and parsed all points. The
  157. /// same points are then added to the heatmap.
  158. /// </summary>
  159. private void heatmap_LoadCompleted(object sender, ESRI.ArcGIS.Samples.GeoRss.GeoRssLoader.RssLoadedEventArgs e)
  160. {
  161. HeatMapLayer layer = (layerDemo1.Layer as HeatMapLayer);
  162. layer.HeatMapPoints.Clear();
  163. foreach (Graphic g in e.Graphics)
  164. {
  165. double magnitude = (double)new MagnitudeConverter().Convert(g.Attributes, typeof(double), null, null);
  166. for (int i = 0; i < magnitude; i++)
  167. {
  168. layer.HeatMapPoints.Add(g.Geometry as ESRI.ArcGIS.Client.Geometry.MapPoint);
  169. }
  170. }
  171. }
  172. /// <summary>
  173. /// Called a radio buttons in the base layer menu is selected.
  174. /// Each radiobutton has a string tag that contains the URL to the service url
  175. /// </summary>
  176. private void BaseLayer_Changed(object sender, RoutedEventArgs e)
  177. {
  178. if (Map == null) return;
  179. ArcGISTiledMapServiceLayer layer = Map.Layers[0] as ArcGISTiledMapServiceLayer;
  180. layer.Url = (sender as FrameworkElement).Tag as string;
  181. }
  182. /// <summary>
  183. /// When the first layer is checked, show the configurator panel
  184. /// </summary>
  185. private void layerChecked(object sender, RoutedEventArgs e)
  186. {
  187. if (LeftMenu.Children.Count > 0 && RightColumnDefinition.Width.Value == 0)  //First configurator. Show panel
  188. {
  189. RightColumnSplitterDefinition.Width = new GridLength(9);
  190. RightColumnDefinition.Width = new GridLength(columnWidth);
  191. }
  192. }
  193. /// <summary>
  194. /// When the last layer is unchecked, hide the configurator panel
  195. /// </summary>
  196. private void layerUnchecked(object sender, RoutedEventArgs e)
  197. {
  198. //When a layer is removed, remove configurator to panel if it had one
  199. if (LeftMenu.Children.Count == 0) //No more configurators. Hide panel
  200. {
  201. columnWidth = RightColumnDefinition.Width.Value;
  202. RightColumnSplitterDefinition.Width = new GridLength(0);
  203. RightColumnDefinition.Width = new GridLength(0);
  204. }
  205. }
  206. #region Control Panel logic
  207. private void wmsLayerList_SelectionChanged(object sender, SelectionChangedEventArgs e)
  208. {
  209. if(layerWeather2!=null) {
  210. ((WMSMapServiceLayer)layerWeather2.Layer).Layers = new string[] 
  211. (e.AddedItems[0] as WMSMapServiceLayer.LayerInfo).Name 
  212. };
  213. }
  214. }
  215. private void globeLayer_Initialized(object sender, EventArgs e)
  216. {
  217. layerWeather2.Configurator.Visibility = Visibility.Visible;
  218. if (wmsLayerList.Items.Count > 43)
  219. wmsLayerList.SelectedIndex = 43;
  220. }
  221. #endregion Control Panel logic
  222. /// <summary>
  223. /// Collapse topbar when the ESRI logo is clicked.
  224. /// </summary>
  225. private void EsriLogo_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  226. {
  227. TopBarRowDefinition.Height = new GridLength(0);
  228. }
  229. #region Toolbar
  230. /// <summary>
  231. /// Used by the delete tool. Delete feature when clicked
  232. /// </summary>
  233. private void annotations_MouseLeftButtonDown(object sender, Graphic graphic, MouseButtonEventArgs args)
  234. {
  235. if (toggleDeleteGraphics.IsChecked.Value) //only delete if delete tool is active
  236. {
  237. GraphicsLayer annotations = Map.Layers["Annotations"] as GraphicsLayer;
  238. annotations.Graphics.Remove(graphic);
  239. }
  240. }
  241. /// <summary>
  242. /// Enable draw if one of the draw buttons is enabled
  243. /// </summary>
  244. private void toggleDraw_Checked(object sender, RoutedEventArgs e)
  245. {
  246. draw.IsEnabled = true;
  247. if(sender == toggleDrawPoint) draw.DrawMode = DrawMode.Point;
  248. else if (sender == toggleDrawPolyline) draw.DrawMode = DrawMode.Polyline;
  249. else if (sender == toggleDrawPolygon) draw.DrawMode = DrawMode.Polygon;
  250. else if (sender == toggleDrawRectangle) draw.DrawMode = DrawMode.Rectangle;
  251. else if (sender == toggleDrawFreehand) draw.DrawMode = DrawMode.Freehand;
  252. else draw.DrawMode = DrawMode.None;
  253. }
  254. /// <summary>
  255. /// Disable draw if all the draw buttons is unchecked
  256. /// </summary>
  257. private void toggleDraw_Unchecked(object sender, RoutedEventArgs e)
  258. {
  259. if (sender == toggleDrawPoint && draw.DrawMode == DrawMode.Point ||
  260.     sender == toggleDrawPolyline && draw.DrawMode == DrawMode.Polyline ||
  261. sender == toggleDrawPolygon && draw.DrawMode == DrawMode.Polygon ||
  262. sender == toggleDrawRectangle && draw.DrawMode == DrawMode.Rectangle ||
  263. sender == toggleDrawFreehand && draw.DrawMode == DrawMode.Freehand)
  264. draw.IsEnabled = false;
  265. }
  266. private void draw_DrawComplete(object sender, DrawEventArgs e)
  267. {
  268. GraphicsLayer annotations = Map.Layers["Annotations"] as GraphicsLayer;
  269. Graphic g = new Graphic();
  270. g.Geometry = e.Geometry;
  271. annotations.Graphics.Add(g);
  272. }
  273. private void toggleEditGeometry_Checked(object sender, RoutedEventArgs e)
  274. {
  275. editor.IsEnabled = (sender as ToggleButton).IsChecked.Value;
  276. }
  277.         private void Measure_Checked(object sender, RoutedEventArgs e)
  278.         {
  279. measure.IsActivated = false;
  280. measure.Type = sender == MeasureDistance ? MeasureType.Distance : MeasureType.Area;
  281.             measure.IsActivated = (sender as ToggleButton).IsChecked.Value;
  282.         }
  283. private void Measure_Unchecked(object sender, RoutedEventArgs e)
  284. {
  285. measure.IsActivated = MeasureArea.IsChecked.Value || MeasureDistance.IsChecked.Value;
  286. }
  287. private void GeoMeasureToggleButton_Checked(object sender, RoutedEventArgs e)
  288. {
  289. geoMeasure.IsActivated = (sender as ToggleButton).IsChecked.Value;
  290. }
  291.         #endregion
  292. private void pieCharts_MouseEnter(object sender, Graphic graphic, MouseEventArgs args)
  293. {
  294. graphic.SetZIndex(1);
  295. }
  296. private void pieCharts_MouseLeave(object sender, Graphic graphic, MouseEventArgs args)
  297. {
  298. graphic.SetZIndex(0);
  299. }
  300. }
  301. }