Wetter auf eigener Website mit Google Weather API 11.09.2009

  • zu del.icio.us hinzufügen zu Mister Wong hinzufügen zu Technorati hinzufügen RSS Feed abonnieren

Einige Wetter-Websites bieten Webmastern ein Wetter-Widget an, das diese auf ihrer Homepage integrieren können. Allerdings hat man darüber keine Gestaltungsfreiheit und muss gegebenenfalls unschöne Werbung z. B. in Form eines Links auf dem Widget hinnehmen. Google jedoch liefert eine Schnittstelle, die Wetterdaten im „Rohformat” in XML zur Verfügung stellt. Mit Hilfe von PHP5 lassen sich die Wetterdaten problemlos auslesen.

» Demo (Wettervorhersage)
» Das PHP-Script als Download (Nutzungsrechte siehe Datei)


Google Weather API

Unter folgendem URL kann man das Google Wetter mit allen Wetterdaten abrufen:

http://www.google.com/ig/api?weather=[LOCATION]&hl=[LANGUAGE]

[LOCATION] und [LANGUAGE] müssen entsprechend ersetzt werden. Bei der Wetterstation ([LOCATION]) kann man entweder die Postleitzahl in Kombination mit dem Land angeben (z. B. 46562-Germany) oder direkt den Ort (z. B. Voerde). Die erste Variante ist eindeutiger, denn gleichnamige Städte können in unterschiedlichen Ländern oder mehrmals in einem Land vorkommen (vgl. Frankfurt). Die Sprache ([LANGUAGE]) wird als Kürzel angegeben (z. B. de oder en).


Wetterdaten auslesen

Folgende Funktion ließt in PHP 5 die Wetterdaten vom Google Wetter aus (PHP 4 wird nicht unterstützt):

function website_wetter($plz, $land, $icons_src="/", $sprache="de", $ort="")
{
$icons_google = "/ig/images/weather/";

if($ort != "")
{
$station = $ort;
}
else
{
$station = $plz."-".$land;
}

$api = simplexml_load_string(utf8_encode(file_get_contents("http://www.google.com/ig/api?weather=".$station."&hl=".$sprache)));

$wetter = array();

// Allgemeine Informationen
$wetter['stadt'] = $api->weather->forecast_information->city->attributes()->data;
$wetter['datum'] = $api->weather->forecast_information->forecast_date->attributes()->data;
$wetter['zeit'] = $api->weather->forecast_information->current_date_time->attributes()->data;

// Aktuelles Wetter
$wetter[0]['zustand'] = $api->weather->current_conditions->condition->attributes()->data;
$wetter[0]['temperatur'] = $api->weather->current_conditions->temp_c->attributes()->data;
$wetter[0]['luftfeuchtigkeit'] = $api->weather->current_conditions->humidity->attributes()->data;
$wetter[0]['wind'] = $api->weather->current_conditions->wind_condition->attributes()->data;
$wetter[0]['icon'] = str_replace($icons_google, $icons_src, $api->weather->current_conditions->icon->attributes()->data);

// Wettervorhersage für heute, morgen, übermorgen und in drei Tagen ($wetter[1] bis $wetter[4])
$i = 1;
foreach($api->weather->forecast_conditions as $weather)
{
$wetter[$i]['wochentag'] = $weather->day_of_week->attributes()->data;
$wetter[$i]['zustand'] = $weather->condition->attributes()->data;
$wetter[$i]['tiefsttemperatur'] = $weather->low->attributes()->data;
$wetter[$i]['hoechsttemperatur'] = $weather->high->attributes()->data;
$wetter[$i]['icon'] = str_replace($icons_google, $icons_src, $weather->icon->attributes()->data);

$i++;
}

return $wetter;
}

Erläuterung der Parameter:
$plz enthält die Postleitzahl des jeweiligen Ortes
$land enthält das Land, in dem der Ort liegt
$icons_src enthält den Pfad zum Ordner, in dem die Wetter-Icons liegen
$sprache enthält die Sprache, in der die Wetterdaten bereitgestellt werden sollen
$stadt enthält den Namen der Stadt (wird dieser angegeben, werden $plz und $land in der Funktion nicht beachtet)


Wetterdaten ausgeben

Da die Funktion ein Array zurückgibt, müssen wir diese also in einem Array speichern:

$wetter = website_wetter("46562", "Germany", "/wetter-icons/");

Die Wettervorhersage für heute könnte man wie folgt ausgeben:

echo "Wetter in ".$wetter['stadt'].":<br/>\n";
echo $wetter[1]['wochentag']."<br/>\n";
echo $wetter[1]['zustand']."<br/>\n";
echo "min. ".$wetter[1]['tiefsttemperatur']."&deg; C | max. ".$wetter[1]['hoechsttemperatur']."&deg; C<br/>\n";
echo "<img src=\"".$wetter[1]['icon']."\" alt=\"".$wetter[1]['zustand']."\" />\n";

