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

 

平台: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>
07public 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>
11public 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// 添加点和线,先显示点层,动画结束后显示线层
02mapDraw.DrawLineAndPoint(ref point, myMap, gLayer, ref pointLine, e, length);
03 
04 
05// 添加点事件
06foreach (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>
10public 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}

 

1AddPointToGraphic这个方法就是图片上面的那段代码
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>
07public 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)左右加载到地图上的时候,

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

转载于:https://www.cnblogs.com/maliya/archive/2010/11/05/1870000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值