C# :: Aufgabe #78
3 Lösungen
Wetterdaten abfragen und anzeigen
Anfänger - C#
von pocki
- 27.11.2014 um 19:00 Uhr
Schreibe ein Programm, welches Wetterdaten von einem Dienst abruft und einige Werte davon ausgibt.
Das Programm soll durch die Benutzereingabe die Stadt entgegen nehmen und zu dieser die aktuellen Wetterdaten ausgeben.
Vorschlag für einen einfachen und kostenlosen Dienst: openweathermap.org
Das Programm soll durch die Benutzereingabe die Stadt entgegen nehmen und zu dieser die aktuellen Wetterdaten ausgeben.
Vorschlag für einen einfachen und kostenlosen Dienst: openweathermap.org
Lösungen:
Hier als einfache Konsolenanwendung, die sich auf die aktuellen Daten beschränkt...
C#-Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Xml; using System.Xml.Linq; using System.IO; namespace WetterChecker { class Program { static void Main(string[] args) { Console.WriteLine("Geben Sie den Stadtnamen und das Länderkürzel ein (bsp. \"Berlin, de\")"); string eingabe = Console.ReadLine(); string[] parameter = eingabe.Split(','); string url = @"http://api.openweathermap.org/data/2.5/forecast?q=" + parameter[0].Trim() + "," + parameter[1].Trim() + "&mode=xml"; try { XElement root = XElement.Load(url, LoadOptions.PreserveWhitespace); if (root != null) { XElement location = root.Element("location"); XElement stadt = location.Element("name"); XElement land = location.Element("country"); XAttribute sonnenaufgang = root.Element("sun").Attribute("rise"); XAttribute sonnenuntergang = root.Element("sun").Attribute("set"); DateTime datum = DateTime.Parse((string)sonnenaufgang); DateTime datum2 = DateTime.Parse((string)sonnenuntergang); XElement vorhersage = root.Element("forecast"); XElement aktuell = vorhersage.FirstNode.NextNode as XElement; XElement wind = vorhersage.Element("time").Element("windDirection"); XElement temperatur = vorhersage.Element("time").Element("temperature"); XElement luftdruck = vorhersage.Element("time").Element("pressure"); XElement luftfeuchtigkeit = vorhersage.Element("time").Element("humidity"); XElement wolken = vorhersage.Element("time").Element("clouds"); Console.WriteLine("\nStadt: " + (string)stadt + "\nLand: " + (string)land + "\n\nDatum: " + datum.ToShortDateString() + "\nSonnenaufgang: " + datum.AddHours(1).ToShortTimeString() + " Uhr \nSonnenuntergang: " + datum2.AddHours(1).ToShortTimeString() + " Uhr \nWindrichtung: " + (string)wind.Attribute("name") + "\nTemperatur: " + (string)temperatur.Attribute("value") + "° " + (string)temperatur.Attribute("unit") + "\nLuftdruck: " + (string)luftdruck.Attribute("value") + " " + (string)luftdruck.Attribute("unit") + "\nLuftfeuchtigkeit: " + (string)luftfeuchtigkeit.Attribute("value") + (string)luftfeuchtigkeit.Attribute("unit") + "\nWetter: " + (string)wolken.Attribute("value") + "\nRegenwahrscheinlichkeit: " + (string)wolken.Attribute("all") + (string)wolken.Attribute("unit")); } else { Console.WriteLine("Zu Ihren Angaben wurden keine Wetterdaten gefunden \n\n"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); } } }
C#-Code
using System; using System.Xml; using System.Net; namespace Wetterdaten { class Program { static void Main() { Console.Write("Stadt>"); Uri Url = new Uri("http://api.openweathermap.org/data/2.5/weather?&mode=xml&lang=de&q=" + Console.ReadLine()); XmlDocument Weather = XmlFrom(Url); if (Weather == null) { Console.WriteLine("Abfrage fehlerhaft."); Console.ReadKey(false); return; } Console.WriteLine("\nGefunden: " + Weather.SelectSingleNode("current/city").Attributes["name"].Value); Console.WriteLine("Wetter: " + Weather.SelectSingleNode("current/weather").Attributes["value"].Value); Console.ReadKey(false); } static XmlDocument XmlFrom(Uri Url) { XmlDocument XmlToReturn; HttpWebRequest request = WebRequest.Create(Url) as HttpWebRequest; HttpWebResponse response; try { response = request.GetResponse() as HttpWebResponse; } catch (WebException) { return null; } XmlToReturn = new XmlDocument(); XmlToReturn.Load(response.GetResponseStream()); return XmlToReturn; } } }
Durch die Konvertierung der erhaltenen json-Daten in ein "WeatherObject" ist es theoretisch möglich beliebige Daten auszugeben. Ich habe mich hier der Einfachheit halber auf die nötigsten beschränkt.
C#-Code
using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Web.Script.Serialization; using System.Numerics; using System.IO; using System.Net; using System.Diagnostics; using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Microsoft.Office.Interop.Excel; using System.Drawing; namespace KonsolenTests { class Program { public const string APIKey = "63fc4a1c3c719dcd2c8ab677f6ff0820"; static void Main(string[] args) { Console.WriteLine("Geben einen Ort ein (z.B. Berlin)"); string Ort = Console.ReadLine(); WeatherObject weather = getWetterByName(Ort); Console.WriteLine("Das Wetter in " + Ort + " ist folgendermaßen:"); Console.WriteLine("Temperatur: " + (weather.main.temp - 273) + " C"); Console.WriteLine("Luftdruck: " + weather.main.pressure + " hPa"); Console.WriteLine("Luftfeuchtigkeit: " + weather.main.humidity + " %"); Console.WriteLine("Maximale Temperatur: " + (weather.main.temp_max - 273) + " C"); Console.WriteLine("Minimale Temperatur: " + (weather.main.temp_min -273) + " C"); Console.WriteLine("Beschreibung: " + weather.weather[0].description); Console.ReadLine(); } //Api-Aufruf public static WeatherObject getWetterByName(string Ort) { StringBuilder sb = new StringBuilder(); sb.Append("http://api.openweathermap.org/data/2.5/weather?q="); sb.Append(Ort +"&APPID="); sb.Append(APIKey); WebRequest request = WebRequest.Create(sb.ToString()); request.Credentials = CredentialCache.DefaultCredentials; WebResponse response = request.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string responseFromServer = reader.ReadToEnd(); reader.Close(); response.Close(); return new JavaScriptSerializer().Deserialize<WeatherObject>(responseFromServer); } } //Nötige Klassen zum konvertieren der erhaltenen Wetterdaten im json-Format in ein "WeatherObject"-Objekt public class Coord { public double lon { get; set; } public double lat { get; set; } } public class Weather { public int id { get; set; } public string main { get; set; } public string description { get; set; } public string icon { get; set; } } public class Main { public double temp { get; set; } public int pressure { get; set; } public int humidity { get; set; } public double temp_min { get; set; } public double temp_max { get; set; } } public class Wind { public double speed { get; set; } public int deg { get; set; } } public class Clouds { public int all { get; set; } } public class Sys { public int type { get; set; } public int id { get; set; } public double message { get; set; } public string country { get; set; } public int sunrise { get; set; } public int sunset { get; set; } } public class WeatherObject { public Coord coord { get; set; } public List<Weather> weather { get; set; } public string @base { get; set; } public Main main { get; set; } public int visibility { get; set; } public Wind wind { get; set; } public Clouds clouds { get; set; } public int dt { get; set; } public Sys sys { get; set; } public int id { get; set; } public string name { get; set; } public int cod { get; set; } } }