Patrick Sperneder

AstronomyLib Part 2

Um die Bibliothek zielführend einsetzen zu können, benötigen wir des weiteren einen Webservice mithilfe dessen wir die Koordinaten ( Latitude und Longitude ) ermitteln. Diese Daten holen wir uns vom Webservice Yahoo GeoCode.

Bevor wir nun aber zur Tat schreiten können um Daten von dem Dienst Yahoo GeoCode zu erhalten, müssen wir einen Developer Account bei Yahoo einrichten. Dies ist relativ unkompliziert und kostet auch nichts, ist dieser Account nun erstellt, müssen wir einen APP ID Code für unsere Abfragen beantragen. Mit diesem Code ist es möglich 50.000 Abfragen pro Tag auf obgenannten Service zu machen.

Die Abfrage für einen bestimmten Ort des GeoCode Service ist ein Uri  in dem die Parameter der Abfrage integriert sind.

z.B.: für Graz : http://local.yahooapis.com/MapsService/V1/geocode?appid=XYZ…….&city=Graz .

 

Für diesen Zweck erstellen wir uns eine statische Klasse die die Abfragen mittels einem System.Net.WebClient löst. Der zurückgegeben Wert einer solchen Abfrage ist ein XML Fragment mit den entsprechenden Elementen und Attributen also Werten.

Auch für die Rückgabewerte erstellen wir uns eine Klasse die diese Eigenschaften kapselt um sie nachher komfortabel in der Anwendung nutzen zu können.

ACHTUNG !

Der Code enthält keinerlei Fehlerbehandlungsroutinen und blockiert die Oberfläche der Anwendung (wegen dem direkten Aufruf des WebClients aus dem UIThread !) , es soll lediglich die Vorgehensweise verdeutlicht werden. Diese Vorgehensweise entspricht keinesfalls irgendwelchen Design Richtlinien.

 

Die statische Klasse YahooGeoCodeAPIWrapper :

  1. public static class YahooGeoCodeAPIWrapper
  2.     {
  3.         /// <summary>
  4.         /// Gets the geo data for the given city name.
  5.         /// </summary>
  6.         /// <param name="API_CODE">The API  CODE.</param>
  7.         /// <param name="CityName">Name of the city.</param>
  8.         /// <returns></returns>
  9.         public static YahooGeoCodeResult GetGeoDataForCityName(string API_CODE, string CityName)
  10.         {
  11.             using (WebClient client = new WebClient())
  12.             {
  13.                 // Abfrage Uri erstellen ...
  14.                 string uri = "http://local.yahooapis.com/MapsService/V1/geocode?appid=" + API_CODE + "&city=" + CityName;
  15.                 byte[] bytes = client.DownloadData(uri);
  16.                 return new YahooGeoCodeResult(Encoding.ASCII.GetString(bytes));
  17.             }
  18.         }
  19.     }

 

Die Klasse die die Ergebnisse der Abfrage kapselt :

  1. /// <summary>
  2.     /// Stellt eine Antwort auf eine Abfrage des Yahoo GeoCode Webservices dar.
  3.     /// </summary>
  4.     public sealed class YahooGeoCodeResult
  5.     {
  6.         #region ctor
  7.         public YahooGeoCodeResult(string xmlfragment)
  8.         {
  9.             XmlDocument doc = new XmlDocument();
  10.             doc.LoadXml(xmlfragment);
  11.             Latitude = Double.Parse(doc.DocumentElement.ChildNodes[0].ChildNodes[0].InnerText );
  12.             Longitude = Double.Parse(doc.DocumentElement.ChildNodes[0].ChildNodes[1].InnerText );
  13.             City = doc.DocumentElement.ChildNodes[0].ChildNodes[3].InnerText;
  14.             State = doc.DocumentElement.ChildNodes[0].ChildNodes[4].InnerText ;
  15.         }
  16.         #endregion
  17.         #region props
  18.         public double Latitude { get; set; }
  19.         public double Longitude { get; set; }
  20.         public string State { get; set; }
  21.         public string City { get; set; }
  22.         #endregion
  23.     }
AstronomyLib Part 1

Nun denke ich ist es an der Zeit den ersten Beitrag zum Thema C# und WPF zu erstellen.

Kürzlich habe ich auf dotnetsnippets.de eine Bibliothek mit dem eigentlich alles sagendem Namen AstronomyLib erstellt. Die Bibliothek ist derzeit nur mit rudimentären Funktionen ausgestattet, es sollte jedoch ( mit Eurer Hilfe vielleicht ) eine vollwertige Klassenbibliothek die den Umgang mit astronomischen Funktionen und Methoden beherrscht erstellt werden.