Das Ergebnis in HTML schaut dann z. B. so aus:

Wetter in Voerde (Niederrhein), NRW:<br/>
Fr.<br/>
Meist sonnig<br/>
min. 11&deg; C | max. 18&deg; C<br/>
<img src="/wetter-icons/mostly_sunny.gif" alt="Meist sonnig" />

Die verschiedenen Wetter-Icons

Google sieht für die Wetterdaten 22 verschiedene Zustände des Wetters vor. Demnach gibt es auch 22 verschiedene Icons, die das entsprechende Wetter verdeutlichen. Wichtig ist, dass man sich nach den vorgegebenen Dateinamen richtet, wenn man eigene Icons verwenden möchte. Hier die Liste der 22 Wetter-Icons:

chance_of_rain.gif
sunny.gif
mostly_sunny.gif
partly_cloudy.gif
mostly_cloudy.gif
chance_of_storm.gif
showers.gif
rain.gif
chance_of_snow.gif
cloudy.gif
mist.gif
storm.gif
thunderstorm.gif
chance_of_tstorm.gif
sleet.gif
snow.gif
icy.gif
dust.gif
fog.gif
smoke.gif
haze.gif
flurries.gif

Um die Wetter-Icons von Google zu vergleichen, sind diese auf der Demo-Seite aufgelistet.
Hier ein Anwendungsbeispiel (gefunden auf DuisburgFans.de):
Wetterbox auf DuisburgFans.de


Rechtliches

Google liefert für seine Weather API keine offizielle Dokumentation. Die Google Wetter API ist vielmehr ein Produkt des Google Kalenders, in dem Google das Wetter einbindet. Die Nutzung der Weather API erfolgt somit zurzeit noch auf eigene Gefahr. Eine Alternative liefert der Yahoo! Weather RSS Feed, der allerdings nicht mit deutschen Postleitzahlen umgehen kann, sondern eine Location ID benötigt. Zur Ermittlung beim Yahoo! Wetter einfach die Stadt suchen und auf der Unterseite dann auf den RSS-Button klicken.

» Demo (Wettervorhersage)
» Das PHP-Script als Download (Nutzungsrechte siehe Datei)

Wie immer kann man mich bei Fragen gerne über das Kontaktformular anschreiben oder einen Kommentar hinterlassen.


« Zur Übersicht

Kreil
1
am 05.10.2009 um 09:43 Uhr.
Hallo,
leider bekomme ich das tolle PHP-Script nicht zum laufen, nach dem Ausfüllen der oberen "function website_wetter" habe ich immer einen Fehler in Zeile 14 ?! Liegt das irgendwie am "Array" ?

Vielen Dank im Voraus.

