调用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 > |
< BR > |
< 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)左右加载到地图上的时候,
就会非常的卡,基本都动不了,所以我们要动态去加载这些点。