#region 降雨動畫演示 2014-04-16
List<Graphic> graphics = new List<Graphic>();
int INDEX = 0;
MapPoint GLOBAL = new MapPoint(); //儲存上一次繪製降雨圈的點資訊 2014-04-16
int INDEX_2 = 0; //控制是否是第一次繪製降雨圈
/// <summary>
/// 從資料庫獲取資料,並繪製圓
/// </summary>
public void DrawRainEllipseFromDatabase()
{
getMapDataSoapClient client = new getMapDataSoapClient();
client.getJYDataByTimeSpanCompleted += new EventHandler<getJYDataByTimeSpanCompletedEventArgs>(client_getJYDataByTimeSpanCompleted);
client.getJYDataByTimeSpanAsync("2014-04-08", "2014-04-11");
}
void client_getJYDataByTimeSpanCompleted(object sender, getJYDataByTimeSpanCompletedEventArgs e)
{
//GraphicsLayer graphicsLayer = myMap.Layers["YLPointsLayer"] as GraphicsLayer;
//graphicsLayer.ClearGraphics();
ObservableCollection<JYDW> rets = e.Result;
Graphic graphic;
foreach (JYDW item in rets)
{
graphic = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.LGTD.ToString().Trim()), double.Parse(item.LTTD.ToString().Trim()))),
Symbol = LayoutRoot.Resources["BlueMarkerSymbol"] as Symbol
};
//儲存屬性
graphic.Attributes["STCD"] = item.CMAXSTCD; //雨量站編碼
graphic.Attributes["TM"] = item.TM; //時間
graphic.Attributes["RainV"] = item.CDRP; //雨量站名稱
graphic.Attributes["CDNUM"] = item.CDNUM; //降雨站數
graphic.Attributes["LGTD"] = item.LGTD; //經度
graphic.Attributes["LTTD"] = item.LTTD; //緯度
graphics.Add(graphic);
//graphicsLayer.Graphics.Add(graphic);
}
}
/// <summary>
/// 在地圖上繪製圓
/// </summary>
/// <param name="myMap">地圖</param>
/// <param name="container">繪製容器</param>
/// <param name="pt">要繪製的點</param>
/// <param name="drawCircleLayer"></param>
/// <param name="circleKm">直徑</param>
/// <param name="color">填充色</param>
/// <param name="ellipseStroke">邊框色</param>
public void DrawEllipse(Map myMap, Canvas container, MapPoint pt, ref ElementLayer drawCircleLayer, double circleKm, Color color, Color ellipseStroke)
{
if (!drawCircleLayer.Children.Contains(container))
{
drawCircleLayer.Children.Add(container);
container.Opacity = 0.7;
container.SetValue(ElementLayer.EnvelopeProperty, new Envelope(myMap.Extent.XMax, myMap.Extent.YMax, myMap.Extent.XMin, myMap.Extent.YMin));
}
Point ptFirst = myMap.MapToScreen(new MapPoint(Convert.ToDouble(pt.X), Convert.ToDouble(pt.Y)));
Point pt7 = myMap.MapToScreen(new MapPoint((Convert.ToDouble(pt.X) + (circleKm * 1000)), Convert.ToDouble(pt.Y)));
Ellipse ellipse7 = new Ellipse();
ellipse7.Width = (pt7.X - ptFirst.X)*2;
ellipse7.Height = ellipse7.Width;
ellipse7.StrokeThickness = 1;
ellipse7.Stroke = new SolidColorBrush(ellipseStroke);
ellipse7.Fill = new SolidColorBrush(color);
Canvas.SetLeft(ellipse7, ptFirst.X - ellipse7.Width / 2);
Canvas.SetTop(ellipse7, ptFirst.Y - ellipse7.Width / 2);
ellipse7.Opacity = 0.7;
container.Children.Add(ellipse7);
container.IsHitTestVisible = false;
container.SetValue(Canvas.ZIndexProperty, 1);
GLOBAL = WKIDConvert.mercator2lonlat(ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(pt) as ESRI.ArcGIS.Client.Geometry.MapPoint);//每次繪製降雨圈後,將值儲存起來
}
/// <summary>
/// 繪製點
/// </summary>
public void DrawPoint(MapPoint mp,Graphic g)
{
GraphicsLayer graphicsLayer = myMap.Layers["YLPointsLayer"] as GraphicsLayer;
GraphicsLayer graphicsLayerText = myMap.Layers["GraphicsLayerRed"] as GraphicsLayer;
//動態標記點元素
Graphic graphic = new Graphic()
{
Geometry = mp,
Symbol = LayoutRoot.Resources["BlueMarkerSymbol"] as Symbol
};
graphicsLayer.Graphics.Add(graphic);
//動態標記數值
TextSymbol textSymbol = new TextSymbol()
{
FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"),
Foreground = new System.Windows.Media.SolidColorBrush(ColorRevert.ToColor(tip_Base.DXT_COLOR)),
FontSize = 16,
Text = g.Attributes["RainV"].ToString(),
OffsetX = 10,
OffsetY = 23
};
Graphic graphicText = new Graphic()
{
Geometry = mp,
Symbol = textSymbol
};
graphicsLayerText.Graphics.Add(graphicText);
}
/// <summary>
/// 繪製連線線
/// </summary>
public void DrawLine(MapPoint gS, MapPoint gE)
{
List<ESRI.ArcGIS.Client.Geometry.Polyline> polylineList = new List<ESRI.ArcGIS.Client.Geometry.Polyline>();
ESRI.ArcGIS.Client.Geometry.PointCollection pointCollection = new ESRI.ArcGIS.Client.Geometry.PointCollection();
pointCollection.Add(gS);
pointCollection.Add(gE);
ESRI.ArcGIS.Client.Geometry.Polyline polyline = new ESRI.ArcGIS.Client.Geometry.Polyline();
polyline.Paths.Add(pointCollection);
polylineList.Add(polyline);
GraphicsLayer graphicsLayer = myMap.Layers["GraphicsDWLine"] as GraphicsLayer;
foreach (ESRI.ArcGIS.Client.Geometry.Polyline pl in polylineList)
{
Graphic graphic = new Graphic()
{
Symbol = LayoutRoot.Resources["DefaultLineSymbol"] as Symbol,
Geometry = mercator.FromGeographic(pl)
};
graphicsLayer.Graphics.Add(graphic);
}
}
/// <summary>
/// 繪製每小時降雨圈
/// </summary>
/// <param name="myMap"></param>
/// <param name="sender"></param>
public void DrawEllipseHourRainCircle(Map myMap, object sender)
{
INDEX_2++;
if (GisMap.LayerExist(myMap, "RainAnimationLayer"))
{
GisMap.DeleteLayersToMap(myMap, "RainAnimationLayer");
}
ElementLayer circleLayer = new ElementLayer();
circleLayer.ID = "RainAnimationLayer";
Canvas circleCanvas = new Canvas();
Graphic tipGraphic = sender as Graphic;
//通過過濾為0的值,這樣經緯度座標沒有值的也被過濾掉
if (Convert.ToDouble(tipGraphic.Attributes["RainV"]) != 0)
{
Color color = new Color();
double V = double.Parse(tipGraphic.Attributes["RainV"].ToString());
if (V < 10)
{
color = ColorRevert.ToColor("#FF3FC816");
}
else if (V >= 10 && V < 25)
{
color = ColorRevert.ToColor("#FF1016FE");
}
else if (V >= 25 && V < 50)
{
color = ColorRevert.ToColor("#FFFFEB00");
}
else if (V >= 50 && V < 100)
{
color = ColorRevert.ToColor("#FFFF871C");
}
else if (V >= 100 && V < 200)
{
color = ColorRevert.ToColor("#FFEB27A5");
}
else if (V >= 200)
{
color = ColorRevert.ToColor("#FFE8353B");
}
//第一步:繪製降雨點
DrawPoint(WKIDConvert.lonlat2mercator(new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]),
Convert.ToDouble(tipGraphic.Attributes["LTTD"]))), tipGraphic);
//第二步:繪製站點連線線
if (INDEX_2 == 1)
{
DrawLine(new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]),
Convert.ToDouble(tipGraphic.Attributes["LTTD"])), new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]),
Convert.ToDouble(tipGraphic.Attributes["LTTD"])));
}
else
{
DrawLine(GLOBAL, new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]),
Convert.ToDouble(tipGraphic.Attributes["LTTD"])));
}
//第三步:繪製降雨圈
this.DrawEllipse(myMap, circleCanvas, WKIDConvert.lonlat2mercator(new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]),
Convert.ToDouble(tipGraphic.Attributes["LTTD"]))), ref circleLayer,
Convert.ToDouble(tipGraphic.Attributes["CDNUM"]), color, color);
}
GisMap.AddLayersToMap(myMap, new ElementLayer[] { circleLayer });
}
DispatcherTimer timer = new DispatcherTimer();
private void btnDW_Click(object sender, System.Windows.RoutedEventArgs e)
{
DrawRainEllipseFromDatabase(); // 先繪點並儲存資料
double d = 1;
try
{
d = double.Parse(this.tbSecond.Text.Trim());
}
catch (Exception)
{
MessageBox.Show("請輸入數字!");
}
timer.Interval = TimeSpan.FromSeconds(d);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
try
{
if (INDEX < graphics.Count)
{
DrawEllipseHourRainCircle(myMap, graphics[INDEX]);
this.tb_SJ.Text = "";
this.tb_ZM.Text = "";
this.tb_YL.Text = "";
this.tb_SJ.Text = DateTime.Parse(graphics[INDEX].Attributes["TM"].ToString()).ToString("yyyy-MM-dd HH:mm");
this.tb_ZM.Text = graphics[INDEX].Attributes["STCD"].ToString().Trim();
this.tb_YL.Text = graphics[INDEX].Attributes["RainV"].ToString().Trim();
INDEX++; //自增
}
else
{
//INDEX = 0;
timer.Stop(); //動畫過程停止
}
}
catch (Exception ex)
{
return;
}
}
#endregion