In diesem Beitrag möchte ich eine Demo vorstellen, die es ermöglicht, Wetterinformationen, die über das - nicht dokumentierte -
Google Weather API abgerufen werden können, mit Hilfe des Frameworks darzustellen.
Diese Demo ist allerdings - im Gegensatz zu allen bisherigen - nur mit
unicode-fähigen Delphi-Versionen (also ab 2009) kompilierbar. Besitzer älterer
IDE's müßten die Anpassungen selbst vornehmen. Das hat nichts mit dem Framework zu tun, sondern mit den zu verarbeitenden Wetterdaten.
Google Weather API ist eigentlich eine vollkommen übertriebene Bezeichnung: Es handelt sich lediglich um eine
URL, über die mit Hilfe zweier Parameter eine
XML Datei abgerufen werden kann:
Code:
http://www.google.com/ig/
api?weather=[LOCATION]&hl=[LANGUAGE]
- [LOCATION] ist dabei im einfachsten Fall der Ort, für den die Wetterinformationen abgerufen und
- [LANGUAGE] die Sprache (Länderkürzel), in der diese Informationen geliefert werden sollen.
Code:
http://www.google.com/ig/
api?weather=Berlin&hl=de
liefert eine
XML-Datei mit folgender Struktur:
Code:
<?
xml version="1.0"?>
<xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
<forecast_information>
<city data="Berlin, Berlin"/>
<postal_code data="Berlin"/>
<latitude_e6 data=""/>
<longitude_e6 data=""/>
<forecast_date data="2011-08-24"/>
<current_date_time data="2011-08-24 09:50:00 +0000"/>
<unit_system data="SI"/>
</forecast_information>
<current_conditions>
<condition data="Klar"/>
<temp_f data="73"/>
<temp_c data="23"/>
<humidity data="Luftfeuchtigkeit: 78*%"/>
<icon data="/ig/images/weather/sunny.gif"/>
<wind_condition data="Wind: W mit 11 km/h"/>
</current_conditions>
<forecast_conditions>
<day_of_week data="Mi."/>
<low data="21"/>
<high data="30"/>
<icon data="/ig/images/weather/mostly_sunny.gif"/>
<condition data="Teils sonnig"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="Do."/>
<low data="23"/>
<high data="29"/>
<icon data="/ig/images/weather/chance_of_storm.gif"/>
<condition data="Vereinzelt stürmisch"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="Fr."/>
<low data="19"/>
<high data="32"/>
<icon data="/ig/images/weather/sunny.gif"/>
<condition data="Klar"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="Sa."/>
<low data="14"/>
<high data="21"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="Vereinzelt Regen"/>
</forecast_conditions>
</weather>
</xml_api_reply>
Diese Datei enthält - neben den aktuellen Daten - sogar eine Vorhersage für die nächsten drei Tage.
Im Abschnitt
xml_api_reply\weather\xxx_conditions\icon ist in der Regel sogar der Link zu einem Icon angegeben, so daß sich die Anzeige dieses Bildes als Marker anbietet.
Leider enthalten die Abschnitte
xml_api_reply\weather\forecast_information\latitud e_e6 und
xml_api_reply\weather\forecast_information\longitu de_e6 keine Angaben, so daß die Koordinaten für den Marker erst über eine Geocoding-Abfrage ermittelt werden müssen.
Die programmtechnische Umsetzung ist relativ einfach: Die
XML-Datei wird mit Hilfe eine TIdHTTP-Komponente abgefragt und über eine TXMLDocument-Komponente geparst. Der Gebrauch des Geocoders und das Hinzufügen von Markern wurde schon in früheren Demos gezeigt.
Dabei ist lediglich zu beachten, daß die Eigenschaft CharSet des Request-Objektes auf UTF-8 zu setzten ist
Delphi-Quellcode:
IdHTTP1.Request.CharSet:='UTF-8';
//...
, damit der Google-Server die
XML-Datei auch wirklich in der gewünschten Sprache liefert.
Damit ist es zum Beispiel möglich, das Wetter für Frankfurt am Main in hebräischer
für München in russischer
oder für Graz in thailändischer Sprache anzeigen zu lassen:
Interessant ist das Sonnensymbol links unten in Frankreich: Hier wurde als Sprache japanisch (ja) gewählt. Wahrscheinlich sieht die Sonne in Japan anders aus, als im Rest der Welt...
Im Quelltext der Demo wird noch ein weiterer Weg beschrieben:
Bei einem Klick mit der linken Maustaste auf die Karte wird (falls vorhanden) die Wetterinformation für diesen Punkt abgefragt und angezeigt. Der zugehörige Ort wird über Reverse Geocoding ermittelt.