Facebook
Twitter
Google+
Kommentare
0

Mit Wetterdaten arbeiten: Yahoo Weather API

Yahoo bietet, ähnlich wie Google und wetter.com auch eine Wetter-API, allerdings ist diese etwas gewöhnungsbedürftig. Die API gibt einen RSS-Feed zurück, woraus man dann seine Informationen parsen kann. Früher konnte man einfach einen Suchbegriff (Ort oder Postleitzahl) nehmen und die folgende URL aufrufen:

http://weather.yahooapis.com/forecastrss?p=59302

Das geht mittlerweile nicht mehr, da Yahoo bei vielen seiner Dienste auf WOEID [WHERE-ON-EARTH-ID] umgestiegen ist. Die WOEID ist eine Zahl, die einen Ort beschreibt. Um diese WOEID zu bekommen schreibt Yahoo in seiner Weather-API-Beschreibung, dass man auf weather.yahoo.com gehen soll, dort das Land wählt und dann seine Stadt sucht. In der URL sieht man dann die WOEID, die man dann in die folgende URL einsetzt:

(u=c steht für deutsche Maßeinheiten: Grad Celsius und km/h, wenn man diesen Parameter wegläßt erhält man amerikanische Werte):

http://weather.yahooapis.com/forecastrss?w=12834995&u=c

Und erst dann erhält man die Vorhersage. Eine schöne Such-API bzw. eine Möglichkeit, nach einem Städtenamen per API zu suchen bietet Yahoo Weather nicht direkt, man kann aber den Umweg über Yahoo’s YQL gehen, wo man mit dem folgenden Query Geo Places, sprich Orte suchen kann:

http://query.yahooapis.com/v1/public/yql?q=select * from geo.places where text=”Deutschland 59302″&format=xml

Die Antwort enthält die gesuchte WOEID (und auch Latitude/Longitude Informationen).

Da sich die WOEID nicht ändert sollte man das Ergebnis unbedingt cachen, da YQL ein API-Call-Limit hat (das glaube ich irgendwo bei 100 Abfragen pro Stunde liegt).

Eine andere Möglichkeit ist die vollständige Nutzung von YQL und der forecast Tabelle. Die folgende URL enthält eine verschachtelte Abfrage, womit man direkt mit einer URL die Vorhersage bekommt:

http://query.yahooapis.com/v1/public/yql?q=select * from weather.forecast where location in (
select id from weather.search where query=”Oelde, germany”
)&format=xml&env=store://datatables.org/alltableswithkeys

Das Ergebnis präsentiert Wetterdaten, allerdings in mph und Fahrenheit:

Wer sich mit YQL und der Wetterabfrage beschäftigen will liest am besten diesen Artikel im Yahoo Developer Netzwerk.

Wie stellen wir das Ergebnis nun dar? Wir können natürlich, wie bei den beiden vorherigen Beispielen, die Daten abfragen, die interessanten Werte extrahieren und in einer Tabelle ausgeben, kein Problem. Doch hier möchte ich einen anderen Weg gehen und SimplePie verwenden, um folgende Ausgabe zu erzeugen:

Sieht toll aus, und ist schnell gemacht, hier der nötige Code:

<?
require("simplepie.inc");
require("simplepie_yahoo_weather.inc");

$code = "12834995";
$path = "http://weather.yahooapis.com/forecastrss?u=c&w=";

$feed = new SimplePie();
$feed->set_feed_url($path . $code);
$feed->set_item_class('SimplePie_Item_YWeather');
$feed->init();

function time2minuts($time)
{
    $minuts = 0;
    $atime = explode(" ", $time);
    if (strtolower($atime[1]) == "pm") {
        $minuts = 12 * 60;
    }
    $ttime = explode(":", $atime[0]);
    $minuts = $minuts + (int)$ttime[0] * 60 + (int)$ttime[1];
    return $minuts;
}

$weather = $feed->get_item(0);
$fore = $weather->get_forecasts();
$unit = $weather->get_units_temp();
$ampm = "n"; // night
$icon = $weather->get_condition_code();
// Calculamos la hora de Lima en minutos
$curday = 2 * 60 + time2minuts(date("g:i a"));
$iniday = time2minuts($weather->get_sunrise());
$endday = time2minuts($weather->get_sunset());

if ($curday > $iniday && $curday < $endday) {
    $ampm = "d"; // day
} ?>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Yahoo Weather</title>
    <style type="text/css">
    <!--
    body {
        font-family: "Trebuchet MS", Tahoma, Verdana;
        font-size: 12px;
        font-weight: normal;
        color: #777777;
        text-decoration: none;
        background-color: #FFFFFF;
    }
    #weather {
        width: 240px;
        height: 120px;
    }
    #current {
        width: 240px;
        height: 120px;
        text-align: right;
        color: #FFFFFF;
        font-weight: bold;
    }
    #current #temp {
        font-size: 24px;
        font-style: normal;
        padding-top: 40px;
        padding-right: 16px;
    }
    #current #fore {
        padding-right: 16px;
        font-size: 11px;
    }
    #current #city {
        padding-right: 16px;
    }
    -->
    </style>
</head>
<body>
    <div id="weather" style="background:url('icon<?php echo $ampm; ?>.png') no-repeat 40px 40px;">
        <div id="current"
             style="background:url('http://l.yimg.com/us.yimg.com/i/us/nws/weather/gr/<?php echo $icon . $ampm . ".png"; ?>') no-repeat 0px -10px;">
            <div id="temp"><?php echo $weather->get_temperature(); ?>&deg;<?php echo $unit; ?></div>
            <div id="fore"><?php echo $fore[0]->get_low() . "&deg;" . $unit; ?>
                - <?php echo $fore[0]->get_high() . "&deg;" . $unit; ?></div>
            <div id="city"><?php echo $weather->get_city() . ", " . $weather->get_country(); ?></div>
        </div>
    </div>
</body>
</html>

Den Code habe ich insgesamt von 3 Stellen: simplepie.inc , simplepie_yahoo_weather.inc und das schöne Layout incl. Hintergrundbild von hier.

Den Code incl. Bildchen und der beiden SimplePie Dateien habe ich auch nochmal gezippt für diejenigen, die es sich nicht manuell zusammensuchen wollen.

Also auch Yahoo bietet eine Menge Möglichkeiten, welche der drei APIs nun die beste ist hängt vom jeweiligen Einsatzzweck ab: Wie viele verschiedene Abfragen pro Monat werden gebraucht, sollen nur deutsche oder auch weltweite Wetterdaten angezeigt werden, soll eine separate Ortssuche mit dabei sein? So oder so sollte man sich auf jeden Fall bei intensiverem Gebrauch mit den Nutzungsbedingungen im Detail vertraut machen, damit wir auch in Zukunft diese kostenlosen Dienste nutzen können.

Über den Autor

PHP Gangsta

Der zweitgrößte deutsche, eher praxisorientierte PHP-Blog von Michael Kliewe veröffentlicht seit Mitte 2009 Artikel für Fortgeschrittene.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen