• 【网摘】ArcGis for silverlights api 地图显示Gis绘制点线绘制图 以及提示信息 from


     

    平台:Vs 2010,Blend 4,Silverlight 4

    调用API: ArcGis for Silverligth API(ESRI.ArcGIS.Client)


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

    有空大家共同讨论。


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

    01 /// <summary>
    02 /// 绘制界面上的点和线
    03 /// </summary>
    04 /// <param name="myMap"></param>
    05 /// <param name="point"></param>
    06 /// <param name="pointLine"></param>
    07 public void DrawAnimationCompleted(Map myMap, List<Graphic> point,ESRI.ArcGIS.Client.Geometry.PointCollection pointLine)
    08 {
    09     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 });
    22 }

    好,看一下如何画圆吧。

    01 /// <summary>
    02 /// 在地图上绘制圆
    03 /// </summary>
    04 /// <param name="myMap">地图</param>
    05 /// <param name="container">绘制容器</param>
    06 /// <param name="pt">要绘制的点</param>
    07 /// <param name="drawCircleLayer"></param>
    08 /// <param name="circleKm">直径</param>
    09 /// <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);
    39 }

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

    我前台是这样调用的

    /// <summary>
      /// 绘制7级风圈和10级风圈
      /// </summary>
      /// <param name="myMap"></param>
      /// <param name="sender"></param>
      public void DrawEllipse7And10WindCircle(Map myMap, object sender)
      {
                      if (GisMap.LayerExist(myMap, "WindCircleLayer"))           
     {                GisMap.DeleteLayersToMap(myMap, "WindCircleLayer");            }
      
                ElementLayer circleLayer = new ElementLayer();
                circleLayer.ID = "WindCircleLayer";
      
                Canvas circleCanvas = new Canvas();
      
                Graphic tipGraphic = sender as Graphic;
      
                if (Convert.ToDouble(tipGraphic.Attributes["WindCircle7"]) != 0)
                {
                    Color color = new Color();
                    color.A = 255;
                    color.R = 153;
                    color.G = 105;
                    color.B = 192;
      
                    DrawEllipse(myMap, circleCanvas, new MapPoint(Convert.ToDouble(tipGraphic.Attributes["Longitude"]),
                        Convert.ToDouble(tipGraphic.Attributes["Latitude"])), ref circleLayer,
                        Convert.ToDouble(300), color, Colors.Blue);
      
                }
      
                if (Convert.ToDouble(tipGraphic.Attributes["WindCircle10"]) != 0)
                {
                    Color color = new Color();
                    color.A = 255;
                    color.R = 111;
                    color.G = 91;
                    color.B = 171;
      
                    this.DrawEllipse(myMap, circleCanvas, new MapPoint(Convert.ToDouble(tipGraphic.Attributes["Longitude"]),
                        Convert.ToDouble(tipGraphic.Attributes["Latitude"])), ref circleLayer,
                        Convert.ToDouble(tipGraphic.Attributes["WindCircle10"]), color, Colors.Blue);
                }
      
      
                GisMap.AddLayersToMap(myMap, new ElementLayer[] { circleLayer });
            }

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


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

    /// <summary>
    /// 添加台风点代码
    /// 添加鼠标移入、移出事件
    /// </summary>
    /// <param name="model"></param>
    /// <param name="i"></param>
    private void AddPointToGraphic(TyphoonModel model, int i, List<Graphic> pointParam)
    {
        SimpleMarkerSymbol symbol = new SimpleMarkerSymbol();
        Color color = new Color();
        color.A = 255;
          
        if (Convert.ToDouble(model.WS) <= 17.1)
        {
            color.R = 0;
            color.G = 254;
            color.B = 223;
            symbol.Color = new SolidColorBrush(color);
        }
        else if (Convert.ToDouble(model.WS) > 17.1 && Convert.ToDouble(model.WS) <= 24.4)
        {
            color.R = 254;
            color.G = 243;
            color.B = 0;
            symbol.Color = new SolidColorBrush(color);
        }
        else if (Convert.ToDouble(model.WS) > 24.4 && Convert.ToDouble(model.WS) <= 32.6)
        {
            color.R = 254;
            color.G = 144;
            color.B = 44;
            symbol.Color = new SolidColorBrush(color);
        }
        else if (Convert.ToDouble(model.WS) > 32.6 && Convert.ToDouble(model.WS) <= 41.4)
        {
            color.R = 254;
            color.G = 4;
            color.B = 4; symbol.Color = new SolidColorBrush(color);
        }
        else if (Convert.ToDouble(model.WS) > 41.4 && Convert.ToDouble(model.WS) <= 50.9)
        {
            color.R = 254;
            color.G = 58;
            color.B = 163; symbol.Color = new SolidColorBrush(color);
        }
        else if (Convert.ToDouble(model.WS) > 50.9)
        {
            color.R = 174;
            color.G = 0;
            color.B = 217; symbol.Color = new SolidColorBrush(color);
        }
     
        symbol.Size = 10;
        if (i == 0)
        {
            symbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square;
        }
        else
        {
            symbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Circle;
        }
     
        pointParam.Add(new Graphic()
        {
            Geometry = new MapPoint(model.Longitude, model.Latitude),
            Symbol = symbol
        });
     
        pointParam[i].Attributes.Add("TyphoonID", model.TyphoonID);
        pointParam[i].Attributes.Add("TyphoonNo", model.TyphoonNo);
        pointParam[i].Attributes.Add("TyphoonName", model.TyphoonName);
        pointParam[i].Attributes.Add("WindCircle7", model.WindCircle7);
        pointParam[i].Attributes.Add("WindCircle10", model.WindCircle10);
        pointParam[i].Attributes.Add("WS", model.WS);
        pointParam[i].Attributes.Add("Pressure", model.Pressure);
        pointParam[i].Attributes.Add("IssueTime", model.IssueTime);
        pointParam[i].Attributes.Add("Future", model.Future);
        pointParam[i].Attributes.Add("Latitude", model.Latitude);
        pointParam[i].Attributes.Add("Longitude", model.Longitude);
    }


    信息提示功能如图:




    我们先看下Xmal中的代码:

     

    <Canvas x:Name="typhoonPointInfoCanvas" Visibility="Visible" Height="188" HorizontalAlignment="Left" Margin="0,-272,0,0" VerticalAlignment="Top" Width="360">
        <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}"/>
     
        <StackPanel Orientation="Vertical" Height="168" Width="176" Canvas.Left="137" Canvas.Top="15">
            <TextBlock x:Name="typhoonNameTextBlock" Height="20" Text="名称:" Foreground="White" TextWrapping="Wrap"/>
            <TextBlock x:Name="typhoonCollectionTimeTextBlock" Height="20" Text="时间:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
            <TextBlock x:Name="typhoonPositionTextBlock" Height="20" Text="位置:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
            <TextBlock x:Name="typhoonWSTextBlock" Height="20" Text="最大风速:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
            <TextBlock x:Name="typhoonPressureTextBlock" Height="20" Text="中心气压:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
            <TextBlock x:Name="typhoonCircle7TextBlock" Height="20" Text="7级风圈半径:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
            <TextBlock x:Name="typhoonCircle10TextBlock" Height="20" Text="10级风圈半径:" Foreground="White" TextWrapping="Wrap" d:LayoutOverrides="HorizontalAlignment"/>
     
        </StackPanel>
    </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><BR>

    看下c# 中的代码:

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


     

    01 // 添加点和线,先显示点层,动画结束后显示线层
    02 mapDraw.DrawLineAndPoint(ref point, myMap, gLayer, ref pointLine, e, length);
    03  
    04  
    05 // 添加点事件
    06 foreach (Graphic item in point)
    07 {
    08     item.MouseEnter += new MouseEventHandler(MainPage_MouseEnter);
    09     item.MouseLeave += new MouseEventHandler(MainPage_DrawLine);
    10 }
    01 /// <summary>
    02 /// 绘制单条台风动画前的信息
    03 /// </summary>
    04 /// <param name="point"></param>
    05 /// <param name="myMap"></param>
    06 /// <param name="gLayer"></param>
    07 /// <param name="pointLine"></param>
    08 /// <param name="e"></param>
    09 /// <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 });
    28 }
    1 AddPointToGraphic这个方法就是图片上面的那段代码
    1 <SPAN style="FONT-SIZE: 14px"> item.MouseEnter += new MouseEventHandler(MainPage_MouseEnter);     </SPAN>
    1  item.MouseLeave += new MouseEventHandler(MainPage_DrawLine);  
    1 这两段代码就是我们添加鼠标移入和移出事件了,我们看下移入事件:
    01 <DIV class=cnblogs_Highlighter><PRE class=brush:csharp>        void MainPage_MouseEnter(object sender, MouseEventArgs e)
    02         {
    03             Graphic graphic = sender as Graphic;
    04             Cursor = Cursors.Hand;
    05   
    06             typhoonPointInfoCanvas.Visibility = Visibility.Visible;
    07   
    08             Point pt = myMap.MapToScreen(new MapPoint(Convert.ToDouble(graphic.Attributes["Longitude"]), Convert.ToDouble(graphic.Attributes["Latitude"])));
    09   
    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>
    1 我们看到在显示信息的同时我们又把圆画了上去<SPAN style="FONT-SIZE: 14px">DrawEllipse7And10WindCircle()这个函数</SPAN>

    GisMap是个静态类,以下是他的代码

    01 /// <summary>
    02 /// ArcGis 调用类
    03 /// 动态加载、显示隐藏层数据、加载层上的点等
    04 /// 日期:2010-5-10
    05 /// 作者:AngelSoft
    06 /// </summary>
    07 public static class GisMap
    08 {
    09  
    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     }
    001     /// <summary>
    002     /// 加载所有图层上的点
    003     /// 动态绘制
    004     /// 图层和点的对应关系要正确
    005     /// 有几个图层就要有几个点集合
    006     /// </summary>
    007     /// <param name="map">ArcGis 地图变量</param>
    008     /// <param name="layers">GraphicLayer 层数组</param>
    009     /// <param name="graphicParam">Graphic 点数组</param>
    010     public static void DrawLayers(Map map, GraphicsLayer[] layers, params List<Graphic>[] graphicParam)
    011     {
    012         // 计算要绘制的层数并一层一层的绘制(调用动态绘制方法)
    013         if (layers != null)
    014         {
    015             int length = layers.Length;
    016             for (int i = 0; i < length; i++)
    017             {
    018                 if (layers[i] == null)
    019                 {
    020                     layers[i] = new GraphicsLayer();
    021                 }
    022                 DynamicDrawSymbol(layers[i], graphicParam[i], map);
    023             }
    024         }
    025     }
    026  
    027  
    028     /// <summary>
    029     /// 加载所有图层上的点
    030     /// 画所有点
    031     /// 图层和点的对应关系要正确
    032     /// 有几个图层就要有几个点集合
    033     /// </summary>
    034     /// <param name="map">ArcGis 地图变量</param>
    035     /// <param name="layers">GraphicLayer 层数组</param>
    036     /// <param name="graphicParam">Graphic 点数组</param>
    037     public static void DrawAllLayers(Map map, GraphicsLayer[] layers, params List<Graphic>[] graphicParam)
    038     {
    039         // 计算要绘制的层数并一层一层的绘制(调用动态绘制方法)
    040         if (layers != null)
    041         {
    042             int length = layers.Length;
    043             for (int i = 0; i < length; i++)
    044             {
    045                 if (layers[i] == null)
    046                 {
    047                     layers[i] = new GraphicsLayer();
    048                 }
    049                 DrawAllGraphics(layers[i], graphicParam[i]);
    050             }
    051         }
    052     }
    053  
    054  
    055  
    056     /// <summary>
    057     /// 隐藏或显示 ArcGis 层
    058     /// </summary>
    059     /// <param name="show">隐藏或显示</param>
    060     /// <param name="layers">层</param>
    061     public static void LayersVisibility(bool show, params GraphicsLayer[] layers)
    062     {
    063         if (layers != null)
    064         {
    065             foreach (GraphicsLayer item in layers)
    066             {
    067                 item.Visible = show;
    068             }
    069         }
    070     }
    071  
    072  
    073     /// <summary>
    074     /// 将图层数组全部从 map 中移除
    075     /// </summary>
    076     /// <param name="map">表示一张 ArcGis 地图</param>
    077     /// <param name="layers">表示地图层的数组</param>
    078     public static void DeleteLayersToMap(Map map, GraphicsLayer[] layers)
    079     {
    080         // 逐个将数据移除
    081         foreach (GraphicsLayer item in layers)
    082         {
    083             map.Layers.Remove(item);
    084         }
    085     }
    086  
    087     /// <summary>
    088     /// 根据 ID 号删除某层
    089     /// </summary>
    090     /// <param name="map"></param>
    091     /// <param name="ID"></param>
    092     /// <returns></returns>
    093     public static void DeleteLayersToMap(Map map, string[] ID)
    094     {
    095         int length = ID.Length;
    096  
    097         for (int i = 0; i < length; i++)
    098         {
    099             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)左右加载到地图上的时候,

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

  • 相关阅读:
    http数据返回值
    刷新 返回
    微信平台上遇到的bug
    iscroll修改
    iscroll
    a标签的herf和click事件
    ios9+xcode7 适配笔记
    xsd、wsdl生成C#类的命令行工具使用方法
    xcode更新,想想也是醉了
    关于#define预处理指令的一个问题
  • 原文地址:https://www.cnblogs.com/maliya/p/1870000.html
Copyright © 2020-2023  润新知