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

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

概述  ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(三)--绘制点、线、圆,显示提示信息 平台:Vs 2010,Blend 4,Silverlight 4 调用API: ArcGis for Silverligth API(ESRI.ArcGIS.Client) 转载自:http://www.cnblogs.com/Royal_WH/archive/20   ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(三)--绘制点、线、圆,显示提示信息

平台:Vs 2010,Blend 4,Silverlight 4

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

转载自:http://www.cnblogs.com/Royal_WH/archive/2010/11/05/1869906.html

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

有空大家共同讨论。


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

view source print ?
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 }

好,看一下如何画圆吧。

view source print ?
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

我前台是这样调用的

view source print ?
/// <summary>
  /// 绘制7级风圈和10级风圈
  /// </summary>
  /// <param name="myMap"></param>
  /// <param name="sender"></param>
  public voID DrawEllipse7And10WindCircle(Map myMap,object sender)
  {
                  if (GisMap.LayerExist(myMap,"WindCircleLayer"))           
view source print ?
 {                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,
                    Convert.Todouble(tipGraphic.Attributes["WindCircle10"]),colors.Blue);
            }
  
  
            GisMap.AddLayersToMap(myMap,new ElementLayer[] { circleLayer });
        }

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


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

view source print ?
/// <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中的代码:

 

view source print ?
<Canvas x:name="typhoonPointInfoCanvas" Visibility="Visible" Height="188" HorizontalAlignment="left" margin="0,-272,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>
@H_404_3772@ view source print ?
<BR>
@H_404_3772@ view source print ?
        <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


 

view source print ?
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 }

 

 

 

view source print ?
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 }

 

view source print ?
1 AddPointToGraphic这个方法就是图片上面的那段代码
view source print ?
1 <SPAN style="Font-SIZE: 14px"> item.MouseEnter += new MouseEventHandler(MainPage_MouseEnter);     </SPAN>
view source print ?
1  item.MouseLeave += new MouseEventHandler(MainPage_Drawline);  
view source print ?
1 这两段代码就是我们添加鼠标移入和移出事件了,我们看下移入事件:
view source print ?
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));
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>
view source print ?
1 我们看到在显示信息的同时我们又把圆画了上去<SPAN style="Font-SIZE: 14px">DrawEllipse7And10WindCircle()这个函数</SPAN>

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

view source print ?
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     }
view source print ?
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, 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)左右加载到地图上的时候,

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

总结

以上是内存溢出为你收集整理的ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(三)--绘制点、线、圆,显示提示信息全部内容,希望文章能够帮你解决ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(三)--绘制点、线、圆,显示提示信息所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1072211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存