Wetter auf eigener Website mit Google Weather API 11.09.2009
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
$ort 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']."° C | max. ".$wetter[1]['hoechsttemperatur']."° 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° C | max. 18° 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.gifUm die Wetter-Icons von Google zu vergleichen, sind diese auf der Demo-Seite aufgelistet.
Hier ein Anwendungsbeispiel (gefunden 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.
Kommentare
(Trackback senden) (Wetter auf eigener Website mit Google Weather API) (Kommentare abonnieren)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_OPERATORDiese 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 .phpBei 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 31Sebastian
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!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']."°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']."°C</font><br>\n";
echo "<font color='#0000FF'>".$wetter[1]['tiefsttemperatur']."°C</font></font></td>\n";
echo "<td align='center'><font face='Verdana' size='2'><font color='#FF0000'>".$wetter[2]['hoechsttemperatur']."°C</font><br>\n";
echo "<font color='#0000FF'>".$wetter[2]['tiefsttemperatur']."°C</font></font></td>\n";
echo "<td align='center'><font face='Verdana' size='2'><font color='#FF0000'>".$wetter[3]['hoechsttemperatur']."°C</font><br>\n";
echo "<font color='#0000FF'>".$wetter[3]['tiefsttemperatur']."°C</font></font></td>\n";
echo "<td align='center'><font face='Verdana' size='2'><font color='#FF0000'>".$wetter[4]['hoechsttemperatur']."°C</font><br>\n";
echo "<font color='#0000FF'>".$wetter[4]['tiefsttemperatur']."°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
Spider IT Deutschland - René Mansveld
20
am 19.03.2010 um 11:48 Uhr.1. Danke für die Funktion, die dient mir als Beispiel (muss noch einiges dran gemacht werden).
2. Die Übergabe von PLZ, Ort und Land geht viel einfacher mit + anstatt -, dann kann man auch grundsätzlich alles und in beliebiger Reihenfolge einsetzen und der Ort wird auch erkannt wenn mehrere Orte die gleiche PLZ haben. Beispiel: http://www.google.com/ig/api?weather=37627+Stadtoldendorf+Deutschland&hl=de.
3. Tabellen für die Gestaltung sind mega-out, denn Tabellen gibt es nur zur tabellarischen Darstellung von Daten. Dies sollte im Hinblick auf die Barrierefreiheit eingehalten werden, da Screen-Reader eine Tabelle nur als solches erkennen können.
4. In eine PHP-Datei kann reines HTML stehen, nicht nur in echo-Anweisungen. Dafür vorher den PHP-Abschnitt beenden mit ?> und nach dem HTML-Abschnitt mit <?php wieder starten. Der Nutzen: Der HTML-Code ist in ein HTML-Editor erstell- und verwaltbar. Ausgaben aus PHP lassen sich an beliebiger Stelle mit <?php echo $x; ?> oder <?=$x?> einbinden (letztere Möglichkeit nicht unter Windows).
5. Für das freie CMS Contenido (www.contenido.org) gibt es das Wetter bald als Modul, vielen Dank nochmal für den Beispielcode!
Webtwist - Webdesign, Werbeagentur
21
am 20.03.2010 um 09:20 Uhr.Der letzte Eintrag ist zwar schon ein bissl her, aber als rechtlich sichere Alternative gibt es noch das openWeather Api von Wetter.com
Thomas Wolf
22
am 22.03.2010 um 17:52 Uhr.Habe das script auf meinem webspace laufen gehabt, und in einem iframe von woanders aufgerufen. Hat ca. 10 Tage funktioniert, jetzt geht es nicht mehr. Nachdem mir mein Provider versichert hat, keinerlei Umstellungen am Server vorgenommen zu haben, kann ich nur den Schluss ziehen, dass google selbst die Bremse gezogen hat. Andererseits funktioniert ja hier auch noch alles - und diese Seiten werden wohl intensiver genutzt werden, als die meinigen, wobei letztere gerade einer wirklich intensiven Testingphase unterzogen werden. Irgendwelche Neuigkeiten zu den rechtlichen Aspekten?
Thomas Wolf
23
am 22.03.2010 um 19:16 Uhr.Absurderweise geht es jetzt, da ich das script auf einen anderen Server übersiedelt habe, auch wieder vom ursprünglichen Ort aus. Was weiß ich, was da los war. Vielleicht war meine Paranoia google gegenüber ja gänzlich unberechtigt. Wie dem auch sei, ich habe das script um einen kleinen Datencache ergänzt - es reicht ja wohl meist, die Wettervorschau nur dann und wann zu aktualisieren. Hier der ergänzente Teil, der die Zeile mit $api=... ersetzt.
$file=$station.$sprache.\".xml\";
$interval=60*60*6; // sec * min * h = Updateintervall [hier alle 6h], so rechnet es sich besser ;)
if (file_exists($file) && (filectime($file)+$interval>time()))
{
$content=file_get_contents($file);
}
else
{
$request = file_get_contents(\"http://www.google.com/ig/api?weather=\".$station.\"&hl=\".$sprache);
if (!$request) $content=file_get_contents($file); // lebt davon, dass es erstmal klappt
else {$content=$request; $writeres=file_put_contents($file,$content);} // achtung auf schreibrechte!
}
$api = simplexml_load_string(utf8_encode($content));
Andreas
24
am 04.04.2010 um 13:33 Uhr.Tolles script,
habe allerdings auch Probleme mit den Umlauten.
Den Header kann ich leider nicht auf UTF-8 setzen [ header(\\\'content-type: text/html; charset=utf-8\\\') ]
da die gesamten Seiten auf ISO-8859-1 aufsetzen.
Gibt es hier eine Lösung?
Probiere schon rum mit z.B.:
// Aktuelles Wetter
$wetter[0][\\\'zustand\\\'] = utf8_encode($api->weather->current_conditions->condition->attributes()->data);
aber es will nicht klappen.
LG
Andreas
Philipp
25
am 04.04.2010 um 13:58 Uhr.Hallo!
Tolles Skript. Inspirierte mich zu www.regnets.in/. Einfach beispielsweise www.regnets.in/berlin eingeben und fertig.
Grüße
Andreas
26
am 04.04.2010 um 21:37 Uhr.Hab das Problem mit den Umlauten nun gelöst:
Hier der Beipsiel-Code:
// Funktionsaufruf in Array
$wetter = website_wetter("30159", "Germany");
// replace special characters in wetter
// Ö->Oe, Ä->Ae, Ü->Ue
// ö->oe, ä->ae, ü->ue
$search = array("/Â/", "/ö/", "/ü/");
$replace = array(" ", "ö", "ü");
$wetter[0]['zustand'] = trim(preg_replace($search, $replace, $wetter[0]['zustand']));
$wetter[0]['luftfeuchtigkeit'] = trim(preg_replace($search, $replace, $wetter[0]['luftfeuchtigkeit']));
$wetter[1]['zustand'] = trim(preg_replace($search, $replace, $wetter[1]['zustand']));
$wetter[2]['zustand'] = trim(preg_replace($search, $replace, $wetter[2]['zustand']));
$wetter[3]['zustand'] = trim(preg_replace($search, $replace, $wetter[3]['zustand']));
$wetter[4]['zustand'] = trim(preg_replace($search, $replace, $wetter[4]['zustand']));
// Beispielhafte Ausgabe
Andreas
27
am 08.04.2010 um 21:33 Uhr.Was gib ich denn zum Beipsiel an für WIEN / Österreich?
PLZ 2201
$wetter = website_wetter("2201", "Österreich"); Funktioniert nicht !
Sebastian
28
am 09.04.2010 um 09:31 Uhr.$wetter = website_wetter("", "Austria", "/wetter-icons/", "de", "Gerasdorf+bei+Wien");Sebastian
30
am 12.04.2010 um 00:09 Uhr.$wetter = website_wetter("", "Austria", "/wetter-icons/", "de", "Gerasdorf+bei+Wien");Andeas
31
am 13.04.2010 um 23:04 Uhr.So gehts:
$wetter = website_wetter("Graz", "Austria");
Nun werden aber die z.T. engl. Namen ausgegeben, also z.B. "Das Wetter für Graz, Styria:" anstatt ....Graz, Steiermark...
Kan man das eindeutschen?
Ramon
32
am 17.04.2010 um 19:47 Uhr.Super kleines Script! Danke!
Hat einer von euch schon versucht, die Google-Gifs gegen PNGs auszutauschen ?
Markus Essler
33
am 21.04.2010 um 20:10 Uhr.Vielen Dank für dieses hervorragende Script!
Was mich daran allerdings enorm stört, ist die Tatsache (wie auch von Andreas aus Österreich erwähnt), dass die Bundesländer bzw. das jeweilige Bundesland nicht in Deutsch sondern in Englisch angezeigt werden.
Das liegt aber bestimmt an der Google-API und nicht an dem Script (vermute ich zumindest).
Sollte sich trotzdem eine Lösung für dieses „Problem“ finden lassen, dann wäre ich sehr erfreut.
Besten Gruß
Markus Essler
Andreas
34
am 25.04.2010 um 18:41 Uhr.Zu Markus: englische Namen
Das Problem kann man zumindest händisch lösen - bei Deiner einzigen Site kannst Du schreiben:
anstatt:
// Beispielhafte Ausgabe
echo "<h3><a id=\"Wetter\">Das Wetter für ".$wetter['stadt'].":</a></h3>\n";
Nun
// Beispielhafte Ausgabe
echo "<h3><a id=\"Wetter\">Das Wetter für Heilbronn, Bayern</a></h3>\n";
Ramon
35
am 30.04.2010 um 08:55 Uhr.Um die Alpha-Transparent der PNG-Grafiken nutzen zu können, müssen die PNG-Grafiken natürlich geladen werden. Ich habe es mal mit einer zusätzlichen Zeile im Script gelöst. Gleich nach der Zeile:
$wetter[$i][\'icon\'] = str_replace($icons_google, $icons_src, $weather->icon->attributes()->data);
Habe ich folgende Zeile eingefügt:
$wetter[$i][\'icon\'] = str_replace(\'.gif\', \'.png\', $wetter[$i][\'icon\']);
Ich habe es mal auf meinem kleinen privaten Portal eingebaut, auf dem ich verschiedene Dinge teste, bevor ich sie an anderer Stelle einsetze ( www.easyQ.de )
ProfdrDenis
36
am 13.05.2010 um 17:03 Uhr.Super tolles Script, Aber wie kann ich eine Abfrage einbauen, dass der Nutzer in meinem Forum den Ort selbst eingibt? und das nicht vorgegeben ist?
Alexey
37
am 05.06.2010 um 22:02 Uhr.Super tipp mit PNG, hat irgendjemand eine idee wie ich statt text fuer wind auch PNG bilder namen generieren kann und text fuer windgeschwindigkeit.
Das waehre einfach HAMMER...
DANKE
Ramon
39
am 23.06.2010 um 10:46 Uhr.Manchmal scheint die Abfrage einiger Orte unterbrochen zu sein. Ein Fehler-Handler wäre angebracht, da sich Fatal-Errors auf der Website nicht so gut präsentieren lassen. Hat sich schon jemand darüber Gedanken gemacht?
mark
40
am 29.08.2010 um 22:00 Uhr.ich hab mir n fehler code eingebaut:
if (isset($api->weather->problem_cause)) {
$x = (string)$api->weather->problem_cause->attributes()->data;
return $x;
}
//ansonsten weiter
tom
41
am 14.09.2010 um 18:50 Uhr.Hallo,
ich bin leider zu taub um das Script zu laufen zu kriegen. \"Ich sehe garnichts\". Reicht nicht ein include um das Script auf der Seite einzufügen ?
Wär sehr dankbar wenn mir jemand kurz sagen kann was man genau machen muss :/
Morrers
42
am 25.09.2010 um 09:59 Uhr.Entweder habt ihr alle unsichere Server das es funktioniert, bei mir kommt bei fopen usw sowie file_get_contents immer eine Fehlermeldung
failed to open stream: no suitable wrapper could be found
c0de
43
am 25.09.2010 um 19:54 Uhr.Ausführliche Information über die Wetter Api, danke! Besonders die Liste der Bilder hat mir gerade bei einem Projekt gefehlt!
Sascha
45
am 06.10.2010 um 10:34 Uhr.Hi,
vorab danke für die Mühe und das Skript - läuft bei mir, nachdem allow_url_fopen vom Provider freigeschaltet wurde.
Eine Frage habe ich dennoch: Ich würde die Sache gerne mit den lat, lon-Werten verwenden (und nicht mit PLZ oder Ort). Ich habe dazu in diesem Beitrag: http://www.hackthenet.de/weblog/225/google-wetter-api Kommentar 35 einen Lösungsansatz gefunden, der bei mir aber nicht läuft. Eventuell habe ich das auch falsch integriert. Könnte mir jemand einen funktionierenden Lösungsweg aufzeigen? Ich wäre sehr dankbar!
Beste Grüße und nochmals danke!
Sebastian
46
am 06.10.2010 um 13:29 Uhr.Um mit den Geo-Daten zu arbeiten, musst du den folgenden Funktionsaufruf verweden:
$wetter = website_wetter("", "", "/", "de", ",,,50334722,6944444");
$plz und $land bleiben leer, dadurch wird $ort mit den Longitude und Latitude Angaben verwendet.
Thomas
48
am 23.11.2010 um 10:14 Uhr.Hallo mark,
an welcher Stelle hast du deinen Fehlercode eingebaut?
----------
if (isset($api->weather->problem_cause)) {
$x = (string)$api->weather->problem_cause->attributes()->data;
return $x;
}
//ansonsten weiter
----------
Florian
49
am 02.12.2010 um 15:17 Uhr.Kann mir jemand sagen wie es mit der kommerziellen Nutzung dieser Daten aussieht?
Offensichtlich ist der Webservice ja frei zugaenglich... Aber da es weder eine Dokumentation
noch \"Terms of use\" dazu gibt (Oder ich sie bisher noch nicht gefunden habe) tue ich mir schwer
zu bewerten ob dieser Service fuer mich verwendbar ist.
Kann mir dazu jemand was sagen?
mfg
Reinhard
50
am 24.12.2010 um 13:17 Uhr.Hi, sehr schönes Skript - Kompliment !!!
Nur eine Kleinigkeit zur Info: wenn die Sprache nicht DE sondern EN ist, dann wird die Temperatur-Einheit nicht korrekt angezeigt ... 24° C -> sondern es müsste 24° F -> Fahrenheit sein.
Gruss und schönes Fest!
Reinhard
Checker24
51
am 29.01.2011 um 11:31 Uhr.Endlich mal ne Wetterfunktion die man selbst umbauen bzw. verbessern kann. Gefällt mir, werde ich gleich mal ausprobieren.Vielen Dank
Didlido
52
am 08.02.2011 um 15:26 Uhr.Hi,
habe noch ein Problem mit dem PHP File
ich bekomme wegen diesen Zeilen:
$wetter['datum'] = $api->weather->forecast_information->forecast_date->attributes()->data;
immer folgende Fehlermeldung:
Fatal error: Call to a member function attributes()
muss ich noch irgendwas einbinden?
Habe auch PHP 5 im Einsatz
Sebastian
53
am 09.02.2011 um 13:10 Uhr.Das Problem wurde im 5. Kommentar bereits erläutert. Bitte überprüfe deine allow_url_fopen Einstellungen.
Didlido
54
am 10.02.2011 um 08:29 Uhr.Hi du,
danke für die Antwort. Das kann es aber nicht sein da es bei mir auf On gesetzt ist. Habe extra nochmal nachgesehen. Kann es noch eine zweite Ursache geben?
Tom
55
am 21.02.2011 um 14:40 Uhr.Ich finde das Skript und die Möglichkeit der Einbindung auch super, aber allow_url_fopen = 1 - ist das nicht ein Sicherheitsrisiko? Gibt es dafür eine andere Lösung?
Berlin
56
am 03.03.2011 um 15:08 Uhr.klasse geht super,
Wichtig: Auf jeden Fall Cache benutzen und nicht ständig abfragen - sonst droht die umgehende Aussperrung.
Maik
57
am 15.03.2011 um 00:28 Uhr.Vielen Dank für das super Skript.
Ich habe jedoch ein Zeitproblem. Wenn man die Google-API öffnet wie beschrieben, erhält man die Werte von vor 90 Minuten etwa. Entsprechend ist der aktuelle Tag jetzt um 0:30 Uhr noch der 14. März (<current_date_time data=\"2011-03-14 23:00:00 +0000\"/>) ...
Lässt sich das irgendwie umgehen, sodass 0 Uhr = 0 Uhr ist?
Danke,
Maik.
Marcel
58
am 27.03.2011 um 19:41 Uhr.Die Klasse ist echt eine gute Arbeit. Allerdings solltest du bei der Einbindung die Fehler abfangen die auftreten können. Derzeit ist der Wetter-Service z.B. down und bei dir wird ein dicker Error geschmissen. Also, Error-Handling fehlt noch. Sonst ein klasse Job!
Robert
59
am 05.04.2011 um 21:53 Uhr.Schöne Beschreibung für den Google-Service, ich habe noch eine Beschreibung für den weather.com-Service gefunden: http://www.keepaneye.de/wetterdaten-aus-xml-api-verwenden-aus-feed-einbinden/
Viele Grüße,
Robert
Patrick
60
am 10.04.2011 um 19:40 Uhr.Hallo Leute,
erstmal Danke für dieses tolle API, Sebastian! Ich hab es vor zwei Tagen auf meiner noch entstehenden Seite integriert und es hat gut funktioniert. Jetzt bekomme ich
Warning: file_get_contents(http://www.google.com/ig/api?weather=Hamburg-Germany&hl=de) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable in /mnt/webc/52/68/52747868/htdocs/wp/wp-content/themes/quaeng/header.php on line 50
Fatal error: Call to a member function attributes() on a non-object in /mnt/webc/52/68/52747868/htdocs/wp/wp-content/themes/quaeng/header.php on line 59
Jetzt habe ich schon diesen Fehlercode entdeckt und weiß leider nicht genau, wo er platziert werden muss, das es funktioniert.
Könnt ihr mir weiterhelfen?
Beste Grüße
Patrick
Chris
61
am 11.04.2011 um 12:57 Uhr.Ich habe ein ähnliches Problem mit der Weather API, die bis heute eigentlich immer fehlerfrei funktioniert hat.
Seit heute schmeißt die API mir manchmal nurnoch \"Call to a member function attributes() on a non-object\" raus und legt die ganze Webseite lahm.
Auf http://blog.rockettheme.com/forum/index.php?f=266&t=109548&p=581592&rb_v=viewtopic wird das gleiche Problem (allerdings vor einiger Zeit schon) geschildert, da scheint es etwas mit der Wind-Information zu tun zu haben. Seltsam ist halt, dass das erst seit heute (und bei meinem Vorredner seit gestern) der Fall ist.
Tino
62
am 26.05.2011 um 16:00 Uhr.Vielen Dank für das tolle Script!
Bei funzt alles wunderbar, nur irgendwie werden die Bilder nicht mehr angezeigt. Wenn ich den Bilderlink aufrufe, sagt mir eine Errorseite von Google, dass der Link nicht gefunden werden konnte.
Kann es sein, dass Google da was geändert hat?
Claus
63
am 26.05.2011 um 16:30 Uhr.Bei mir werden ab heute auch nicht mehr die Bilder angezeigt. Der Pfad zum Bild sieht nun auch etwas komisch aus:
http://www.meinehomepageadresse.de/wetter/iconhttp://g0.gstatic.com/images/icons/onebox/weather_scatteredthunderstorms-40.gif
Also meine homepageadresse wird der eigentlichen Adresse zum Bild vorangestellt.
Wie kann ich das verhindern?
Sebastian
64
am 27.05.2011 um 09:26 Uhr.Google hat neue Wetter-Icons erstellt, die auf einem neuen Server liegen und anders benannt wurden.
Ihr könnt nun die neue Version des Scripts herunterladen.
Auf der Demo-Seite findet ihr die neuen Wetter-Icons (fehlende werden nachgereicht, sobald bekannt).
conan
65
am 30.05.2011 um 13:42 Uhr.das script unktioniert gut. aber vllt kann mal wer die optimierte version hier hochladen? die anzahl der verbesserungen ist ja schon ziemlich groß. danke
Marlon
66
am 05.06.2011 um 16:45 Uhr.Trotz neuer Version kann die die URL zu den Bildern nicht anpassen.
"http://g0.gstatic.com/images/icons/onebox" steht immer mit drin.
Ich möchte meine eigenen Bilder verwenden.
$icons_google = "meine_url"
funktioniert nicht.
Rainer
67
am 05.06.2011 um 21:27 Uhr.Belasse einfach unter Wetterdaten auslesen den Link
$icons_google = "http://g0.gstatic.com/images/icons/onebox/"
und ändere weiter unten bei der Ausgabe den eigenem Link eigenen Bilddatei
echo "<img src=\"meine_url".$wetter[0-3]['icon']."\" alt=\"".$wetter[0]['zustand']."\" />\n";
Rainer
68
am 05.06.2011 um 21:41 Uhr.Text soll natürlich heißen:
und ändere weiter unten bei der Ausgabe den vorhandenen Link ab zur eigenen Bilddatei
Marlon
69
am 06.06.2011 um 13:39 Uhr.Hallo Rainer,
das habe ich auch probiert.
Dann sieht das ganze so aus:
http://www.meine_url/wetter/iconhttp://g0.gstatic.com/images/icons/onebox
Sebastian
70
am 06.06.2011 um 16:49 Uhr.Google hat wieder die alten Bilder drin. Daher bitte die neue Versionsadresse auskommentieren und die alte wieder rein.
Icons aus euren eigenen Ordnern verwendet ihr, wenn ihr den entsprechenden Ordner im Funktionsaufruf mit angebt:
$wetter = website_wetter("46562", "Germany", "http://meineURL/images/wetter/icons/", "de");Dann ist die Bildadresse direkt mit im Array drin.
Die finale Ausgabe im Script ist natürlich nur beispielhaft. Arbeitet am besten nur mit den Arrayfelder.
Profi Angler
71
am 26.06.2011 um 23:01 Uhr.Hey, vielen Dank für den ausführlichen Beitrag und das Script. Werde es umgemodelt auf Zend auf unserer Seite einbinden,
Lena
72
am 19.07.2011 um 15:17 Uhr.Noch mal zum Fehler
PHP Fatal error: Call to a member function attributes() on a non-object
bei mir in Zeile
$wetter[\'stadt\'] = $api->weather->forecast_information->city->attributes()->data;
Es funktioniert bei mir alles wunderbar, aber nach ca. 1-4 Stunden kommt dieser Fehler und die Seite bleibt stehen. (Derzeit aktualisiere ich zu testzwecken alle 10 Minuten, klar, viel zu oft und unnötig, aber ich teste ja noch ...)
Ich möchte diesen Fehler gerne abfangen, aber wie?
Kennt jemand eine Lösung?
Marcel
73
am 20.07.2011 um 21:16 Uhr.@Lena: Du könntest es z.B. mit einem
if (is_object($api))
{
... DEINE WETTERSACHEN...
}
abfangen.
Lena
74
am 22.07.2011 um 01:13 Uhr.Hallo Marcel, Danke für den Tipp.
Leider funktioniert es nicht.
Ich benutze eine function um eine Textzeile für ein Laufband zu generieren.
Nach dem Aufruf erfolgt als erstes eine Online-Abfrage:
function get_wetter($Standort, $Sprache="de") {
if (!fsockopen("www.google.com", 80, $errno, $errstr, 30)) {
$WetterZeile="Wetterdaten-Server derzeit nicht erreichbar";
return $WetterZeile; }
....
}
Das funktioniert.
Nach der $api-Zeile folgt das Abfangen des Fehlers: PHP Fatal error: Call to a member function attributes() on a non-object:
$api = simplexml_load_string(utf8_encode(file_get_contents("http://www.google.com/ig/api?weather=".$Standort."&hl=".$Sprache)));
if (!is_object($api)) {
$WetterZeile="Fehler in function Wetterdaten";
return $WetterZeile; }
$wetter = array(); $i=0;
$wetter['stadt'] = $api->weather->forecast_information->city->attributes()->data;
....
Das funktioniert im Ernstfall nicht.
Die function wird sehr oft (so 100 mal +/- 50) erfolgreich ausgeführt. Dann kommt der Fehler in Zeile "$wetter['stadt']..." der mit is_object wohl nicht abgefangen werden kann.
Mir ist noch nicht ganz klar, ist die Ursache in meinem Script oder kommt sie durch den API-Aufruf in mein Script?
Hat noch jemand eine Idee wie ich den Fehler abfangen kann?
Florian
75
am 05.08.2011 um 12:48 Uhr.Tolle Funktion, ich arbeite an einer TYPO3 Extension bei der sie zum Einsatz kommt. Sobal sie fertig ist poste ich hier einen Link. Noch zwei Verbesserungsvorschläge:
- Wenn $station Leer, oder Sonderzeichen enthält gibt das Script einen Fehler aus. Nachdem der Ort bei mir dynamisch gefüllt wird kann das durchaus vorkommen. Ich würde vorschlagen urlencode($station) zu verwenden, das hilft bei mir.
- Gleiches gilt wenn man eine ungültige Station eingibt, damit habe ich den Fehler abgefangen: if(!isset($api->weather->problem_cause->attributes()->data))
Ich hoffe das hilft dir das Skript noch zu verbessern,
Viele Grüße
Florian
Uli
76
am 09.08.2011 um 11:03 Uhr.schöne Funktion.
Aber ich suche noch nach der besten Methode den Ort anhand der IP zu ermitteln.
Wie macht ihr das? Sowas nutzt doch sicher schon jemand!?
Gruß Uli
Lena
77
am 12.08.2011 um 07:56 Uhr.Noch mal zum Fehler:
PHP Fatal error: Call to a member function attributes() on a non-object
==> gelöst
@Marcel: if (!is_object($api)) {return;} wird nie ausgeführt. Trotzdem danke für den Tipp.
@Florian: Das war der entscheidende Hinweis: Vielen Dank.
Beim API-Aufruf ist der Variableninhalt definitiv richtig (also nicht leer, keine Steuerzeichen, gültige Station)
if(isset($api->weather->problem_cause->attributes()->data)) {return;} schlägt aber trotzdem so 2-5 mal pro Tag für weniger als eine Minute an. Da dann die folgenden Datenabfragen nicht ausgeführt werden gibt es auch keinen \"Fatal Error\" mehr.
Chris
78
am 29.08.2011 um 21:36 Uhr.Hallo,
Wäre es auch möglich, eine Städte-Wetter-Funktion wie bei wetter.com zu programmieren. Also, dass es ein Suchfeld gibt, wo man die Stadt eingibt und dann das Wetter für diese Stadt erhält?
Christian
79
am 14.09.2011 um 13:06 Uhr.Hallo,
ich würde gerne die Sprache auf Englisch umstellen,
wenn ich statt "de" - "en" eingebe - ist alles auf englisch, jedoch wird die Temperatur in Fahrenheit angezeigt.
Kann man das irgendwie noch anpassen?
ps, es werden nur die Temperaturen der Tages-Vorschau auf Englisch angezeigt, der aktuelle Wert ist in Zelsius.
Sebastian
80
am 14.09.2011 um 17:52 Uhr.Leider denkt Google, dass bei englischer Sprache auch Fahrenheit notwenig sei.
Einfach in PHP Fahrenheit in Celsius umrechnen: Temp[Celsius] = ( Temp[Fahrenheit] - 32 ) × 5 / 9
Christian
81
am 17.09.2011 um 21:47 Uhr.Hallo Sebastian,
Danke für deine Antwort,
leider kann ich fast kein PHP, könntest du mir sagen wo ich das genau einbauen müsste?
wäre sehr nett von dir, danke!
toni
82
am 19.10.2011 um 21:32 Uhr.@Uli.
Du musst zunächst die IP Adresse einem Ort zuordnen. Dazu gibt es geo-ip Tabellen und Dienste im Internet.
Anschließend übergibst du der Api den Ort.
absNoobalo
83
am 02.11.2011 um 16:27 Uhr.Hallo zusammen,
Erst mal danke für das script.
Hätte da aber einen Verbesserungvorschlag, uns zwar:
Für alle bei denen der Hoste "fopen" verbietet, bietet sich "curl" an.
Einfach an der Stelle von $api = ... ersetzen:
$ch = curl_init("http://www.google.com/ig/api?weather=".$station."&hl=".$sprache);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$example = curl_exec($ch);
curl_close($ch);
$api = simplexml_load_string(utf8_encode($example));
Gruss absNoobalo
Lena
84
am 14.11.2011 um 03:34 Uhr.Hallo,
bei mir geht seit einigen Wochen das Datum nicht mehr. Es ist immer der 01.01.1970 (Startdatum von Unix). Alle sonstigen Daten werden richtig ausgelesen.
Datum ging aber wochelang fehlerfrei.
Hat sich mal wieder was bei google geändert?
Lollo
85
am 22.11.2011 um 17:19 Uhr.also ich muss sage, das Script an sich arbeitet recht zuverlässig, hut ab.
aber es hat auch 2 gravierende Fehler.
1. es fragt dauerhaft bei google ab, was man aber unter allen umständen vermeiden sollte
2. obwohl der autor den utf8-encode einsetzt, wird die deutsche schreibweise dennoch ignoriert
ich hab das Script mal so angepasst, sodass beide fehler behoben sind.
1. um die dauerhafte abfrage bei google zu verhindern, löst man das mit einem eingabefeld, das zusätzlich
noch eine if abfrage macht. erst wenn das eingabefeld gefüllt ist, und der button geklickt wird, wird bei google
die abfrage gestartet.
2. gleich zu anfang des scripts den utf8 setzen, nicht mittendrin!
Weiterer Inhalt wurde an dieser Stelle entfernt.Lollo
86
am 22.11.2011 um 17:27 Uhr.PS.: Nachtrag
die gesuchte PLZ muss nun auch nicht mehr im script verankert werden. mit diesem script kann man nach allen PLZ suchen. wenn ihr genau hinseht, hab ich an mehreren stellen den string, wo die PLZ eingetragen wurde, mit dem eingabefeld verknüpft. das eingabe heisst $plz . genauso kann man das auch länderspezifisch machen. mit anderen worten: das script ist so ausgelegt, das weltweit abgefragt werden kann.
viel spass beim basteln ^^
Sebastian
87
am 24.11.2011 um 20:56 Uhr.Hallo Lollo,
vielen Dank für deine Anregung. Es geht in diesem Artikel um die Verwendung der Google Wetter API. Das angegebene Script ist lediglich eine Funktion, die in bereits vorhandene Programme integriert werden kann.
Viel eleganter als ein Formular ist das Caching der Wetterdaten, die die Google Weather API liefert. Wetterdaten also in eine Datenbank oder Datei schreiben und mit einem Zeitstempel versehen und diesen vor der nächsten Abfrage abgleichen.
PS: <font> sollte man schon lange nicht mehr benutzen ;-)
Daniel
88
am 28.12.2011 um 14:13 Uhr.Hallo Gemeinde/Genossen/Gleichgesinnte.
Wollte das Script auch benutzen. bekomme leider folgenden Fehler
Fatal error: Call to a member function attributes() on a non-object in /var/www/kunden/webs/XX-XXX/wetter.php on line 117
117 = $wetter[\'stadt\'] = $api->weather->forecast_information->city->attributes()->data;
Nutze ein Teil des Scriptes von \"absNoobalo\" da es mit \"file_get_contents\" nicht funzt auf unseren Server.
PHP Version is 5.2.6-1.
$ch = curl_init(\"http://www.google.com/ig/api?weather=\".$station.\"&hl=\".$sprache);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$example = curl_exec($ch);
curl_close($ch);
$api = simplexml_load_string(utf8_encode($example));
// Funktionsaufruf in Array
$wetter = website_wetter(\"10115\", \"Germany\");
Danke im Voraus für eure Hilfe!
Mayo
89
am 09.01.2012 um 12:53 Uhr.Hallo,
danke für das Skript. Und besonderen Dank für Post #6 für den Workaround mit den kyrillischen Buchstaben.
Um das Ding unter php4 zum Laufen zu kriegen, hab ich diese simplexml class verwendet:
http://www.phpkode.com/scripts/item/simplexml-for-php-/
Zusätzlich muss beim Schreiben der Cache Datei (unbedingt machen!) noch file_put_contents($file,$content) durch fwrite ersetzt werden:
if(strlen($content)>0) {
unlink($file);
$fcffd = fopen($file,\'w\');
fwrite($fcffd,$content);
fclose($fcffd);
}
Um die englischsprachige Ausgabe in Celsius zu bekommen einfach bei Sprache
$sprache=\'en_GB\'
angeben! Wird nur \"en\" angegeben, geht Google von US aus, notiert man explizit noch GB dahinter ist es für den Rest der Welt und alles wird metrisch.
Viele Grüsse!


