ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等--绘制点、线、圆,显示提示信息

时间:2023-03-09 15:05:49
ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等--绘制点、线、圆,显示提示信息

ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等--绘制点、线、圆,显示提示信息

  1. /// <summary>
  2. /// 绘制界面上的点和线
  3. /// </summary>
  4. /// <param name="myMap"></param>
  5. /// <param name="point"></param>
  6. /// <param name="pointLine"></param>
  7. public void DrawAnimationCompleted(Map myMap, List<Graphic> point,ESRI.ArcGIS.Client.Geometry.PointCollection pointLine)
  8. {
  9. GraphicsLayer gPointLayer = new GraphicsLayer();
  10. GraphicsLayer lineLayer = new GraphicsLayer();
  11. SimpleLineSymbol lineSymbol = new SimpleLineSymbol();
  12. lineSymbol.Color = new SolidColorBrush(Colors.Brown);
  13. lineSymbol.Width = 1;
  14. lineSymbol.Style = SimpleLineSymbol.LineStyle.Solid;
  15. // 画线到图层上并绘制到地图上
  16. GisMap.AddLayersToMap(myMap, new GraphicsLayer[] { lineLayer });
  17. GisLine.DrawLineOnMap(pointLine, lineLayer, lineSymbol);
  18. GisMap.DrawAllLayers(myMap, new GraphicsLayer[] { gPointLayer }, point);
  19. GisMap.AddLayersToMap(myMap, new GraphicsLayer[] { gPointLayer });
  20. }

好,看一下如何画圆吧。

  1. /// <summary>
  2. /// 在地图上绘制圆
  3. /// </summary>
  4. /// <param name="myMap">地图</param>
  5. /// <param name="container">绘制容器</param>
  6. /// <param name="pt">要绘制的点</param>
  7. /// <param name="drawCircleLayer"></param>
  8. /// <param name="circleKm">直径</param>
  9. /// <param name="color">填充色</param>
  10. /// <param name="ellipseStroke">边框色</param>
  11. public void DrawEllipse(Map myMap, Canvas container, MapPoint pt,ref ElementLayer drawCircleLayer, double circleKm,Color color,Color ellipseStroke)
  12. {
  13. if (!drawCircleLayer.Children.Contains(container))
  14. {
  15. drawCircleLayer.Children.Add(container);
  16. container.Opacity = 0.5;
  17. container.SetValue(ElementLayer.EnvelopeProperty, new Envelope(myMap.Extent.XMax, myMap.Extent.YMax, myMap.Extent.XMin, myMap.Extent.YMin));
  18. }
  19. Point ptFirst = myMap.MapToScreen(new MapPoint(Convert.ToDouble(pt.X),
  20. Convert.ToDouble(pt.Y)));
  21. Point pt7 = myMap.MapToScreen(new MapPoint((Convert.ToDouble(pt.X) + circleKm * kmToEN),
  22. Convert.ToDouble(pt.Y)));
  23. Ellipse ellipse7 = new Ellipse();
  24. ellipse7.Width = (pt7.X - ptFirst.X) * 2;
  25. ellipse7.Height = ellipse7.Width;
  26. ellipse7.StrokeThickness = 1;
  27. ellipse7.Stroke = new SolidColorBrush(ellipseStroke);
  28. ellipse7.Fill = new SolidColorBrush(color);
  29. Canvas.SetLeft(ellipse7, ptFirst.X - ellipse7.Width / 2);
  30. Canvas.SetTop(ellipse7, ptFirst.Y - ellipse7.Width / 2);
  31. ellipse7.Opacity = 0.5;
  32. container.Children.Add(ellipse7);
  33. container.IsHitTestVisible = false;
  34. container.SetValue(Canvas.ZIndexProperty, -10);
  35. }

这是一个画圆的方法,需要地图类,点,Canvas容器,Gis 的地图层ElementLayer和color

