W tym poście chciałbym przedstawić aplikację napisaną w języku C#, której zadaniem jest pobranie danych z informacjami o pogodzie w wybranym mieście. Następnie dane są przetwarzane i wyświetlane użytkownikowi.
Wstęp:
Do pobrania danych wykorzystuje portal openweathermap.org. Aby podłączyć się do tego serwisu wystarczy założyć konto i odebrać kod APPD, który zostanie przesłany na adres email. Podaje się go do adresu w trakcie pobierania informacji z serwera. Odświeżanie danych o pogodzie może następować raz na 10 minut (w przypadku wersji płatnej) lub co 2-3 godziny (dla wersji darmowej). Częstsze odpytywanie nie spowoduje żadnego błędu, natomiast jest ono zupełnie niepotrzebne ponieważ pobrane dane będą takie same jak poprzednio.Po wysłaniu zapytania z własnym wygenerowanym kodem otrzyma się następującą odpowiedź w formacie JSON:
- {
- "coord":{
- "lon":19.92,
- "lat":50.08
- },
- "weather":[
- {
- "id":701,
- "main":"Mist",
- "description":"mist",
- "icon":"50d"
- }],
- "base":"stations",
- "main":{
- "temp":273.15,
- "pressure":1009,
- "humidity":89,
- "temp_min":273.15,
- "temp_max":273.15},
- "visibility":2500,
- "wind":{
- "speed":1.5,
- "deg":170
- },
- "clouds":{
- "all":0
- },
- "dt":1514282400,
- "sys":{
- "type":1,
- "id":5352,
- "message":0.004,
- "country":"PL",
- "sunrise":1514270321,
- "sunset":1514299423
- },
- "id":3094802,
- "name":"Krakow",
- "cod":200
- }
Te dane następnie będziemy obrabiać w programie aby zaprezentować dane użytkownikowi.
Kolejną opcją na pobranie danych są prognozy 5 dniowe z pogodą odświeżaną co 3 godziny. W tym przypadku otrzymujemy dosyć dużo danych do obrobienia bo aż 39. Ich składnia wygląda następująco:
Powyżej uporządkowane dane z odczytu prognozy na 5 dni.
Z prognoz pogody w wersji darmowej w formacie JSON dostępne są jeszcze informacje o alarmach pogodowych oraz odczytu smogu (wersja beta).
Kod programu:
Do dekodowania wykorzystuję bibliotekę Newtonsoft.Json, którą należy zainstalować przez menadżer pakietów NuGet.
Najpierw sam wygląd aplikacji oraz pobieranie danych z serwera.
Poniżej zdjęcie aplikacji:
Na początku wybierane jest miasto z którego mają zostać pobrane informacje. Wyświetlane są informacje w kontrolce ComboBox z ostatnio wybraną lokalizacją.
Lista miast zdefiniowana jest w klasie DEFINECITIES. Tam dopisywane są kolejne miasta jako stałe ciągi znaków, które przechowują informacje z Id miasta w danym kraju. Wszystkie dostępne miasta można pobrać ze strony. W programie uwzględniłem następujące miasta:
Jak już wspomniałem miasta można bardzo łatwo dodawać. Wystarczy dodać je do klasy z nazwami oraz do klasy z Id.
- class DEFINECITIES
- {
- //From Poland
- public const string GDANSK_CITY_ID = "id=3099434&";
- public const string KRAKOW_CITY_ID = "id=3094802&";
- public const string RZESZOW_CITY_ID = "id=7530819&";
- public const string WARSZAWA_CITY_ID = "id=6695624&";
- //From US
- public const string NEW_YORK_CITY_ID = "id=5128638&";
- //Definition of names to collection
- public static string[] cityNames = new string[]
- {
- "Gdansk",
- "Krakow",
- "Rzeszow",
- "Warsaw",
- "New York"
- };
- }
Ich dodanie do ComboBox wygląda następująco:
- private void updateComboBoxCitiesData()
- {
- foreach(string cityName in DEFINECITIES.cityNames)
- {
- countriesComboBox.Items.Add(cityName);
- }
- countriesComboBox.Sorted = true;
- countriesComboBox.DropDownStyle = ComboBoxStyle.DropDown;
- countriesComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
- countriesComboBox.AutoCompleteMode = AutoCompleteMode.Suggest;
- }
Dane pobierane są z tablicy po czym za pomocą operacji Add są dodawane do kolekcji kontrolki.
Dane z informacją o czasie są przedstawione jako epoch. Jest to ilość sekund jaka upłynęła od daty pierwszego stycznia 1970. Aby ją szybko sformatować na bardziej czytelny format wykorzystuję następującą funkcję:
- public static DateTime UnixTimeStampToDateTime(int epochTime)
- {
- DateTime newTime = new DateTime(1970, 1, 1).AddSeconds(epochTime);
- return newTime;
- }
Pobranie informacji polega na przesłaniu zapytania do strony. Wykonanie wygląda następująco:
- private JsonWeatherReport getJsonData(string url)
- {
- using (WebClient client = new WebClient())
- {
- string receiveJson = client.DownloadString(url);
- JsonWeatherReport weather;
- weather = JsonConvert.DeserializeObject<JsonWeatherReport>(receiveJson);
- UpdateDataRichTxtBox(weather);
- return weather;
- }
- }
W tym przypadku wykorzystuje klasę WebClient. Zawiera metody wspólne dla przesłania oraz odebrania danych. Pobranie danych odbywa się poprzez DownloadString. Pobiera dane z żądanego adresu jako string.
Dane z ComboBox zapisywane są do ustawień aplikacji. Przez co po każdym otwarciu automatycznie zostanie przypisane ostatnio wyszukiwane miasto.
- private void saveDataBetweenOpen()
- {
- Properties.Settings.Default.countryRTBData = countriesComboBox.SelectedItem.ToString();
- Properties.Settings.Default.Save();
- }
Zdekodowanie informacji pogodowej następuje w klasie JsonWeatherReport, która zawiera referencję do klas zewnętrznych przechowujących odczytane wyniki:
- public class JsonWeatherReport
- {
- [JsonProperty("coord")]
- public Coord Coord { get; set; }
- [JsonProperty("weather")]
- public Weather[] Weather { get; set; }
- [JsonProperty("base")]
- public string Base { get; set; }
- [JsonProperty("main")]
- public Main Main { get; set; }
- [JsonProperty("visibility")]
- public int Visibility { get; set; }
- [JsonProperty("wind")]
- public Wind Wind { get; set; }
- [JsonProperty("clouds")]
- public Clouds Clouds { get; set; }
- [JsonProperty("dt")]
- public int Dt { get; set; }
- [JsonProperty("sys")]
- public Sys Sys { get; set; }
- [JsonProperty("id")]
- public int Id { get; set; }
- [JsonProperty("name")]
- public string Name { get; set; }
- [JsonProperty("cod")]
- public int Cod { get; set; }
- }
Wyświetlenie informacji na ekranie polega na odczytaniu odpowiedniego pola z Json'a, zdekodowaniu go do bardziej czytelnego formatu jeśli zachodzi taka potrzeba, i wyświetleniu.
Pliki do projektu można pobrać z dysku Google pod tym linkiem. Dalej należy wejść w folder Csharp a następnie pobrać CSharp_-_AplikacjaPogodowaV1.0.
W kolejnej wersji tego programu rozwinę bardziej stronie graficzną oraz zwiększę dowolność wyboru miasta.