Mit Wetterdaten arbeiten: Google Weather API
Wetterdaten können eine kleine nette Information sein für die Nutzer einer Webseite, entweder sie sind auf den jeweiligen Nutzer zugeschnitten und personalisiert, oder für alle Besucher der Webseite des Fussballclubs wird das Wetter der Stadt angezeigt.
Es gibt da draußen einige Dienste, die solche Widgets, sprich kleine HTML-Codefragmente zur Verfügung stellen, man muss allerdings bei der Generierung des entsprechenden Codes die Postleitzahl bzw. den Ort angeben, sowie teils einschränkende Geschäftsbedingungen akzeptieren. Außerdem ist man dann häufig auf das entsprechende Design des Anbieters angewiesen, das ganze ist also ziemlich unflexibel.
Also bauen wir uns das schnell selbst zusammen, dabei benutzen wir die Weather-API von Google. Yahoo hat auch eine Weather-API, genauso wie wetter.com. Hier zeige ich es am Beispiel von Google, die beiden anderen kommen in den nächsten Tagen dazu.
Falls jemand von euch noch andere APIs kennt die ähnlich einfach zu benutzen ist, auch kleinere Städte kennen und auch nicht nur ein Land abdecken (mindestens Europe wäre toll), immer her damit!
Google bietet eine API, an die wir einfach nur entweder die Postleitzahl oder einen Suchbegriff senden, und wir erhalten als Ergebnis das aktuelle Wetter sowie die Vorhersagen für die nächsten 4 Tage. Wir können zusätzlich noch die Sprache ändern in der wir die Ergebnisse erhalten möchten (“teils sonnig”/”partly sunny”).
So sieht das XML aus wenn man das Wetter von 59302 abfragt:
Wir erhalten also aktuelle Daten sowie Vorhersagen für die nächsten 4 Tage.
Diese Antwort parsen wir nun also und extrahieren die wichtigen Informationen. Hier der Code meiner kleinen Klasse:
<?php class Widget_Weather { private $_iconsSrc; private $_country; private $_language; private $_googleIconsSrc = '/ig/images/weather/'; public function __construct($iconsSrc = '/', $country = 'Germany', $language = 'de') { $this->_iconsSrc = $iconsSrc; $this->_country = $country; $this->_language = $language; } public function getData($postcode, $search = '') { if ($search != '') { $location = $search; } else { $location = $postcode . '-' . $this->_country; } $api = simplexml_load_string( utf8_encode( file_get_contents( 'http://www.google.com/ig/api?weather=' . $location . '&hl=' . $this->_language ) ) ); $result = $api->weather; $info = array(); // General information $info['city'] = (string)$result->forecast_information->city->attributes()->data; $info['date'] = (string)$result->forecast_information->forecast_date->attributes()->data; $info['time'] = (string)$result->forecast_information->current_date_time->attributes()->data; // Current weather $info[0]['condition'] = (string)$result->current_conditions->condition->attributes()->data; $info[0]['temperature'] = (string)$result->current_conditions->temp_c->attributes()->data; $info[0]['humidity'] = (string)$result->current_conditions->humidity->attributes()->data; $info[0]['wind'] = (string)$result->current_conditions->wind_condition->attributes()->data; $info[0]['icon'] = $this->_getIcon((string)$result->current_conditions->icon->attributes()->data); // Forecast of today and the following 3 days $i = 1; foreach ($result->forecast_conditions as $forecast) { $info[$i]['dayOfWeek'] = (string)$forecast->day_of_week->attributes()->data; $info[$i]['condition'] = (string)$forecast->condition->attributes()->data; $info[$i]['lowTemperature'] = (string)$forecast->low->attributes()->data; $info[$i]['highTemperature'] = (string)$forecast->high->attributes()->data; $info[$i]['icon'] = $this->_getIcon((string)$forecast->icon->attributes()->data); $i++; } return $info; } private function _getIcon($googleIconSrc) { return str_replace($this->_googleIconsSrc, $this->_iconsSrc, $googleIconSrc); } } $myWeather = new Widget_Weather('/img/weather/icons/'); $weatherInformation = $myWeather->getData(59302); echo "Das Wetter in ".$weatherInformation['city'].":<br/>\n"; echo $weatherInformation[1]['dayOfWeek']."<br/>\n"; echo $weatherInformation[1]['condition']."<br/>\n"; echo "min. ".$weatherInformation[1]['lowTemperature']."° C | max. ".$weatherInformation[1]['highTemperature']."° C<br/>\n"; echo "<img src=\"".$weatherInformation[1]['icon']."\" alt=\"".$weatherInformation[1]['condition']."\" />";
Die Beispielausgabe sieht dann so aus:
$weatherInformation = $myWeather->getData(59302);
Bei einer Suche nach “Oelde” erhält man dieses Ergebnis:
$weatherInformation = $myWeather->getData(null, 'Oelde');
Leider wird hier das Bundesland nicht korrekt übersetzt, da müßte man also noch etwas kleines bauen falls man es anzeigen möchte.
Hier noch ein Beispiel:
$weatherInformation = $myWeather->getData(null, 'Gerasdorf+bei+Wien');
Man kann sogar (mit einem kleinen Trick) Geo-Daten verwenden, sprich Longitude und Latitude, hier am Beispiel des Nürburgrings:
$weatherInformation = $myWeather->getData(null, ',,,50334722,6944444');
Mit Hilfe dieses Services kann man sehr leicht auch einen Temperaturverlauf darstellen wenn man das möchte. Man ruft das entsprechende Script einfach halbstündlich auf und speichert die Ergebnisse in einer Datenbank. Und schon kann man ein schönes Diagramm erstellen mit dem Temperaturverlauf der letzten Wochen, Monaten und Jahren (natürlich nur ab dem Zeitpunkt ab dem man sammelt).
Damit bei einer gut besuchten Seite nicht jeder Besucher einen Request zu Google verursacht sollte man an einen kleinen Cache denken, sodass die Daten z.B. eine Stunde lang gespeichert werden, denn häufiger ändert sich das Wetter und die Vorhersagen nicht
Leider ist die API seit Jahren nicht dokumentiert, es gibt keine Nutzungsbedingungen etc., dazu schweigt sich Google aus, es ist also nicht klar unter welchen Bedingungen man sie verwenden kann.
Hier ein kleines zip-Archiv mit den Google-Bildchen. Es bietet sich aber natürlich auch an, eigene Bilder zu erstellen, die zum Webseitenlayout passen.