我前台是这样调用的

  1. &nbsp;{&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GisMap.DeleteLayersToMap(myMap, "WindCircleLayer");&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
  2. ElementLayer circleLayer = new ElementLayer();
  3. circleLayer.ID = "WindCircleLayer";
  4. Canvas circleCanvas = new Canvas();
  5. Graphic tipGraphic = sender as Graphic;
  6. if (Convert.ToDouble(tipGraphic.Attributes["WindCircle7"]) != 0)
  7. {
  8. Color color = new Color();
  9. color.A = 255;
  10. color.R = 153;
  11. color.G = 105;
  12. color.B = 192;
  13. DrawEllipse(myMap, circleCanvas, new MapPoint(Convert.ToDouble(tipGraphic.Attributes["Longitude"]),
  14. Convert.ToDouble(tipGraphic.Attributes["Latitude"])), ref circleLayer,
  15. Convert.ToDouble(300), color, Colors.Blue);
  16. }
  17. if (Convert.ToDouble(tipGraphic.Attributes["WindCircle10"]) != 0)
  18. {
  19. Color color = new Color();
  20. color.A = 255;
  21. color.R = 111;
  22. color.G = 91;
  23. color.B = 171;
  24. this.DrawEllipse(myMap, circleCanvas, new MapPoint(Convert.ToDouble(tipGraphic.Attributes["Longitude"]),
  25. Convert.ToDouble(tipGraphic.Attributes["Latitude"])), ref circleLayer,
  26. Convert.ToDouble(tipGraphic.Attributes["WindCircle10"]), color, Colors.Blue);
  27. }
  28. GisMap.AddLayersToMap(myMap, new ElementLayer[] { circleLayer });
  29. }

这里的sender是一个Gis元素 Graphic,根据我的WebService 取到的实体后我把这个点加上了Attributes,一系列属性,所以在上面的代码可以看到tipGraphic.Attributes["WindCircle10"],

下面的代码就是在我从WebService取到实体后做添加点的代码:

  1. /// <summary>
  2. /// 添加台风点代码
  3. /// 添加鼠标移入、移出事件
  4. /// </summary>
  5. /// <param name="model"></param>
  6. /// <param name="i"></param>
  7. private void AddPointToGraphic(TyphoonModel model, int i, List<Graphic> pointParam)
  8. {
  9. SimpleMarkerSymbol symbol = new SimpleMarkerSymbol();
  10. Color color = new Color();
  11. color.A = 255;
  12. if (Convert.ToDouble(model.WS) <= 17.1)
  13. {
  14. color.R = 0;
  15. color.G = 254;
  16. color.B = 223;
  17. symbol.Color = new SolidColorBrush(color);
  18. }
  19. else if (Convert.ToDouble(model.WS) > 17.1 && Convert.ToDouble(model.WS) <= 24.4)
  20. {
  21. color.R = 254;
  22. color.G = 243;
  23. color.B = 0;
  24. symbol.Color = new SolidColorBrush(color);
  25. }
  26. else if (Convert.ToDouble(model.WS) > 24.4 && Convert.ToDouble(model.WS) <= 32.6)
  27. {
  28. color.R = 254;
  29. color.G = 144;
  30. color.B = 44;
  31. symbol.Color = new SolidColorBrush(color);
  32. }
  33. else if (Convert.ToDouble(model.WS) > 32.6 && Convert.ToDouble(model.WS) <= 41.4)
  34. {
  35. color.R = 254;
  36. color.G = 4;
  37. color.B = 4; symbol.Color = new SolidColorBrush(color);
  38. }
  39. else if (Convert.ToDouble(model.WS) > 41.4 && Convert.ToDouble(model.WS) <= 50.9)
  40. {
  41. color.R = 254;
  42. color.G = 58;
  43. color.B = 163; symbol.Color = new SolidColorBrush(color);
  44. }
  45. else if (Convert.ToDouble(model.WS) > 50.9)
  46. {
  47. color.R = 174;
  48. color.G = 0;
  49. color.B = 217; symbol.Color = new SolidColorBrush(color);
  50. }
  51. symbol.Size = 10;
  52. if (i == 0)
  53. {
  54. symbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square;
  55. }
  56. else
  57. {
  58. symbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Circle;
  59. }
  60. pointParam.Add(new Graphic()
  61. {
  62. Geometry = new MapPoint(model.Longitude, model.Latitude),
  63. Symbol = symbol
  64. });
  65. pointParam[i].Attributes.Add("TyphoonID", model.TyphoonID);
  66. pointParam[i].Attributes.Add("TyphoonNo", model.TyphoonNo);
  67. pointParam[i].Attributes.Add("TyphoonName", model.TyphoonName);
  68. pointParam[i].Attributes.Add("WindCircle7", model.WindCircle7);
  69. pointParam[i].Attributes.Add("WindCircle10", model.WindCircle10);
  70. pointParam[i].Attributes.Add("WS", model.WS);
  71. pointParam[i].Attributes.Add("Pressure", model.Pressure);
  72. pointParam[i].Attributes.Add("IssueTime", model.IssueTime);
  73. pointParam[i].Attributes.Add("Future", model.Future);
  74. pointParam[i].Attributes.Add("Latitude", model.Latitude);
  75. pointParam[i].Attributes.Add("Longitude", model.Longitude);
  76. }

