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

OK,今天又有空来写点啦,这个例子自己不想拉的太长了,所以这节多写点东西,我尽量把东西都介绍全面,有不懂的可以留言~

有空大家共同讨论。


好进入正题,如今天标题所示,我们先来看画点,线,圆吧!

 

 
 
  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.     // 画线到图层上并绘制到地图上  
  17.     GisMap.AddLayersToMap(myMap, new GraphicsLayer[] { lineLayer });  
  18.     GisLine.DrawLineOnMap(pointLine, lineLayer, lineSymbol);  
  19.  
  20.     GisMap.DrawAllLayers(myMap, new GraphicsLayer[] { gPointLayer }, point);  
  21.     GisMap.AddLayersToMap(myMap, new GraphicsLayer[] { gPointLayer });  

好,看一下如何画圆吧。

 

 
 
  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.  
  20.     Point ptFirst = myMap.MapToScreen(new MapPoint(Convert.ToDouble(pt.X),  
  21.         Convert.ToDouble(pt.Y)));  
  22.  
  23.     Point pt7 = myMap.MapToScreen(new MapPoint((Convert.ToDouble(pt.X) + circleKm * kmToEN),  
  24.         Convert.ToDouble(pt.Y)));  
  25.  
  26.     Ellipse ellipse7 = new Ellipse();  
  27.     ellipse7.Width = (pt7.X - ptFirst.X) * 2;  
  28.     ellipse7.Height = ellipse7.Width;  
  29.     ellipse7.StrokeThickness = 1;  
  30.     ellipse7.Stroke = new SolidColorBrush(ellipseStroke);  
  31.     ellipse7.Fill = new SolidColorBrush(color);  
  32.     Canvas.SetLeft(ellipse7, ptFirst.X - ellipse7.Width / 2);  
  33.     Canvas.SetTop(ellipse7, ptFirst.Y - ellipse7.Width / 2);  
  34.     ellipse7.Opacity = 0.5;  
  35.  
  36.     container.Children.Add(ellipse7);  
  37.     container.IsHitTestVisible = false;  
  38.     container.SetValue(Canvas.ZIndexProperty, -10);  

这是一个画圆的方法,需要地图类,点,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.  
  3.             ElementLayer circleLayer = new ElementLayer();  
  4.             circleLayer.ID = "WindCircleLayer";  
  5.  
  6.             Canvas circleCanvas = new Canvas();  
  7.  
  8.             Graphic tipGraphic = sender as Graphic;  
  9.  
  10.             if (Convert.ToDouble(tipGraphic.Attributes["WindCircle7"]) != 0)  
  11.             {  
  12.                 Color color = new Color();  
  13.                 color.A = 255;  
  14.                 color.R = 153;  
  15.                 color.G = 105;  
  16.                 color.B = 192;  
  17.  
  18.                 DrawEllipse(myMap, circleCanvas, new MapPoint(Convert.ToDouble(tipGraphic.Attributes["Longitude"]),  
  19.                     Convert.ToDouble(tipGraphic.Attributes["Latitude"])), ref circleLayer,  
  20.                     Convert.ToDouble(300), color, Colors.Blue);  
  21.  
  22.             }  
  23.  
  24.             if (Convert.ToDouble(tipGraphic.Attributes["WindCircle10"]) != 0)  
  25.             {  
  26.                 Color color = new Color();  
  27.                 color.A = 255;  
  28.                 color.R = 111;  
  29.                 color.G = 91;  
  30.                 color.B = 171;  
  31.  
  32.                 this.DrawEllipse(myMap, circleCanvas, new MapPoint(Convert.ToDouble(tipGraphic.Attributes["Longitude"]),  
  33.                     Convert.ToDouble(tipGraphic.Attributes["Latitude"])), ref circleLayer,  
  34.                     Convert.ToDouble(tipGraphic.Attributes["WindCircle10"]), color, Colors.Blue);  
  35.             }  
  36.  
  37.  
  38.             GisMap.AddLayersToMap(myMap, new ElementLayer[] { circleLayer });  
  39.         } 

