zoukankan      html  css  js  c++  java
  • 【网摘】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=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)左右加载到地图上的时候,

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

  • 相关阅读:
    搜索回车跳转页面
    登录验证码
    【排序算法】排序算法之插入排序
    PAT 乙级 1044 火星数字 (20 分)
    PAT 甲级 1035 Password (20 分)
    PAT 甲级 1041 Be Unique (20 分)
    PAT 甲级 1054 The Dominant Color (20 分)
    PAT 甲级 1027 Colors in Mars (20 分)
    PAT 甲级 1083 List Grades (25 分)
    PAT 甲级 1005 Spell It Right (20 分)
  • 原文地址:https://www.cnblogs.com/maliya/p/1870000.html
Copyright © 2011-2022 走看看