信息提示功能如图:

ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等--绘制点、线、圆,显示提示信息

我们先看下Xmal中的代码:

  1. <Canvas x:Name="typhoonPointInfoCanvas" Visibility="Visible" Height="188" HorizontalAlignment="Left" Margin="0,-272,0,0" VerticalAlignment="Top" Width="360">
  2. <Path Stretch="Fill" Stroke="Black"  Height="168.5" Width="328.5" UseLayoutRounding="False" Canvas.Left="0.5" Canvas.Top="-0.5" Data="M113,25 C113,11.745166 123.74516,1.0000004 137,1.0000004 L304,1.0000004 C317.25482,1.0000004 328,11.745166 328,25 L328,144 C328,157.25484 317.25482,168 304,168 L137,168 C123.74516,168 113,157.25484 113,144 z M112.5,24.499998 L0.5,0.5 L112.5,72.499992 z" Fill="{StaticResource CommonGradient2}"/>
  3. <StackPanel Orientation="Vertical" Height="168" Width="176" Canvas.Left="137" Canvas.Top="15">
  4. <TextBlock x:Name="typhoonNameTextBlock" Height="20" Text="名称:" Foreground="White" TextWrapping="Wrap"/>
  5. <TextBlock x:Name="typhoonCollectionTimeTextBlock" Height="20" Text="时间:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
  6. <TextBlock x:Name="typhoonPositionTextBlock" Height="20" Text="位置:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
  7. <TextBlock x:Name="typhoonWSTextBlock" Height="20" Text="最大风速:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
  8. <TextBlock x:Name="typhoonPressureTextBlock" Height="20" Text="中心气压:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
  9. <TextBlock x:Name="typhoonCircle7TextBlock" Height="20" Text="7级风圈半径:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
  10. <TextBlock x:Name="typhoonCircle10TextBlock" Height="20" Text="10级风圈半径:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
  11. </StackPanel>
  12. </Canvas>

<LinearGradientBrush x:Key="CommonGradient" StartPoint="0.5,0" EndPoint="0.5,1">            <GradientStop Offset="0" Color="#ee76a8d3"/>            <GradientStop Offset="0.25" Color="#ee5b8cb5"/>            <GradientStop Offset="0.75" Color="#ee4b7ba7"/>        </LinearGradientBrush

看下c# 中的代码:

当我们添加那些点也就是 Graphic 的时候有这样一个事件MouseEventHandler

  1. // 添加点和线,先显示点层,动画结束后显示线层
  2. mapDraw.DrawLineAndPoint(ref point, myMap, gLayer, ref pointLine, e, length);
  3. // 添加点事件
  4. foreach (Graphic item in point)
  5. {
  6. item.MouseEnter += new MouseEventHandler(MainPage_MouseEnter);
  7. item.MouseLeave += new MouseEventHandler(MainPage_DrawLine);
  8. }
  1. /// <summary>
  2. /// 绘制单条台风动画前的信息
  3. /// </summary>
  4. /// <param name="point"></param>
  5. /// <param name="myMap"></param>
  6. /// <param name="gLayer"></param>
  7. /// <param name="pointLine"></param>
  8. /// <param name="e"></param>
  9. /// <param name="length"></param>
  10. public void DrawLineAndPoint(ref List<Graphic> point,Map myMap,GraphicsLayer gLayer,
  11. ref ESRI.ArcGIS.Client.Geometry.PointCollection pointLine, GetTyphoonsCompletedEventArgs e, int length)
  12. {
  13. #region 添加点代码
  14. point = new List<Graphic>();
  15. for (int i = 0; i < length; i++)
  16. {
  17. AddPointToGraphic(e.Result[i], i, point);
  18. }
  19. #endregion
  20. // 添加线的代码
  21. pointLine = new ESRI.ArcGIS.Client.Geometry.PointCollection();
  22. AddLineToMap(e.Result.ToList(), length, pointLine);
  23. // 显示点层
  24. GisMap.DrawAllLayers(myMap, new GraphicsLayer[] { gLayer }, point);
  25. GisMap.AddLayersToMap(myMap, new GraphicsLayer[] { gLayer });
  26. }