这里的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.       
  13.     if (Convert.ToDouble(model.WS) <= 17.1)  
  14.     {  
  15.         color.R = 0;  
  16.         color.G = 254;  
  17.         color.B = 223;  
  18.         symbol.Color = new SolidColorBrush(color);  
  19.     }  
  20.     else if (Convert.ToDouble(model.WS) > 17.1 && Convert.ToDouble(model.WS) <= 24.4)  
  21.     {  
  22.         color.R = 254;  
  23.         color.G = 243;  
  24.         color.B = 0;  
  25.         symbol.Color = new SolidColorBrush(color);  
  26.     }  
  27.     else if (Convert.ToDouble(model.WS) > 24.4 && Convert.ToDouble(model.WS) <= 32.6)  
  28.     {  
  29.         color.R = 254;  
  30.         color.G = 144;  
  31.         color.B = 44;  
  32.         symbol.Color = new SolidColorBrush(color);  
  33.     }  
  34.     else if (Convert.ToDouble(model.WS) > 32.6 && Convert.ToDouble(model.WS) <= 41.4)  
  35.     {  
  36.         color.R = 254;  
  37.         color.G = 4;  
  38.         color.B = 4; symbol.Color = new SolidColorBrush(color);  
  39.     }  
  40.     else if (Convert.ToDouble(model.WS) > 41.4 && Convert.ToDouble(model.WS) <= 50.9)  
  41.     {  
  42.         color.R = 254;  
  43.         color.G = 58;  
  44.         color.B = 163; symbol.Color = new SolidColorBrush(color);  
  45.     }  
  46.     else if (Convert.ToDouble(model.WS) > 50.9)  
  47.     {  
  48.         color.R = 174;  
  49.         color.G = 0;  
  50.         color.B = 217; symbol.Color = new SolidColorBrush(color);  
  51.     }  
  52.  
  53.     symbol.Size = 10;  
  54.     if (i == 0)  
  55.     {  
  56.         symbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square;  
  57.     }  
  58.     else 
  59.     {  
  60.         symbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Circle;  
  61.     }  
  62.  
  63.     pointParam.Add(new Graphic()  
  64.     {  
  65.         Geometry = new MapPoint(model.Longitude, model.Latitude),  
  66.         Symbol = symbol  
  67.     });  
  68.  
  69.     pointParam[i].Attributes.Add("TyphoonID", model.TyphoonID);  
  70.     pointParam[i].Attributes.Add("TyphoonNo", model.TyphoonNo);  
  71.     pointParam[i].Attributes.Add("TyphoonName", model.TyphoonName);  
  72.     pointParam[i].Attributes.Add("WindCircle7", model.WindCircle7);  
  73.     pointParam[i].Attributes.Add("WindCircle10", model.WindCircle10);  
  74.     pointParam[i].Attributes.Add("WS", model.WS);  
  75.     pointParam[i].Attributes.Add("Pressure", model.Pressure);  
  76.     pointParam[i].Attributes.Add("IssueTime", model.IssueTime);  
  77.     pointParam[i].Attributes.Add("Future", model.Future);  
  78.     pointParam[i].Attributes.Add("Latitude", model.Latitude);  
  79.     pointParam[i].Attributes.Add("Longitude", model.Longitude);  

信息提示功能如图:




我们先看下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.  
  4.     <StackPanel Orientation="Vertical" Height="168" Width="176" Canvas.Left="137" Canvas.Top="15"> 
  5.         <TextBlock x:Name="typhoonNameTextBlock" Height="20" Text="名称:" Foreground="White" TextWrapping="Wrap"/> 
  6.         <TextBlock x:Name="typhoonCollectionTimeTextBlock" Height="20" Text="时间:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/> 
  7.         <TextBlock x:Name="typhoonPositionTextBlock" Height="20" Text="位置:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/> 
  8.         <TextBlock x:Name="typhoonWSTextBlock" Height="20" Text="最大风速:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/> 
  9.         <TextBlock x:Name="typhoonPressureTextBlock" Height="20" Text="中心气压:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/> 
  10.         <TextBlock x:Name="typhoonCircle7TextBlock" Height="20" Text="7级风圈半径:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/> 
  11.         <TextBlock x:Name="typhoonCircle10TextBlock" Height="20" Text="10级风圈半径:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/> 
  12.  
  13.     </StackPanel> 
  14. </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.  
  5. // 添加点事件  
  6. foreach (Graphic item in point)  
  7. {  
  8.     item.MouseEnter += new MouseEventHandler(MainPage_MouseEnter);  
  9.     item.MouseLeave += new MouseEventHandler(MainPage_DrawLine);  

 

 
 
  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.     // 添加线的代码  
  22.     pointLine = new ESRI.ArcGIS.Client.Geometry.PointCollection();  
  23.     AddLineToMap(e.Result.ToList(), length, pointLine);  
  24.  
  25.     // 显示点层  
  26.     GisMap.DrawAllLayers(myMap, new GraphicsLayer[] { gLayer }, point);  
  27.     GisMap.AddLayersToMap(myMap, new GraphicsLayer[] { gLayer });  

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

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值