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

SilverLight

开发平台:

C#

  1. using System;
  2. using System.Windows;
  3. using System.Windows.Input;
  4. using System.Windows.Media;
  5. using ESRI.ArcGIS.Client;
  6. using ESRI.ArcGIS.Client.Geometry;
  7. using ESRI.ArcGIS.Client.Symbols;
  8. using ESRI.ArcGIS.Samples.Extensions;
  9. namespace ESRI.ArcGIS.Samples
  10. {
  11. public class GeodeticDistance : DependencyObject
  12. {
  13. private Cursor mapCursor;
  14. MapPoint origin;
  15. GraphicsLayer layer;
  16. RotatingTextSymbol textSymb = new RotatingTextSymbol();
  17. Graphic midMarker = new Graphic() { Symbol = new SimpleMarkerSymbol() { Color = new SolidColorBrush(Color.FromArgb(0x66, 255, 0, 0)), Size=5 } };
  18. Graphic straightLine = new Graphic() { Symbol = new SimpleLineSymbol(Color.FromArgb(0x99,0,0,0), 1), };
  19. Graphic textPoint;
  20. Graphic greatCircleLine = new Graphic() { Symbol = new SimpleLineSymbol(Color.FromArgb(0x99, 255, 0, 0), 4) };
  21. Graphic radiusLine = new Graphic() { Symbol = new SimpleLineSymbol(Color.FromArgb(0xff, 255, 255, 0), 1) };
  22. Graphic radiusFill = new Graphic() { Symbol = new SimpleFillSymbol() { Fill = new SolidColorBrush(Color.FromArgb(0x22, 255, 255, 255)), BorderThickness = 0 } };
  23. public GeodeticDistance()
  24. {
  25. }
  26. public Map Map
  27. {
  28. get { return (Map)GetValue(MapProperty); }
  29. set { SetValue(MapProperty, value); }
  30. }
  31. // Using a DependencyProperty as the backing store for Map.  This enables animation, styling, binding, etc...
  32. public static readonly DependencyProperty MapProperty =
  33. DependencyProperty.Register("Map", typeof(Map), typeof(GeodeticDistance), new PropertyMetadata(null, OnMapPropertyChanged));
  34. private static void OnMapPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  35. {
  36. GeodeticDistance gd = d as GeodeticDistance;
  37. Map oldMap = e.OldValue as Map;
  38. bool isActive = gd.IsActivated;
  39. if (isActive)
  40. gd.IsActivated = false;
  41. if (oldMap != null)
  42. {
  43. gd.layer.ClearGraphics();
  44. }
  45. Map map = e.NewValue as Map;
  46. if (map != null)
  47. {
  48. //Create graphics layer and populate with the needed necessary graphics
  49. gd.layer = new GraphicsLayer();
  50. gd.layer.Graphics.Add(gd.radiusFill);
  51. gd.layer.Graphics.Add(gd.greatCircleLine);
  52. gd.layer.Graphics.Add(gd.radiusLine);
  53. Polyline line = new Polyline();
  54. ESRI.ArcGIS.Client.Geometry.PointCollection pnts = new ESRI.ArcGIS.Client.Geometry.PointCollection();
  55. pnts.Add(new MapPoint());
  56. pnts.Add(new MapPoint());
  57. line.Paths.Add(pnts);
  58. gd.straightLine.Geometry = line;
  59. gd.layer.Graphics.Add(gd.straightLine);
  60. gd.layer.Graphics.Add(gd.midMarker);
  61. gd.textPoint = new Graphic() { Symbol = gd.textSymb };
  62. gd.textPoint.SetZIndex(2);
  63. gd.layer.Graphics.Add(gd.textPoint);
  64. }
  65. gd.IsActivated = isActive;
  66. }
  67. public bool IsActivated
  68. {
  69. get { return (bool)GetValue(IsActivatedProperty); }
  70. set { SetValue(IsActivatedProperty, value); }
  71. }
  72. public static readonly DependencyProperty IsActivatedProperty =
  73. DependencyProperty.Register("IsActivated", typeof(bool), typeof(GeodeticDistance), new PropertyMetadata(false, OnIsActivatedPropertyChanged));
  74. private static void OnIsActivatedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  75. {
  76. GeodeticDistance gd = d as GeodeticDistance;
  77. bool oldValue = (bool)e.OldValue;
  78. bool newValue = (bool)e.NewValue;
  79. if (newValue != oldValue)
  80. {
  81. if (gd.Map != null)
  82. {
  83. if (newValue)
  84. {
  85. gd.mapCursor = gd.Map.Cursor;
  86. gd.Map.MouseMove += gd.map_MouseMove;
  87. gd.Map.MouseClick += gd.map_MouseClick;
  88. gd.Map.Layers.Add(gd.layer);
  89. gd.Map.Cursor = Cursors.Hand;
  90. }
  91. else
  92. {
  93. gd.Map.MouseMove -= gd.map_MouseMove;
  94. gd.Map.MouseClick -= gd.map_MouseClick;
  95. gd.Map.Layers.Remove(gd.layer);
  96. gd.Map.Cursor = gd.mapCursor; //restore cursor
  97. }
  98. }
  99. }
  100. }
  101. private void map_MouseClick(object sender, Map.MouseEventArgs e)
  102. {
  103. origin = e.MapPoint;
  104. midMarker.Geometry = origin;
  105. (straightLine.Geometry as Polyline).Paths[0][0] = origin;
  106. (straightLine.Geometry as Polyline).Paths[0][1] = origin;
  107. textSymb.Text = "";
  108. greatCircleLine.Geometry = null;
  109. radiusLine.Geometry = null;
  110. radiusFill.Geometry = null;
  111. }
  112. private void map_MouseMove(object sender, MouseEventArgs e)
  113. {
  114. if (origin == null) return;
  115. Map map = sender as Map;
  116. MapPoint p = map.ScreenToMap(e.GetPosition(map));
  117. if (p == null || p.X < -180 || p.X > 180 || p.Y < -90 || p.Y > 90) return;
  118. MapPoint midpoint = new MapPoint((p.X + origin.X) / 2, (p.Y + origin.Y) / 2);
  119. textPoint.Geometry = midpoint;
  120. midMarker.Geometry = midpoint;
  121. (straightLine.Geometry as ESRI.ArcGIS.Client.Geometry.Polyline).Paths[0][1] = p;
  122. //layer.Graphics[2].Geometry = midpoint;
  123. double angle = Math.Atan2((p.X - origin.X), (p.Y - origin.Y)) / Math.PI * 180 - 90;
  124. if (angle > 90 || angle < -90) angle -= 180;
  125. textSymb.Angle = angle;
  126. double dist = Math.Pow(p.X - origin.X, 2) + Math.Pow(p.Y - origin.Y, 2);
  127. dist = Geodesic.GetSphericalDistance(origin, p);
  128. textSymb.Text = string.Format("{0} km", RoundToSignificantDigit(dist, map.Resolution));
  129. greatCircleLine.Geometry = Geodesic.GetGeodesicLine(origin, p);
  130. radiusLine.Geometry = Geodesic.GetRadius(origin, dist);
  131. radiusFill.Geometry = Geodesic.GetRadiusAsPolygon(origin, dist);
  132. }
  133. private static double RoundToSignificantDigit(double value, double resolution)
  134. {
  135. double round = Math.Floor(-Math.Log(resolution * 111.1));
  136. if (round > 0)
  137. {
  138. round = Math.Pow(10, round);
  139. return Math.Round(value * round) / round;
  140. }
  141. else { return Math.Round(value); }
  142. }
  143. }
  144. }