AddPointToGraphic这个方法就是图片上面的那段代码

<SPAN style="FONT-SIZE: 14px"> item.MouseEnter += new MouseEventHandler(MainPage_MouseEnter);     </SPAN>

item.MouseLeave += new MouseEventHandler(MainPage_DrawLine);

这两段代码就是我们添加鼠标移入和移出事件了,我们看下移入事件:

  1. <DIV class=cnblogs_Highlighter><PRE class=brush:csharp>        void MainPage_MouseEnter(object sender, MouseEventArgs e)
  2. {
  3. Graphic graphic = sender as Graphic;
  4. Cursor = Cursors.Hand;
  5. typhoonPointInfoCanvas.Visibility = Visibility.Visible;
  6. Point pt = myMap.MapToScreen(new MapPoint(Convert.ToDouble(graphic.Attributes["Longitude"]), Convert.ToDouble(graphic.Attributes["Latitude"])));
  7. typhoonPointInfoCanvas.SetValue(Grid.MarginProperty, new Thickness(pt.X, pt.Y, 0, 0));
  8. typhoonNameTextBlock.Text = "台风:" + graphic.Attributes["TyphoonName"].ToString();
  9. typhoonCollectionTimeTextBlock.Text = "时间:" + graphic.Attributes["IssueTime"].ToString();
  10. typhoonPositionTextBlock.Text = "位置:" + graphic.Attributes["Longitude"].ToString() + "°E," + graphic.Attributes["Latitude"].ToString() + "°N";
  11. typhoonWSTextBlock.Text = "最大风速:" + graphic.Attributes["WS"].ToString() + " m/s";
  12. typhoonPressureTextBlock.Text = "中心气压:" + graphic.Attributes["Pressure"].ToString() + " hPa";
  13. typhoonCircle7TextBlock.Text = "7级风圈半径:" + graphic.Attributes["WindCircle7"].ToString() + " km";
  14. typhoonCircle10TextBlock.Text = "10级风圈半径:" + graphic.Attributes["WindCircle10"].ToString() + " km";
  15. circle.DrawEllipse7And10WindCircle(myMap, sender);
  16. selectedGarphic = sender as Graphic;
  17. }</PRE>
  18. </DIV>

