/// <summary> /// 向PWEB查詢一周預報 /// </summary> /// <returns></returns> public QueryPWEBTaipeiWeatherData Query() { QueryPWEBTaipeiWeatherData result = new QueryPWEBTaipeiWeatherData(); using (WebClient client = new WebClient() { Encoding = Encoding.UTF8 }) { var json = client.DownloadString($@"{PWEBSetting.PWEBBaseUrl}{PWEBSetting.PWEBKey}"); result = Newtonsoft.Json.JsonConvert.DeserializeObject <QueryPWEBTaipeiWeatherData>(json); } return(result); }
/// <summary> /// 分析資料並存入DB /// </summary> /// <param name="data"></param> /// <returns></returns> public List <TaipeiWeather> ParseData(QueryPWEBTaipeiWeatherData data) { List <TaipeiWeather> result = new List <TaipeiWeather>(); Locations location = data.records.locations.First(); var CityName = location.locationsName; foreach (var area in location.location) { var AreaName = area.locationName; foreach (var EleType in area.weatherElement) { //按照時間區間建立空資料 foreach (var TimeRange in EleType.time) { var ResultData = result.Where(x => x.EndTime == TimeRange.endTime && x.StartTime == TimeRange.startTime && x.Location == CityName + AreaName).FirstOrDefault(); if (ResultData == null) { ResultData = new TaipeiWeather() { Location = CityName + AreaName, EndTime = TimeRange.endTime, StartTime = TimeRange.startTime }; result.Add(ResultData); } Byte numval = 0; Byte.TryParse(TimeRange.elementValue.First().value, out numval); switch (EleType.elementName) { case "PoP12h": //降雨機率 ResultData.RainChance = numval; break; case "T": //平均溫度 ResultData.Temperature = numval; break; case "RH": //平均相對濕度 ResultData.RelativeHumidity = numval; break; case "MinCI": //最小舒適度指數 ResultData.MinCi = numval; break; case "WS": //最大風速 ResultData.WindSpeed = numval; break; case "MaxAT": //最高體感溫度 ResultData.MaxAt = numval; break; case "Wx": //天氣現象 ResultData.Weather = TimeRange.elementValue.First().value; break; case "MaxCI": //最大舒適度指數 ResultData.MaxCi = numval; break; case "MinT": //最低溫度 ResultData.MinTemperature = numval; break; case "UVI": //紫外線指數 ResultData.Uvi = numval; break; case "WeatherDescription": //天氣預報綜合描述 ResultData.WeatherDescription = TimeRange.elementValue.First().value; break; case "MinAT": //最低體感溫度 ResultData.MinAt = numval; break; case "MaxT": //最高溫度 ResultData.MaxTemperature = numval; break; case "WD": //風向 ResultData.WindDirection = TimeRange.elementValue.First().value; break; case "Td": //平均露點溫度 ResultData.Td = numval; break; } } } } using (var db = new PwebtaipeiContext()) { foreach (TaipeiWeather weather in result) { if (db.TaipeiWeather.Any(x => x.Location == weather.Location && x.StartTime == weather.StartTime && x.EndTime == weather.EndTime)) { db.TaipeiWeather.Update(weather); } else { db.TaipeiWeather.Add(weather); } } db.SaveChanges(); } return(result); }
/// <summary> /// 按照指定日期取得資料庫中的舊資料,如果沒有指定日期,則向PWEB取得當日起一周預報 /// </summary> /// <param name="location">區</param> /// <param name="date">日期</param> /// <returns></returns> public LineChartViewModel get(string location = null, DateTime?STdate = null, DateTime?EDdate = null) { List <TaipeiWeather> dataresult = new List <TaipeiWeather>(); if ((STdate == null) || (EDdate == null)) { if (!service.checkNew()) { //未指定日期且無新資料,向PWEB取一周預報資料 QueryPWEBTaipeiWeatherData data = service.Query(); //解析預報資料 dataresult = service.ParseData(data); } else { //已有資料可從資料庫取得,避免頻繁向PWEB取資料拖慢效能 dataresult = service.getData(location, DateTime.Now, DateTime.Now.AddDays(7)); } } else { //按照指定日期區間從資料庫取出資料 dataresult = service.getData(location, STdate.Value, EDdate.Value); } if (string.IsNullOrEmpty(location)) { //由於未指定地區,將從第一筆的地區做為預設 dataresult = dataresult.Where(x => x.Location == dataresult.FirstOrDefault().Location).ToList(); } else { dataresult = dataresult.Where(x => x.Location == location).ToList(); } LineChartViewModel result = new LineChartViewModel(); //取得歷史資料中的地區以及時間區間供前端選擇 var HistoryArea = service.getHistoryRange(); //轉換成Viewmodel result.Area = HistoryArea.Select(x => x.Location).Distinct().ToList(); var range = HistoryArea.SelectMany(x => x.TimeRange).ToList(); result.ListStartTime = range.Distinct().Select(x => x.StartTime.ToString("yyyy-MM-dd HH:mm:ss")).Distinct().ToList(); result.ListEndTime = range.Distinct().Select(x => x.EndTime.ToString("yyyy-MM-dd HH:mm:ss")).Distinct().ToList(); result.series = new List <string>() { "降雨機率", "平均溫度", "平均相對濕度", "最小舒適度指數", "最大風速", "最高體感溫度", "最大舒適度指數", "最低溫度", "紫外線指數", "最低體感溫度", "最高溫度", "平均露點溫度" }; List <List <string> > Labels = new List <List <string> >(); foreach (var dt in dataresult) { List <string> datelabel = new List <string>(); datelabel.Add(dt.StartTime.ToString("yyyy-MM-dd hh:mm:ss ~")); datelabel.Add(dt.EndTime.ToString("yyyy-MM-dd hh:mm:ss")); datelabel.Add(dt.Weather); //datelabel.Add(dt.WeatherDescription); //加這行會跑版 datelabel.Add(dt.WindDirection); Labels.Add(datelabel); } result.Label = Labels; List <List <byte> > DataVals = new List <List <byte> >(); DataVals.Add(dataresult.Select(x => x.RainChance).ToList()); //降雨機率 DataVals.Add(dataresult.Select(x => x.Temperature).ToList()); //平均溫度 DataVals.Add(dataresult.Select(x => x.RelativeHumidity).ToList()); //平均相對濕度 DataVals.Add(dataresult.Select(x => x.MinCi).ToList()); //最小舒適度指數 DataVals.Add(dataresult.Select(x => x.WindSpeed).ToList()); //最大風速 DataVals.Add(dataresult.Select(x => x.MaxAt).ToList()); //最高體感溫度 DataVals.Add(dataresult.Select(x => x.MaxCi).ToList()); //最大舒適度指數 DataVals.Add(dataresult.Select(x => x.MinTemperature).ToList()); //最低溫度 DataVals.Add(dataresult.Select(x => x.Uvi).ToList()); //紫外線指數 DataVals.Add(dataresult.Select(x => x.MinAt).ToList()); //最低體感溫度 DataVals.Add(dataresult.Select(x => x.MaxTemperature).ToList()); //最高溫度 DataVals.Add(dataresult.Select(x => x.Td).ToList()); //平均露點溫度 result.data = DataVals; return(result); }