zoukankan      html  css  js  c++  java
  • 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.     // 画线到图层上并绘制到地图上  
    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)左右加载到地图上的时候,

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

  • 相关阅读:
    python函数收集不确定数量的值
    PHP比较数组、对象是否为空
    PHP实现斐波那契数列
    Python之复制列表
    1004. 最大连续1的个数 III(滑动窗口)
    276. 栅栏涂色(动态规划)
    376. 摆动序列
    148. 排序链表
    143. 重排链表
    1530. 好叶子节点对的数量
  • 原文地址:https://www.cnblogs.com/changbaishan/p/3398309.html
Copyright © 2011-2022 走看看