我们看到在显示信息的同时我们又把圆画了上去<SPAN style="FONT-SIZE: 14px">DrawEllipse7And10WindCircle()这个函数</SPAN>
GisMap是个静态类,以下是他的代码

  1. /// <summary>
  2. /// ArcGis 调用类
  3. /// 动态加载、显示隐藏层数据、加载层上的点等
  4. /// 日期:2010-5-10
  5. /// 作者:AngelSoft
  6. /// </summary>
  7. public static class GisMap
  8. {
  9. /// <summary>
  10. /// 绘制所有的点到地图上
  11. /// </summary>
  12. /// <param name="glayer"></param>
  13. /// <param name="cacheGraphic"></param>
  14. public static void DrawSymbol(GraphicsLayer glayer, List<Graphic> cacheGraphic)
  15. {
  16. if (glayer != null)
  17. {
  18. int graphicCount = cacheGraphic.Count;
  19. for (int i = 0; i < graphicCount; i++)
  20. {
  21. glayer.Graphics.Add(cacheGraphic[i]);
  22. } // i
  23. }
  24. }
  1. /// <summary>
  2. /// 加载所有图层上的点
  3. /// 动态绘制
  4. /// 图层和点的对应关系要正确
  5. /// 有几个图层就要有几个点集合
  6. /// </summary>
  7. /// <param name="map">ArcGis 地图变量</param>
  8. /// <param name="layers">GraphicLayer 层数组</param>
  9. /// <param name="graphicParam">Graphic 点数组</param>
  10. public static void DrawLayers(Map map, GraphicsLayer[] layers, params List<Graphic>[] graphicParam)
  11. {
  12. // 计算要绘制的层数并一层一层的绘制(调用动态绘制方法)
  13. if (layers != null)
  14. {
  15. int length = layers.Length;
  16. for (int i = 0; i < length; i++)
  17. {
  18. if (layers[i] == null)
  19. {
  20. layers[i] = new GraphicsLayer();
  21. }
  22. DynamicDrawSymbol(layers[i], graphicParam[i], map);
  23. }
  24. }
  25. }
  26. /// <summary>
  27. /// 加载所有图层上的点
  28. /// 画所有点
  29. /// 图层和点的对应关系要正确
  30. /// 有几个图层就要有几个点集合
  31. /// </summary>
  32. /// <param name="map">ArcGis 地图变量</param>
  33. /// <param name="layers">GraphicLayer 层数组</param>
  34. /// <param name="graphicParam">Graphic 点数组</param>
  35. public static void DrawAllLayers(Map map, GraphicsLayer[] layers, params List<Graphic>[] graphicParam)
  36. {
  37. // 计算要绘制的层数并一层一层的绘制(调用动态绘制方法)
  38. if (layers != null)
  39. {
  40. int length = layers.Length;
  41. for (int i = 0; i < length; i++)
  42. {
  43. if (layers[i] == null)
  44. {
  45. layers[i] = new GraphicsLayer();
  46. }
  47. DrawAllGraphics(layers[i], graphicParam[i]);
  48. }
  49. }
  50. }
  51. /// <summary>
  52. /// 隐藏或显示 ArcGis 层
  53. /// </summary>
  54. /// <param name="show">隐藏或显示</param>
  55. /// <param name="layers">层</param>
  56. public static void LayersVisibility(bool show, params GraphicsLayer[] layers)
  57. {
  58. if (layers != null)
  59. {
  60. foreach (GraphicsLayer item in layers)
  61. {
  62. item.Visible = show;
  63. }
  64. }
  65. }
  66. /// <summary>
  67. /// 将图层数组全部从 map 中移除
  68. /// </summary>
  69. /// <param name="map">表示一张 ArcGis 地图</param>
  70. /// <param name="layers">表示地图层的数组</param>
  71. public static void DeleteLayersToMap(Map map, GraphicsLayer[] layers)
  72. {
  73. // 逐个将数据移除
  74. foreach (GraphicsLayer item in layers)
  75. {
  76. map.Layers.Remove(item);
  77. }
  78. }
  79. /// <summary>
  80. /// 根据 ID 号删除某层
  81. /// </summary>
  82. /// <param name="map"></param>
  83. /// <param name="ID"></param>
  84. /// <returns></returns>
  85. public static void DeleteLayersToMap(Map map, string[] ID)
  86. {
  87. int length = ID.Length;
  88. for (int i = 0; i < length; i++)
  89. {
  90. foreach (Layer item in map.Layers)
  91. {
  92. if (item.ID == ID[i])
  93. {
  94. map.Layers.Remove(item);
  95. length--;
  96. break;
  97. }
  98. }
  99. }
  100. }
  101. /// <summary>
  102. /// 将图层数组全部从 map 中移除
  103. /// </summary>
  104. /// <param name="map">表示一张 ArcGis 地图</param>
  105. /// <param name="layers">表示地图层的数组</param>
  106. public static void DeleteLayersToMap(Map map, ElementLayer[] layers)
  107. {
  108. // 逐个将数据移除
  109. foreach (ElementLayer item in layers)
  110. {
  111. map.Layers.Remove(item);
  112. }
  113. }
  114. /// <summary>
  115. /// 删除地图上的某一层
  116. /// </summary>
  117. /// <param name="myMap"></param>
  118. /// <param name="ID">ID号</param>
  119. public static void DeleteLayersToMap(Map myMap, string ID)
  120. {
  121. int layers = myMap.Layers.Count;
  122. for (int i = 0; i < layers; i++)
  123. {
  124. if (myMap.Layers[i].ID == ID)
  125. {
  126. myMap.Layers.RemoveAt(i);
  127. return;
  128. }
  129. }
  130. }
  131. public static bool LayerExist(Map myMap, string ID)
  132. {
  133. int layers = myMap.Layers.Count;
  134. for (int i = 0; i < layers; i++)
  135. {
  136. if (myMap.Layers[i].ID == ID)
  137. {
  138. return true;
  139. }
  140. }
  141. return false;
  142. }
  143. /// <summary>
  144. /// 将图层数组全部添加到 map 中
  145. /// </summary>
  146. /// <param name="map">表示一张 ArcGis 地图</param>
  147. /// <param name="layers">表示地图层的数组</param>
  148. public static void AddLayersToMap(Map map, GraphicsLayer[] layers)
  149. {
  150. // 逐个将数据添加到当前地图中
  151. foreach (GraphicsLayer item in layers)
  152. {
  153. if (item != null)
  154. {
  155. map.Layers.Add(item);
  156. }
  157. }
  158. }
  159. /// <summary>
  160. /// 将图层数组全部添加到 map 中
  161. /// </summary>
  162. /// <param name="map">表示一张 ArcGis 地图</param>
  163. /// <param name="layers">表示地图层的数组</param>
  164. public static void AddLayersToMap(Map map, ElementLayer[] layers)
  165. {
  166. // 逐个将数据添加到当前地图中
  167. foreach (ElementLayer item in layers)
  168. {
  169. map.Layers.Add(item);
  170. }
  171. }
  172. /// <summary>
  173. /// 绘制所有的点到地图上
  174. /// </summary>
  175. /// <param name="eLayer"></param>
  176. /// <param name="image"></param>
  177. public static void AddImageToElementLayer(ElementLayer eLayer, List<Image> image)
  178. {
  179. if (eLayer != null)
  180. {
  181. foreach (Image item in image)
  182. {
  183. eLayer.Children.Add(item);
  184. }
  185. }
  186. }
  187. /// <summary>
  188. /// 隐藏或显示 ArcGis 层
  189. /// </summary>
  190. /// <param name="show">隐藏或显示</param>
  191. /// <param name="layers">层</param>
  192. public static void LayersVisibility(bool show, params ElementLayer[] layers)
  193. {
  194. if (layers != null)
  195. {
  196. foreach (ElementLayer item in layers)
  197. {
  198. item.Visible = show;
  199. }
  200. }
  201. }
  202. /// <summary>
  203. /// 动态加载图层
  204. /// 使用 ElementLayer 层
  205. /// </summary>
  206. /// <param name="eLayer"></param>
  207. /// <param name="cacheGraphic"></param>
  208. /// <param name="map"></param>
  209. public static void DynamicDrawElementLayer(ElementLayer eLayer, List<UIElement> cacheElement, Map map)
  210. {
  211. // 以下四个变量分别表示地图的四个边
  212. // 即最大经纬度和最小经纬度
  213. // xMax最大经度,yMax最大纬度
  214. double xMax = map.Extent.XMax + 2;
  215. double xMin = map.Extent.XMin - 2;
  216. double yMax = map.Extent.YMax + 2;
  217. double yMin = map.Extent.YMin - 2;
  218. // 去除不在坐标范围内的点,先检查图层是否为空
  219. if (eLayer != null)
  220. {
  221. int graphicCount = eLayer.Children.Count;
  222. for (int i = 0; i < graphicCount; i++)
  223. {
  224. UIElement element = eLayer.Children[i];
  225. // 判断经度,纬度
  226. if (!(((element.GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.XMax < xMax && (element.GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.XMax > xMin)
  227. && ((element.GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.YMax < yMax && (element.GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.YMax > yMin)))
  228. {
  229. // 将点在地图上移除,并放在缓存中
  230. cacheElement.Add(eLayer.Children[i]);
  231. eLayer.Children.Remove(eLayer.Children[i]);
  232. graphicCount--;   // 当从集合中移除元素时应该把 graphicCount 减1
  233. i--;              // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1
  234. }
  235. } // i
  236. }
  237. // 检查缓存是否为空,并将点绘制到图形上
  238. if (cacheElement != null)
  239. {
  240. int count = cacheElement.Count;
  241. for (int i = 0; i < count; i++)
  242. {
  243. // 判断经度,纬度
  244. if (((cacheElement[i].GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.XMax < xMax && (cacheElement[i].GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.XMax > xMin)
  245. && ((cacheElement[i].GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.YMax < yMax && (cacheElement[i].GetValue(ElementLayer.EnvelopeProperty) as Envelope).Extent.YMax > yMin))
  246. {
  247. // 运行到此则该点在目前地图范围内,将该点加入到地图中
  248. eLayer.Children.Add(cacheElement[i]);
  249. cacheElement.Remove(cacheElement[i]);
  250. count--;    // 当从集合中移除元素时应该把 count 减1
  251. i--;        // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1
  252. continue;
  253. }
  254. }
  255. }
  256. }
  257. /// <summary>
  258. /// 将所有元素画到地图上
  259. /// </summary>
  260. /// <param name="eLayer"></param>
  261. /// <param name="cacheElement"></param>
  262. public static void DrawAllUIElement(ElementLayer eLayer, List<UIElement> cacheElement)
  263. {
  264. if (eLayer != null)
  265. {
  266. foreach (UIElement item in cacheElement)
  267. {
  268. eLayer.Children.Add(item);
  269. }
  270. }
  271. }
  272. /// <summary>
  273. /// 动态的绘制图层
  274. /// 当然地图移动到相应的坐标后绘制(保留原来的点,绘制新的数据)
  275. /// 实现了无刷新绘制
  276. /// </summary>
  277. /// <param name="glayer">表示地图上的层</param>
  278. /// <param name="cacheGraphic">存放 Graphics 的缓存</param>
  279. /// <param name="map">表示一张 ArcGis 地图</param>
  280. private static void DynamicDrawSymbol(GraphicsLayer glayer, List<Graphic> cacheGraphic, Map map)
  281. {
  282. // 以下四个变量分别表示地图的四个边
  283. // 即最大经纬度和最小经纬度
  284. // xMax最大经度,yMax最大纬度
  285. double xMax = map.Extent.XMax + 2;
  286. double xMin = map.Extent.XMin - 2;
  287. double yMax = map.Extent.YMax + 2;
  288. double yMin = map.Extent.YMin - 2;
  289. // 去除不在坐标范围内的点,先检查图层是否为空
  290. if (glayer != null)
  291. {
  292. int graphicCount = glayer.Graphics.Count;
  293. for (int i = 0; i < graphicCount; i++)
  294. {
  295. // 判断经度,纬度
  296. if (!((glayer.Graphics[i].Geometry.Extent.XMax < xMax && glayer.Graphics[i].Geometry.Extent.XMax > xMin)
  297. && (glayer.Graphics[i].Geometry.Extent.YMax < yMax && glayer.Graphics[i].Geometry.Extent.YMax > yMin)))
  298. {
  299. // 将点在地图上移除,并放在缓存中
  300. cacheGraphic.Add(glayer.Graphics[i]);
  301. glayer.Graphics.Remove(glayer.Graphics[i]);
  302. graphicCount--;   // 当从集合中移除元素时应该把 graphicCount 减1
  303. i--;              // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1
  304. }
  305. } // i
  306. }
  307. // 检查缓存是否为空,并将点绘制到图形上
  308. if (cacheGraphic != null)
  309. {
  310. int count = cacheGraphic.Count;
  311. for (int i = 0; i < count; i++)
  312. {
  313. // 判断经度,纬度
  314. if ((cacheGraphic[i].Geometry.Extent.XMax < xMax && cacheGraphic[i].Geometry.Extent.XMax > xMin)
  315. && (cacheGraphic[i].Geometry.Extent.YMax < yMax && cacheGraphic[i].Geometry.Extent.YMax > yMin))
  316. {
  317. // 运行到此则该点在目前地图范围内,将该点加入到地图中
  318. glayer.Graphics.Add(cacheGraphic[i]);
  319. cacheGraphic.Remove(cacheGraphic[i]);
  320. count--;    // 当从集合中移除元素时应该把 count 减1
  321. i--;        // 元素被移除后相当于当前元素的后一位元素会 -1,应该再循环一次本次循环所以应该 -1
  322. continue;
  323. }
  324. }
  325. }
  326. }
  327. /// <summary>
  328. /// 将所有元素画到地图上
  329. /// </summary>
  330. /// <param name="eLayer"></param>
  331. /// <param name="cacheElement"></param>
  332. private static void DrawAllGraphics(GraphicsLayer eLayer, List<Graphic> cacheGraphic)
  333. {
  334. if (eLayer != null)
  335. {
  336. foreach (Graphic item in cacheGraphic)
  337. {
  338. eLayer.Graphics.Add(item);
  339. }
  340. }
  341. }

今天把 GisMap 这个类都写出来了也为了我写下一篇文章做准备吧!后面会写一篇动态加载数据点的文章!因为当大批量点(2000)左右加载到地图上的时候,

就会非常的卡,基本都动不了,所以我们要动态去加载这些点。