)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Weather (Ia.Cl.Model)

Public general use code classes and xml files that we've compiled and used over the years:

Weather class

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Configuration;
    4: using System.Runtime.Serialization;
    5: using System.Xml.Linq;
    6: using Microsoft.AspNetCore.Mvc;
    7:  
    8: namespace Ia.Cl.Model
    9: {
   10:     ////////////////////////////////////////////////////////////////////////////
   11:  
   12:     /// <summary publish="true">
   13:     /// Weather class
   14:     /// </summary>
   15:     /// 
   16:     /// <remarks> 
   17:     /// Copyright © 2001-2020 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   18:     ///
   19:     /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
   20:     /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
   21:     ///
   22:     /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   23:     /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
   24:     /// 
   25:     /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
   26:     /// 
   27:     /// Copyright notice: This notice may not be removed or altered from any source distribution.
   28:     /// </remarks> 
   29:     [DataContract(IsReference = true, Namespace = "kw.com.ia.api.weather", Name = "weather")]
   30:     public class Weather
   31:     {
   32:         private static string weatherTick;
   33:         private static List<Ia.Cl.Models.Weather.Forecast> forecast;
   34:  
   35:         ////////////////////////////////////////////////////////////////////////////
   36:  
   37:         /// <summary>
   38:         ///
   39:         /// </summary>
   40:         public Weather()
   41:         {
   42:         }
   43:  
   44:         ////////////////////////////////////////////////////////////////////////////
   45:  
   46:         /// <summary>
   47:         /// Structure is take from OpenWeatherMap response
   48:         /// </summary>
   49:         [DataContract]
   50:         public class Forecast
   51:         {
   52:             /// <summary/>
   53:             [DataMember]
   54:             public DateTime TimeFrom { get; set; }
   55:  
   56:             /// <summary/>
   57:             [DataMember]
   58:             public DateTime TimeTo { get; set; }
   59:  
   60:             /// <summary/>
   61:             [DataMember]
   62:             public int SymbolNumber { get; set; }
   63:  
   64:             /// <summary/>
   65:             [DataMember]
   66:             public string SymbolName { get; set; }
   67:  
   68:             /// <summary/>
   69:             [DataMember]
   70:             public string SymbolVariable { get; set; }
   71:  
   72:             /// <summary/>
   73:             [DataMember]
   74:             public string Precipitation { get; set; }
   75:  
   76:             /// <summary/>
   77:             [DataMember]
   78:             public float WindDirectionDegree { get; set; }
   79:  
   80:             /// <summary/>
   81:             [DataMember]
   82:             public string WindDirectionCode { get; set; }
   83:  
   84:             /// <summary/>
   85:             [DataMember]
   86:             public string WindDirectionName { get; set; }
   87:  
   88:             /// <summary/>
   89:             [DataMember]
   90:             public float WindSpeedMps { get; set; }
   91:  
   92:             /// <summary/>
   93:             [DataMember]
   94:             public string WindSpeedName { get; set; }
   95:  
   96:             /// <summary/>
   97:             [DataMember]
   98:             public string TemperatureUnit { get; set; }
   99:  
  100:             /// <summary/>
  101:             [DataMember]
  102:             public float TemperatureValue { get; set; }
  103:  
  104:             /// <summary/>
  105:             [DataMember]
  106:             public float TemperatureMin { get; set; }
  107:  
  108:             /// <summary/>
  109:             [DataMember]
  110:             public float TemperatureMax { get; set; }
  111:  
  112:             /// <summary/>
  113:             [DataMember]
  114:             public string PressureUnit { get; set; }
  115:  
  116:             /// <summary/>
  117:             [DataMember]
  118:             public float PressureValue { get; set; }
  119:  
  120:             /// <summary/>
  121:             [DataMember]
  122:             public int HumidityValue { get; set; }
  123:  
  124:             /// <summary/>
  125:             [DataMember]
  126:             public string HumidityUnit { get; set; }
  127:  
  128:             /// <summary/>
  129:             [DataMember]
  130:             public string CloudsValue { get; set; }
  131:  
  132:             /// <summary/>
  133:             [DataMember]
  134:             public int CloudsAll { get; set; }
  135:  
  136:             /// <summary/>
  137:             [DataMember]
  138:             public string CloudsUnit { get; set; }
  139:         }
  140:  
  141:         ////////////////////////////////////////////////////////////////////////////
  142:  
  143:         /// <summary>
  144:         /// Reads OpenWeatherMap.org API Service for weather information in Kuwait.
  145:         /// </summary>
  146:         [HttpGet]
  147:         [Route("api/weather/kuwait")]
  148:         public List<Ia.Cl.Models.Weather.Forecast> ReadKuwait()
  149:         {
  150:             long ticks;
  151:             DateTime lastTime, now;
  152:             List<Ia.Cl.Models.Weather.Forecast> forecastList, savedForcastList;
  153:  
  154:             now = DateTime.UtcNow.AddHours(3);
  155:  
  156:             if (forecast != null && weatherTick != null)
  157:             {
  158:                 savedForcastList = forecast;
  159:                 ticks = long.Parse(weatherTick);
  160:                 lastTime = new DateTime(ticks);
  161:  
  162:                 // check that 60 minutes had passed:
  163:                 if (now.Ticks > lastTime.AddMinutes(60).Ticks)
  164:                 {
  165:                     forecastList = Retrieve(387990); // Kuwait city id: 387990
  166:  
  167:                     forecast = forecastList;
  168:                     weatherTick = now.Ticks.ToString();
  169:                 }
  170:                 else
  171:                 {
  172:                     // if an hour did not pass, return the saved value;
  173:                     forecastList = savedForcastList;
  174:                 }
  175:             }
  176:             else
  177:             {
  178:                 forecastList = Retrieve(387990); // Kuwait city id: 387990
  179:                 forecast = forecastList;
  180:                 weatherTick = now.Ticks.ToString();
  181:             }
  182:  
  183:             return forecastList;
  184:         }
  185:  
  186:         ////////////////////////////////////////////////////////////////////////////
  187:  
  188:         /// <summary>
  189:         ///
  190:         /// </summary>
  191:         private List<Ia.Cl.Models.Weather.Forecast> Retrieve(int cityId)
  192:         {
  193:             /*
  194:               <appSettings>
  195:                 <add key="openWeatherMapApiKey" value="{API Key}" />
  196:               </appSettings>
  197:             */
  198:  
  199:             string apiKey, line;
  200:             XDocument xdd;
  201:             Ia.Cl.Models.Weather.Forecast forecast;
  202:             List<Ia.Cl.Models.Weather.Forecast> forecastList;
  203:  
  204:             apiKey = ConfigurationManager.AppSettings["openWeatherMapApiKey"].ToString();
  205:  
  206:             line = Ia.Cl.Models.Http.Request("https://api.openweathermap.org/data/2.5/forecast?id=" + cityId + "&mode=xml&units=metric&APPID=" + apiKey);
  207:  
  208:             try
  209:             {
  210:                 forecastList = null;
  211:  
  212:                 xdd = XDocument.Parse(line);
  213:  
  214:                 if (xdd != null)
  215:                 {
  216:                     forecastList = new List<Ia.Cl.Models.Weather.Forecast>();
  217:  
  218:                     foreach (XElement xe in xdd.Element("weatherdata").Element("forecast").Elements("time"))
  219:                     {
  220:                         forecast = new Ia.Cl.Models.Weather.Forecast();
  221:  
  222:                         // <time from="2016-06-13T03:00:00" to="2016-06-13T06:00:00">
  223:                         forecast.TimeFrom = DateTime.Parse(xe.Attribute("from").Value);
  224:                         forecast.TimeTo = DateTime.Parse(xe.Attribute("to").Value);
  225:  
  226:                         // <symbol number="800" name="clear sky" var="01d"/>
  227:                         forecast.SymbolNumber = int.Parse(xe.Element("symbol").Attribute("number").Value);
  228:                         forecast.SymbolName = xe.Element("symbol").Attribute("name").Value;
  229:                         forecast.SymbolVariable = xe.Element("symbol").Attribute("var").Value;
  230:  
  231:                         // <precipitation/>
  232:                         forecast.Precipitation = (xe.Element("precipitation").Attribute("variable") != null) ? xe.Element("precipitation").Attribute("variable").Value : null;
  233:  
  234:                         // <windDirection deg="322.501" code="NW" name="Northwest"/>
  235:                         forecast.WindDirectionDegree = float.Parse(xe.Element("windDirection").Attribute("deg").Value);
  236:                         forecast.WindDirectionCode = xe.Element("windDirection").Attribute("code").Value;
  237:                         forecast.WindDirectionName = xe.Element("windDirection").Attribute("name").Value;
  238:  
  239:                         // <windSpeed mps="6.05" name="Moderate breeze"/>
  240:                         forecast.WindSpeedMps = float.Parse(xe.Element("windSpeed").Attribute("mps").Value);
  241:                         forecast.WindSpeedName = xe.Element("windSpeed").Attribute("name").Value;
  242:  
  243:                         // <temperature unit="celsius" value="37.14" min="33.12" max="37.14"/>
  244:                         forecast.TemperatureUnit = xe.Element("temperature").Attribute("unit").Value;
  245:                         forecast.TemperatureValue = float.Parse(xe.Element("temperature").Attribute("value").Value);
  246:                         forecast.TemperatureMin = float.Parse(xe.Element("temperature").Attribute("min").Value);
  247:                         forecast.TemperatureMax = float.Parse(xe.Element("temperature").Attribute("max").Value);
  248:  
  249:                         // <pressure unit="hPa" value="1017.48"/>
  250:                         forecast.PressureUnit = xe.Element("pressure").Attribute("unit").Value;
  251:                         forecast.PressureValue = float.Parse(xe.Element("pressure").Attribute("value").Value);
  252:  
  253:                         // <humidity value="46" unit="%"/>
  254:                         forecast.HumidityValue = int.Parse(xe.Element("humidity").Attribute("value").Value);
  255:                         forecast.HumidityUnit = xe.Element("humidity").Attribute("unit").Value;
  256:  
  257:                         // <clouds value="clear sky" all="0" unit="%"/>                        
  258:                         forecast.CloudsValue = xe.Element("clouds").Attribute("value").Value;
  259:                         forecast.CloudsAll = int.Parse(xe.Element("clouds").Attribute("all").Value);
  260:                         forecast.CloudsUnit = xe.Element("clouds").Attribute("unit").Value;
  261:  
  262:                         forecastList.Add(forecast);
  263:                     }
  264:                 }
  265:             }
  266:             catch (Exception)
  267:             {
  268:                 forecastList = null;
  269:             }
  270:  
  271:             return forecastList;
  272:         }
  273:  
  274:         ////////////////////////////////////////////////////////////////////////////
  275:         ////////////////////////////////////////////////////////////////////////////
  276:     }
  277:  
  278:     ////////////////////////////////////////////////////////////////////////////
  279:     ////////////////////////////////////////////////////////////////////////////
  280: }