Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }