نمایش وضعیت آب و هوا با استفاده از RadWeather

RadWeather کتابخانه ای برای بازیابی اطلاعات مربوط به وضعیت آب و هوای یک شهر است که با C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎ نوشته شده .

نمایش وضعیت آب و هوا با استفاده از RadWeather

این کتابخانه از وب سرویس آب و هوای سایت !Yahoo استفاده می کند.

فایل ضمیمه، شامل Source کتابخانه و مثال هایی در مورد نحوه ی استفاده از آن در یک پروژه ی Web و Desktop است.

برای استفاده، فایل RadWeather.dll را Add Reference کرده و دو namespace با عناوین RadWeather و RadWeather.Providers را به صفحه معرفی کنید.
شما با کلاس Weather سر و کار خواهید داشت. این کلاس دارای متدها و خصیصه های ذیل است:

1) خصیصه ی Astronomy به منظور بازیابی ساعت طلوع و غروب آفتاب و دارای خصیصه های ذیل است:
Sunrise: ساعت طلوع آفتاب
Sunset: ساعت غروب آفتاب
2) خصیصه ی Atmosphere به منظور بازیابی اطلاعات جَو و دارای خصیصه های ذیل است:
Humidity: میزان رطوبت هوا (درصد)
Visibility: میزان دید (مایل یا کیلومتر)
Pressure: فشار هوا (پوند بر اینچ مربع یا میلی بار)
PressureState: وضعیت فشار هوا (یکنواخت، افزایشی، کاهشی)
3) خصیصه ی Wind به منظور بازیابی اطلاعات باد و دارای خصیصه های ذیل است:
Chill: دمای باد (فارنهایت یا سانتیگراد)
Direction: درجه ی جهت باد (بین صفر تا 360)
Speed: سرعت باد (مایل در ساعت یا کیلومتر در ساعت)
4) خصیصه ی Today به منظور بازیابی اطلاعات آب و هوای جاری و دارای خصیصه های ذیل است:
DayName: عنوان روز (شنبه، یکشنبه، دوشنبه، ...)
ImageUrl: آدرس تصویر وضعیت جوی (از سایت !Yahoo خوانده می شود)
LowTemperature: حداقل دمای امروز (فارنهایت یا سانتیگراد)
HighTemperature: حداکثر دمای امروز (فارنهایت یا سانتیگراد)
Condition: وضعیت جوی امروز (همانند "آفتابی"، "برفی"، "بارانی" و ...)
CurrentTemperature: دمای جاری (فارنهایت یا سانتیگراد)
CurrentCondition: وضعیت جوی جاری (همانند "آفتابی"، "برفی"، "بارانی" و ...)
5) خصیصه ی Tomorrow به منظور بازیابی اطلاعات آب و هوای روز بعد و دارای خصیصه های ذیل است:
DayName: عنوان روز (شنبه، یکشنبه، دوشنبه، ...)
ImageUrl: آدرس تصویر وضعیت جوی (از سایت !Yahoo خوانده می شود)
LowTemperature: حداقل دما (فارنهایت یا سانتیگراد)
HighTemperature: حداکثر دما (فارنهایت یا سانتیگراد)
Condition: وضعیت جوی (همانند "آفتابی"، "برفی"، "بارانی" و ...)
6) خصیصه ی NextDays به منظور بازیابی اطلاعات آب و هوای روزهای بعد از روز جاری و دارای خصیصه های Day3، Day2، Day1 و Day4 است. هر یک از این 4 خصیصه دارای زیر خصیصه های خصیصه ی Tomorrow هستند.
دقت داشته باشید که Day1 همان Tomorrow هست. در حقیقت به دو شکل می توانید به اطلاعات آب و هوای روز بعد دسترسی داشته باشید.

7) متد GetForecast وظیفه ی بازیابی اطلاعات آب و هوا را بر عهده داشته و مقدار برگشتی آن شی ای از نوع کلاس Weather است. مثالی در مورد نحوه ی استفاده:

string dataPath = Server.MapPath(".");
IWeather weather = new Weather(new YahooProvider(dataPath))
    .GetForecast(cityCode, "fa", DegreesUnit.Celsius);
if (weather != null)
{
   // do something with weather
}


در صورتی که خطایی در ارتباط با وب سرویس سایت !Yahoo رخ دهد، مقدار برگشتی متد GetForecast برابر با null خواهد بود.

متد GetForecast سه امضای مختلف دارد (Overloading). در امضای اول، این متد حداقل نیاز به کد شهر دارد. در امضای دوم، به مشخصه ی زبان مورد استفاده نیز (همانند fa یا en) نیاز است. این کتابخانه از Localization پشتیبانی می کند و به راحتی می توان زبان های دلخواه را به آن اضافه کرد. در امضای سوم، واحد مورد نظر برای نمایش اطلاعات نیز تعیین می شود. پارامتر آخر این امضا با استفاده از یکی از مقادیر Fahrenheit (فارنهایت) یا Celsius (سانتیگراد) یک Enum با نام DegreesUnit مقداردهی می شود. توجه داشته باشید که با انتخاب مقدار Fahrenheit یا Celsius، بقیه ی واحدها نیز به طور خودکار متناسب با آنها تغییر می کنند. با انتخاب Fahrenheit، بقیه ی مقادیر خصیصه ها نیز از مایل، مایل در ساعت و پوند بر اینچ مربع استفاده می کنند. با انتخاب Celsius، بقیه ی مقادیر خصیصه ها نیز از کیلومتر، کیلومتر در ساعت و میلی بار استفاده می کنند.
نکته: در صورتی که از امضای اول استفاده کنید، از زبان انگلیسی و واحد فارنهایت استفاده خواهد شد.

این کتابخانه از 4 فایل Resource استفاده می کند. این 4 فایل باید در 4 پوشه ی مجزا در پوشه ای با نام WeatherData قرار داده شوند.
پوشه ی Locations که فایلی با نام Locations.xml در آن وجود دارد، نگهدارنده ی کد شهرهای یک کشور است. مثالی از محتوای این فایل:

<Locations>
  <Country name="IR">
    <Cities>
      <City latinName="Ahvaz" farsiName="اهواز">2254294</City>
      <City latinName="Shiraz" farsiName="شیراز">2255202</City>
    </Cities>
  </Country>
</Locations>

البته تگ های فوق در اینجا به درستی نمایش داده نمی شوند. در فایل xml به شکل صحیح هستند.
تگ Country خاصیتی با نام name دارد که مشخصه ی یک کشور را مشخص می کند. البته این مشخصه اختیاری است اما در عرف، مشخصه ی کشور ایران عبارت IR است. تگ های City نیز به ازای هر شهر ایجاد می شوند و سینتکس آنها کاملاً گویای همه چیز است.
سوال: کد شهر مورد نظر را از کجا به دست آورم؟
پاسخ: وارد آدرس http://weather.yahoo.com شوید. نام لاتین شهر مورد نظر را در قسمت Enter city or zip code وارد و بر روی دکمه ی Go کلیک کنید. به عنوان مثال، با وارد کردن عبارت Ahvaz، به آدرس http://weather.yahoo.com/iran/khuzestan/ahvaz-2254294/ هدایت می شوید. در این حالت، عدد 2254294، کد شهر اهواز است که باید آن را با سینتکسی که پیشتر دیدید در فایل Locations.xml قرار دهید.
من این کار را برای تمامی مراکز استان های ایران انجام و در فایل Locations.xml قرار دادم. متاسفانه وب سرویس آب و هوای !Yahoo، شهرهای ایلام، اردبیل، سمنان، قزوین، قم، سنندج و ساری را ندارد. اگر دوستان کد این شهرها را پیدا کردند، به بنده اطلاع بدن.
پوشه ی Conditions، حاوی فایل های Localization برای عنوان وضعیت جوی همانند "آفتابی"، "برفی"، "بارانی" و ... است. نام این فایل ها باید مشخصه ی زبان مورد استفاده ای باشد که می خواهید به متد GetForecast پاس دهید. به عنوان مثال، فایل fa.xml مشخص کننده ی زبان فارسی است و به متد GetForecast نیز باید عبارت fa پاس داده شود. می توانید این فایل را باز کرده و ترجمه هایی که انجام دادم را بنا به نیاز خودتون اصلاح کنید. معادل انگلیسی کلمات فارسی در فایل en.xml وجود دارند.
فایل های پوشه ی PressureState نیز از قوانین نامگذاری فایل های پوشه ی Conditions پیروی می کنند. این پوشه، فایل های Localization برای وضعیت فشار هوا را نگهداری می کند.
در پوشه ی Days نیز فایل های Localization مربوط به عناوین روزهای هفته نگهداری می شود.

بیشترین تلاش من بر روی Provider based شدن کتابخانه و قابل توسعه بودن اون بود که به لطف IoC و Dependency Injection این مهم محقق شد. اگر دوست دارید که از سرویسی به جز سرویس آب و هوای !Yahoo استفاده کنید، فقط کافی است اینترفیس های IProvider و IPath رو پیاده سازی کنید. اینترفیس IProvider شامل دو متد است. متد GetForecastRss برای بازیابی rss مربوطه و متد ConvertForecastToWeather برای تبدیل rss به اینترفیس IWeather.
اینترفیس IWeather دارای خصیصه های مورد نیاز برای تبدیل rss به اشیای معادل است.
اینترفیس IPath نیز خصیصه ی DataPath برای معرفی مسیر Resource ها را دارد.

برنامه نویس و نویسنده : مهندس بهروز راد

تصاویر

آموزش سی شارپ

فایل های ضمیمه