Die Notwendigkeit von z.B. der Ermittlung der Uhrzeit des Sonnenaufganges eines Tages hat sich bei meinem Projekt 'InfoPoint' ( welches eine WPF Touchscreen Anwendung ist ) ergeben. Als erstes kam mir natürlich die Idee einen ( ziemlich sicher vorhandenen ) Webserverice dafür zu gebrauchen, jedoch schied dies aus rechtlichen sowie aus Bandbreitenproblemen aus.

Da ich auch ein Benutzer des derzeit neuesten Betriebsystems Windows7 bin, schaute ich mir mal hier die Sidebar Gadget etwas genauer an. Ich nehme an das auch das gleiche gadget in Windows Vista vorhanden ist, kann dies jedoch nicht mit Sicherheit sagen da ich Vista nie im Einsatz hatte.

weather_gadget

 

Wenn man nun das Widget genauer unter die Lupe nimmt, so kann man erkennen das ein Widget im Prinzip eine HTML Seite mit diversen JavaScript Funktionen und Methoden ist.

Dadurch ist es eigentlich relativ einfach die Funktione eines Widgets zu ermitteln bzw. in dessen Sourcecodes nach bestimmten Funktionen zu suchen. Bei meinem System befinden sich sämtliche Widgets im Ordern C:\Program Files\Windows Sidebar\Gadgets … Die Struktur eines Gadgets habe ich mal hier abgebildet

sidebar_widget_structure

 

Nun wurde ich zum Glück in den JavaScript Dateien fündig, und es war eigentlich ein Leichtes die JavaScript Funktionen auf C# zu portieren. Ich packte diese ganzen Schnippsel zu einer Klassenbibliothek  zusammen und hinterlegte alle Klassen im Namespace System.Astronomy.

Hier die schematische Darstellung der Bibliothek. Wie gesagt, derzeit noch sehr jung und klein …

ProjectDiagram

 

Den C# Code der Klassen könnt Ihr als Visual Studio Snippet von dotnetsnippets.de hier herunterladen.

Macht euch doch mal mit den doch recht einfachen Funktionen vertraut, im nächsten Teil dieser Serie erstellen wir eine WPF Anwendung die die ermittelten Daten schön und brauchbar darstellt.

Wie immer sind Feedback und Anregungen sehr erwünscht !

Cheers Noodles

Hello (Blog)World …

Zuerst vielen Dank an Jan Welker der mir diesen Blog Space eingerichtet hat und wirklich sehr hilfreich und engagiert war .

Nun ist es auch bei mir so weit, nachdem ich mich immer wieder zu gewissen Themen im .NET Umfeld weiterbilden oder informieren wollte, kam ich meistens zu MSDN was auch nicht wirklich verwundert. Für mich als Entwickler ist die Online Version der MSDN Library unverzichtbar, jedoch fehlen mir gelegentlich die Beispiele für gewisse Fragestellungen.

Wenn ich dann nun ein Thema aufgegriffen habe und weitere Informationen zu beschaffen versuche, komme ich meistens auf Blogs von Programmierern die oft eigentlich das gleiche Problem hatten und noch öfter ist auch die Lösung für mein gesuchtes Thema bereits vorhanden.

Manchmal ( eher selten ) komme auch ich auf so manche Lösung die noch nirgends anderswo zu finden ist und ich wollte natürlich auch anderen die vielleicht auch mir schon mal geholfen haben helfen.

Mein erstes Sprachrohr zur community war die Entwicklerseite codeproject.com und dotnet-snippets.de .

Mit der Zeit wurden es immer mehr Gemeinschaften denen ich mich anschloss um immer über alle Neuigkeiten informiert zu sein und die Übersichtlichkeit ging natürlich verloren  meine mailbox ging über  und nun dachte ich mir, ist es vielleicht sinnvoll Neuigkeiten die für meine Bedürfnisse passen an einem zentralen Punkt zusammenzufassen und desweiteren ein probates Mittel zur Kommunikation mit der Community zu haben.

Was ist eigentlich euer Antrieb euren Blog zu füttern oder überlegt auch ihr euch einen Blog zu erstellen ?

Verwenden wir mal meinen Blog zum Austausch ! Ich freue mich auf spannende Diskussionen und Feedback.

Grüße Doc.NET.Noodles

NoodlesAVATAR