MfG
Kreil
Sebastian
2
am 05.10.2009 um 11:33 Uhr.
Die Parameter der website_wetter Funktion bitte nicht ändern. Die entsprechenden Werte der Parameter erst im Funktionsaufruf
$wetter = website_wetter("46562", "Germany", "/wetter-icons/");
angeben.
Sebastian
3
am 06.10.2009 um 10:12 Uhr.
Parse error: parse error, unexpected T_OBJECT_OPERATOR
Diese Fehlermeldung ist ein untrügliches Anzeichen dafür, dass lediglich PHP 4 auf eurem Server bzw. Webspace läuft. Simplexml benötigt jedoch PHP 5.
Joerg
4
am 10.10.2009 um 10:24 Uhr.
Wer bei 1und1 ist, kann per .hatacces PHP 5 einstellen, sofern das in seinem Paket ist. Dazu einfach in die .htacces folgende Zeile am Anfang einfügen:
AddType x-mapp-php5 .php AddHandler x-mapp-php5 .php
Bei mir kommt trotzdem:
Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /homepages/22/XXXXXXXXXXXX/htdocs/XXXXXXXXX/weather.php on line 26
Warning: file_get_contents(http://www.google.com/ig/api?weather=37083-Deutschland&hl=de) [function.file-get-contents]: failed to open stream: no suitable wrapper could be found in /homepages/22/XXXXXXXXXXXX/htdocs/XXXXXXXXX/weather.php on line 26
Fatal error: Call to a member function attributes() on a non-object in /homepages/22/XXXXXXXXXXXX/htdocs/XXXXXXXXX//weather.php on line 31
Sebastian
5
am 10.10.2009 um 11:34 Uhr.
Hallo Joerg,

überprüfe doch bitte mal die php.ini Einstellungen.
allow_url_fopen = 1 ist wichtig.

Du kannst auch eine phpinfo.php erstellen mit dem Inhalt:
<?php phpinfo(); ?>

Und dort schauen, ob allow_url_fopen aktiviert ist. Wenn nicht, solltest du mit deinem Webspace Anbieter sprechen.
Alexander
6
am 19.10.2009 um 23:35 Uhr.
Erste Snippet ist super, aber er zeigt keine russische (oder änliche ) sprache.
Fix:
if ($sprache=='ru') {
$api = simplexml_load_string(iconv('cp1251', 'utf-8', (file_get_contents("http://www.google.com/ig/api?weather=".$station."&hl=".$sprache))));
} else {
$api = simplexml_load_string(utf8_encode(file_get_contents("http://www.google.com/ig/api?weather=".$station."&hl=".$sprache)));
}
sonst alles gut!
Martin
7
am 30.11.2009 um 19:18 Uhr.
Hallo!

Funktioniert das auch mit Österreichischen Orten?

lg
Sebastian
8
am 30.11.2009 um 20:41 Uhr.
Hallo Martin,

ja, das funktioniert mit allen internationalen Orten.

Gruß
Sebastian
Sascha
9
am 22.12.2009 um 09:07 Uhr.
Hallo.
Funktioniet an und für sich super. Nur zeigt es mir die Umlaute nicht richtig an.
Bewölkt anstatt Bewölkt.

Gruß
Sascha
Sascha
10
am 22.12.2009 um 10:05 Uhr.
Hat sich erledigt, habe noch das hier eingebaut:
header('content-type: text/html; charset=utf-8');

Sascha
Rainer
11
am 17.02.2010 um 00:40 Uhr.
Habe ein weiteres Wetter-Icon gefunden (Aktuell gerade zu sehen unter "Paris")
Und zwar "rain_snow.gif" (Text: Regen und Schnee?) Das Bild ist identisch mit "storm.gif".

Vermutlich werden noch mehr als die 22 Wetterzustände von Google verwendet.

Das Script ist übrigens super!

Gruß Rainer
Jurgen
12
am 04.03.2010 um 18:04 Uhr.
Hallo
So funzt alles einwandfrei!!
Meine Frage : Kann man das auch alles Horizontal anordnen ?
Rainer
13
am 04.03.2010 um 21:58 Uhr.
Hallo Jurgen,

versuch es mal mit folgender Änderung im Script (ab // Beispielhafte Ausgabe):


echo "<table width='500' border='0' bgcolor='#FFFFFF' cellpadding='1' cellspacing='0'>";

echo "<tr>\n";
echo "<td colspan='6'><font face='Verdana' size='2' color='#000000'><b>Das Wetter in ".$wetter['stadt']."</b></font></td>\n";
echo "</tr>\n";

echo "<tr>\n";
echo "<td align='center' width='53' bgcolor='#FFFFFF'><font face='Verdana' size='1'>Aktuell</font></td>\n";
echo "<td></td>\n";
echo "<td align='center' width='80' bgcolor='#FFFFFF'><font face='Verdana' size='2'>Heute</font></td>\n";
echo "<td align='center' width='80'><font face='Verdana' size='2'>".$wetter[2]['wochentag']."</font></td>\n";
echo "<td align='center' width='80'><font face='Verdana' size='2'>".$wetter[3]['wochentag']."</font></td>\n";
echo "<td align='center' width='80'><font face='Verdana' size='2'>".$wetter[4]['wochentag']."</font></td>\n";
echo "</tr>\n";

echo "<tr>\n";
echo "<td align='center' width='53' bgcolor='#FFFFFF'><img border='1' src=\"http://www.google.com/ig/images/weather".$wetter[0]['icon']."\" alt=\"".$wetter[0]['zustand']."\" /></td>\n";
echo "<td bgcolor='#FFFFFF'><font face='Verdana' size='1'>".$wetter[0]['wind']."<br>".$wetter[0]['luftfeuchtigkeit']."</font></td>\n";
echo "<td align='center' width='80' bgcolor='#FFFFFF'><img border='1' src=\"http://www.google.com/ig/images/weather".$wetter[1]['icon']."\" alt=\"".$wetter[1]['zustand']."\" /></td>\n";
echo "<td align='center' width='80'><img border='1' src=\"http://www.google.com/ig/images/weather".$wetter[2]['icon']."\" alt=\"".$wetter[2]['zustand']."\" /></td>\n";
echo "<td align='center' width='80'><img border='1' src=\"http://www.google.com/ig/images/weather".$wetter[3]['icon']."\" alt=\"".$wetter[3]['zustand']."\" /></td>\n";
echo "<td align='center' width='80'><img border='1' src=\"http://www.google.com/ig/images/weather".$wetter[4]['icon']."\" alt=\"".$wetter[4]['zustand']."\" /></td>\n";
echo "</tr>\n";

echo "<tr>\n";
echo "<td align='center' bgcolor='#FFFFFF'><font face='Verdana' size='3'><b>".$wetter[0]['temperatur']."&deg;C</b></font></td>\n";
echo "<td bgcolor='#FFFFFF'><font face='Verdana' size='2'><b>".$wetter[0]['zustand']."</b></font></td>\n";
echo "<td align='center' bgcolor='#FFFFFF'><font face='Verdana' size='2'><font color='#FF0000'>".$wetter[1]['hoechsttemperatur']."&deg;C</font><br>\n";
echo "<font color='#0000FF'>".$wetter[1]['tiefsttemperatur']."&deg;C</font></font></td>\n";
echo "<td align='center'><font face='Verdana' size='2'><font color='#FF0000'>".$wetter[2]['hoechsttemperatur']."&deg;C</font><br>\n";
echo "<font color='#0000FF'>".$wetter[2]['tiefsttemperatur']."&deg;C</font></font></td>\n";
echo "<td align='center'><font face='Verdana' size='2'><font color='#FF0000'>".$wetter[3]['hoechsttemperatur']."&deg;C</font><br>\n";
echo "<font color='#0000FF'>".$wetter[3]['tiefsttemperatur']."&deg;C</font></font></td>\n";
echo "<td align='center'><font face='Verdana' size='2'><font color='#FF0000'>".$wetter[4]['hoechsttemperatur']."&deg;C</font><br>\n";
echo "<font color='#0000FF'>".$wetter[4]['tiefsttemperatur']."&deg;C</font></font></td>\n";
echo "</tr>\n";

echo "<tr>\n";
echo "<td colspan='2'><font face='Verdana' size='1'>Script:<a href=\"http://www.web-spirit.de/webdesign-tutorial/9/Wetter-auf-eigener-Website-mit-Google-Weahter-API\" target=\"_blank\">Wettervorhersage</a></font></td>\n";
echo "<td align='center' width='80' bgcolor='#FFFFFF'><font face='Verdana' size='1'>".$wetter[1]['zustand']."</font></td>\n";
echo "<td align='center' width='80'><font face='Verdana' size='1'>".$wetter[2]['zustand']."</font></td>\n";
echo "<td align='center' width='80'><font face='Verdana' size='1'>".$wetter[3]['zustand']."</font></td>\n";
echo "<td align='center' width='80'><font face='Verdana' size='1'>".$wetter[4]['zustand']."</font></td>\n";

echo "</tr>\n";

echo "</table>";
Jurgen
14
am 05.03.2010 um 09:10 Uhr.
Hallo
Wenn ich das so nach //Beispiel Ausgabe
Einfüge funzt es nicht !
Heißt ich kopiere Deinen Code lösche alles unterhalb von // Beispiel Ausgabe
und füge Deinen Code ein. Wenn ich das richtig verstanden habe ?
Wenn ich das so mache funktioniert das leider nicht.
Sorry bin in PHP nicht wirklich soo Fit.
Aber Danke erstmal für die so schnelle Reaktion (Antwort)
hätte ich nicht erwartet !
Jurgen
15
am 05.03.2010 um 09:20 Uhr.
Fehler zusehen auf der Seite
Parse error: syntax error, unexpected '<' in /is/htdocs/wp1154660_QRKFVV4YIX/www/web/klein/wetter2.php on line 63
Sebastian
16
am 05.03.2010 um 09:33 Uhr.
Es ist doch alles viel einfacher.
Einfach den Paragraphen <p> eine Klasse geben z. B. <p class="wetter"> und dann in CSS nebeneinander floaten lassen.
p.wetter { float:left; }
Jurgen
17
am 05.03.2010 um 09:39 Uhr.
Jungs ihr seit einfach Klasse !!!!!
Jetzt funzt es einwandfrei !!!!
Jurgen
18
am 05.03.2010 um 10:03 Uhr.
Jetzt muss ich nur noch die Umlaute hinbekommen.
Da ich mit Wysiwyg Web Builder Arbeite muss auch das per Hand geändert werden.
Aber das bekomme ich auch noch raus wie und wo das geht.
Rainer
19
am 06.03.2010 um 00:41 Uhr.
@Jürgen:
Habe gesehen, dass es doch geklappt hat.
Vermutlich hat das Ende Zeichen für php gefeht? ( ?> )
Problem Umlaute: Zeichensatz utf-8 verwenden. Kommentar 9 von Sascha.

Gruß nach Thüringen

@Sebastian:
Ich verwende halt noch Tabellen beim Erstellen meiner Seiten. Mit Stylesheets geht das natürlich besser und mit weniger Aufwand

Einen eigenen Kommentar schreiben






captcha